Einzelnen Beitrag anzeigen

Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Koordinatensystem addieren.

  Alt 22. Mär 2020, 20:47
@Frühlingsrolle.
Nur ein kleiner Hinweis zu Deinen Routinen: Man darf eine Fließkommazahl wie Double, Extended nie auf Gleichheit prüfen, weil dies wider Erwartung (fast) nie zutrifft:
Delphi-Quellcode:
function TVec3.IsPerpendicular: Boolean;
...
   bRes := Scalar(FX, FY, FZ) = 0.0; // Falsch!
...
Der Grund dafür sind einerseits arithmetische Rundungsfehler in vorangegangenen Berechnungen. Darüber hinaus ist es generell nicht möglich, unendlich viele reelle Zahlen mit einer endlichen Anzahl von Bits (Double: 64 Bits; Extended: 80 Bits) darzustellen. Allein bei der binären Codierung der Dezimalzahlen entstehen daher unvermeidbare Rundungsfehler.
Man sollte daher stets einen unscharfen Fließkomma-Vergleich machen. Man kann dazu z. B. die vorhandene Math-Funktion
  Math.SameValue(Ist, Soll, Abs_Toleranz) verwenden.
Delphi-Quellcode:
CONST
  Gleich_Toleranz = 1E-15; // für Double

function TVec3.IsPerpendicular: Boolean;
...
   bRes := SameValue(Scalar(FX, FY, FZ), 0.0, Gleich_Toleranz);
...
Empfehlenswert wäre auch die durchgängige Benutzung des Typs Extended anstelle von Double. Ich persönlich benutze für meine – zugegeben recht umfangreichen Berechnungen – oft die Multipräzisions-Arithmetik-Bibliothek von Wolfgang Ehrhardt mit 100 ... 200 Stellen (320 … 640 Bits), wo ich nach erfolgten Berechnungen die Rechenergebnisse zu Extended konvertiere.
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat