| Autor |
Beitrag |
fidionael
      
Beiträge: 232
Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
|
Verfasst: Di 25.04.06 09:47
Hallo,
ich möchte im Rahmen eines Schulprojektes (Physik) ein Programm schreiben, dass einen durch Gravitation verursachten Sturz eines beliebigen Teilchens in die Sonne simuliert.
Hierfür müssen Berechnungen durchgeführt werden, bei welchen die Zahlen teilweise über 120 Stellen lang sind. Dennoch kann ich mich nicht z. B. einfach auf die wissenschaftliche Schreibweise einschießen, da die Ergebnisse protokolliert werden und möglichst exakt sein sollen (bei wiss. Schreibw. wird ja schon nach der 10. Stelle oder so gerundet).
Das das Programm unendlich langsam sein wird ist mir klar, aber Präzision geht der Geschwindigkeit in diesem Fall einfach vor.
Kann ich das irgendwie realisieren? Ich würde nur ungern Fremdkomponenten benutzen.
Mfg
|
|
Spaceguide
      
Beiträge: 552
(D3/D7/D8) Prof.
|
Verfasst: Di 25.04.06 11:10
120 Stellen, das kann ich mir nicht vorstellen. Sowas ist mir während des Physik-LKs und Physik-Vorlesung an der Uni nicht untergekommen. Für die meisten Berechnungen dürfte wirklich der Typ Extended ausreichen.
|
|
Martin1966
      
Beiträge: 1068
Win 2000, Win XP
Delphi 7, Delphi 2005
|
Verfasst: Di 25.04.06 12:05
_________________ Ein Nutzer der Ecke
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Di 25.04.06 12:42
Hallo,
120 Stellen ist ja >10^100=1 googol eine Zahl die nicht in der unserem Universum erreicht wird(Geschaetzte obere Schranke der Anzahl der Quarks und was da kreucht und fleucht).
Ein Elektron wiegt 9,10938188(72)·10-31 kg , die Sonne 1,989·10^30 kg
Das Gravitationsgestz ist doch multiplikativ, das ist mit Fliesskommazahlen immer sehr genau.
Du hast vielleicht eher das Problem der Ungenauigkeit bei extrem vielen Additionen Rundungfehler klein zu halten.
Eine Geschwindigkeitsaenderung von 1e-19 m/s bei v= 10 m/s wird schon nicht mehr addiert.
Mit Der unit von DFF ist ja Dein problem wohl geloest, es kann auch mit Float umgehen.
Du kannst aber die Beschleunigung zweimal integrieren und die Geschwindigkeit,Strecke erhalten.
K = gamma*m2 (Koerper m1 wird betrachtet)
a(r) = K*1/r^2+C0 ->v(r)=-K/2*r^-1+C0*r+C1->s(r)=-K/2*ln(r)+0.5*C0*r*r+C1*r+C2
Gruss Horst
|
|
nullplan001
      
Beiträge: 212
Win 2000 Professional, Debian Linux 4.0 (Etch,Stable)
Pascal (FreePascal 2.0.2, TurboPascal 7.0), C(++) (G++/GCC 3.4.2 + MinGW), Java (JDK 1.5.0_07), PHP (PHP 5.1.4)
|
Verfasst: Di 25.04.06 14:37
Zusätzlich kannst du auch mal Assembler bemühen und dann so Zahlenbereiche wie int128 abdecken. Gibt's bei Delphi nicht, sind immerhin 4 DWords. Da musst du dann ganz kompliziert rechnen, z.B. subtrahieren (da fällt mir jetzt der Befehl ein):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| asm mov eax,[minuend_kleinstes_dword] mov ebx,[subtrahend_kleinstes_dword] sub ebx,eax mov [ergebnis_kleinstes_dword],ebx mov eax,[minuend_zweites_dword] mov ebx,[subtrahend_zweites_dword] sbb ebx,eax mov [ergebnis_zweites_dword],ebx end; |
Alternativ kannst du auch einfach sagen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| {$MMX+}
var Minuend, Subtrahend, Ergebnis: Array[1..4] of longword; begin Ergebnis := Minuend - Subtrahend; end. |
OK, ungleich einfacher. Und jetzt sagst du sicher: Das sind aber Integers ich brauch aber Kommas. Dann nimm doch Festkommazahlen. Nicht zu schwer. Du sagst einfach: Die Zahlen haben jetzt 2 Nachkommastellen. Dann nimmst du jeden Messwert, den du eintragen willst, mit 100 mal und schneidest den Rest ab oder rundest (ist ja wurscht, du brauchst jedenfalls Ints), dann rechnest du immer schön weiter, und am Ende teilst du wieder durch 100. Also z.B.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure writeint128(var variable:array[1..4] of longword); var i,r:integer; begin r := variable[4] mod 100; writeln((variable[1] shl 24 + variable[2] shl 16 + variable[3] shl 8 + variable[4]) div 100, ',', r); end; |
OK, da könnte Delphi rummeckern von wegen und Zu große Zahlen. Wenn nicht, gut, wenn, dann Pech gehabt. Ach ja, wenn Delphi MMX nicht kennt, nimm FreePascal. Konsolenanwendung ist zwar nicht so schön wie Fensteranwendung, aber wat mut, dat mut. Und wenn du fragst, wie ich auf Festkommazahlen gekommen bin: Fließkommazahlen gibt's in Assembler nur mit 80x87. Und von dem kenn ich die Befehle nicht.
Tschö,
nullplan
_________________ Ich fahr' nicht selber, weil ich festgestellt habe: ich fahre zu emotional. Bin 180 gefahren wo 30 erlaubt war... -- Jürgen von der Lippe
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Di 25.04.06 15:23
Hallo,
ich dachte MMX sind64 Bit breit und XMM(SSE1..?) sind 128 Bit.
Das Problem sind ja hier auch die Fliesskommazahlen.
Natuerlich kann mit Integer-Rechnen, was aber ein unnoetiger Aufwand ist, insbesondere, da Divisionen,Multiplikationen (Karatsuba muesste reichen) die Rechenzeiten bestimmen werden, was mit Exponent(da reichen sicherlich 32 bit integer),Mantisse Darstellung ja einfacher ist.
Ersteinmal die Berechnungen ans laufen bekommen, dann schneller macher.
Es waere interessant, warum hier 120 Stellen gebraucht werden, das scheint doch das eigentlich Abwegige zu sein
Gruss Horst
|
|
nullplan001
      
Beiträge: 212
Win 2000 Professional, Debian Linux 4.0 (Etch,Stable)
Pascal (FreePascal 2.0.2, TurboPascal 7.0), C(++) (G++/GCC 3.4.2 + MinGW), Java (JDK 1.5.0_07), PHP (PHP 5.1.4)
|
Verfasst: Mi 26.04.06 12:28
Hmm... 120 Stellen... So viel Geld gibt es nicht mal in Yen angegeben auf der ganzen Welt. Wie heist denn eine 1 mit 119 Nullen dran? Unendlich, oder? Kann aber sein, dass er da aus Versehen bei der Zahl eine 120-Stellige Zahl dazumultipliziert hat... ode er wollte 12-stellig schreiben, was aufgrund eines Tippfehlers misslang. Und das mit MMX: Äh.. ich hab das in den FreePascal-Docs gelesen. Da waren es aber nicht longwords sondern integers, also words (mit Vorzeichen, OK, ist ja aber hier fast egal, oder?) Aber es waren eindeutig 4. Also ein Array[1..4].
Tschö,
nullplan
_________________ Ich fahr' nicht selber, weil ich festgestellt habe: ich fahre zu emotional. Bin 180 gefahren wo 30 erlaubt war... -- Jürgen von der Lippe
|
|
fidionael 
      
Beiträge: 232
Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
|
Verfasst: Do 27.04.06 08:07
Vielen Dank - tut mir Leid, dass ich mit meinen 120 Stellen so ein Durcheinander hier verursacht habe *g* Extended reicht jedenfalls für meine Belange 
|
|
nullplan001
      
Beiträge: 212
Win 2000 Professional, Debian Linux 4.0 (Etch,Stable)
Pascal (FreePascal 2.0.2, TurboPascal 7.0), C(++) (G++/GCC 3.4.2 + MinGW), Java (JDK 1.5.0_07), PHP (PHP 5.1.4)
|
Verfasst: Do 27.04.06 15:42
Hi all,
ich weis es jetzt, wie eine 1 mit 119 Nullen dran heist: 100 Trillionen Googols, weil: ein Googol ist 10^100. Eine Trillion ist 10^18. 10^18 * 10^100 = 10^118. Und 100 sind 10^2, also ist 10^18 * 10^2 * 10^100 = 10^120. Fertig.
Mann, mann, mann, was ist denn 100 Trillionen Googols groß???
Tschö,
nullplan
P.S.: Also doch ein Tippfehler. Naja, für 12 Stellen sollte extended genügen.
_________________ Ich fahr' nicht selber, weil ich festgestellt habe: ich fahre zu emotional. Bin 180 gefahren wo 30 erlaubt war... -- Jürgen von der Lippe
|
|
|