Mit ziemlich kleinen/großen Zahlen rechnen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Fevenius
Beiträge: 6
Registriert: So 6. Okt 2013, 14:07

Mit ziemlich kleinen/großen Zahlen rechnen

Beitrag von Fevenius »

Hallo,
ich stehe vor dem großen Problem, in Delphi (Lazarus) mit sehr großen Zahlen (5,974 · 10^24) und sehr kleinen Zahlen (6,673 · 10-11) arbeiten zu müssen. Ich habe mir schon etliche Threads durchgelesen, und auch die mir erscheinende Fehlermeldung 'SIGFPE' mehrmals gegoogelt, dabei ist nicht viel rausgekommen. Es geht dabei um folgenden Code:

Code: Alles auswählen

function THauptformular.RechneGKraft():Currency;
var y:Currency;
 var m:Extended;
  var r:QWord;
begin
  y := 6.673 * 0.01;
  r := 6371000000 + Round(aHoehe);
  m := 5.974 * (10 ** 15);
  result := y*m/(r ** 2);
end;  
Ich habe es auch schon mit etlichen anderen Datentypen versucht, doch immer kommt eine Fehlermeldung [meistens folegende]:
Projekt >>.<< hat Exception-Klasse >>External:SIGFPE<< ausgelöst.
In Zeile 185: >>result := y*m/(r ** 2); <<
.
Wie ich festgestellt habe, ist es keine Speicherverletzung durch Initial. einer der vorigen Variablen.
Zur Perfomance: Das Programm errechnet sehr viele Werte (5*(540/0.1)), sodass die Lösung nicht zu sehr auf die Perfomance gehen sollte :).
Wie kann man das Problem lösen?
Grüße Patrick

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Mit ziemlich kleinen/großen Zahlen rechnen

Beitrag von wp_xyz »

Da geht einiges durcheinander: Was hat eine Kraft mit Currency zu tun? Warum ist r ein Integer-Typ? Setze alle Variablen und auch das Funktionsergebnis auf Extended. In dem Wertebereich 1.9E-4932 ... 1.1E4932 sollte diese einfache Rechnung doch unterzubringen sein, wahrscheinlich reicht sogar Double (5.0E-324 ... 1.7E308).

Und das 10**15 schreibst du besser als 1E15, dann muss nichts mehr gerechnet werden. Und das r ** 2 ist dasselbe wie sqr(r) oder r*r, das wahrscheinlich schneller berechnet wird.

Fevenius
Beiträge: 6
Registriert: So 6. Okt 2013, 14:07

Re: Mit ziemlich kleinen/großen Zahlen rechnen

Beitrag von Fevenius »

Habe wie geschrieben sehr viele Datentypen ausprobiert, doch es erscheint immer noch der selbe Fehler.

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Mit ziemlich kleinen/großen Zahlen rechnen

Beitrag von wp_xyz »

Welchen Wert (und Datentyp) hat denn aHohe, damit ich das hier nachvollziehen kann?

Fevenius
Beiträge: 6
Registriert: So 6. Okt 2013, 14:07

Re: Mit ziemlich kleinen/großen Zahlen rechnen

Beitrag von Fevenius »

AHoehe ist double, wird durch round() aber sowieso in int umgewandelt

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Mit ziemlich kleinen/großen Zahlen rechnen

Beitrag von wp_xyz »

Ja, aber was ist der Wert?

Fevenius
Beiträge: 6
Registriert: So 6. Okt 2013, 14:07

Re: Mit ziemlich kleinen/großen Zahlen rechnen

Beitrag von Fevenius »

Der ändert sich laufend (for-schleife) aber die Formel ist:

Code: Alles auswählen

aHoehe := aHoehe + aVel * dt
dt ~ 0,1 [double]
aVel = Geschwindigkeit [double]
Dank dir [alle Variablen als Extended deklarieren] kommt nun keine Fehlermeldung!
Danke!

Antworten