Autor Beitrag
fidionael
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 232

Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: Di 25.04.06 12:05 

_________________
Ein Nutzer der Ecke ;-)
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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):
ausblenden 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
  {etc.}
  end;

Alternativ kannst du auch einfach sagen:
ausblenden 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 232

Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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