/rant/ schrieb:
Hallo,
Ich habe folgende Frage, welche beim systematischen Unit Testing plötzlich relevant geworden ist: Wenn ich Gleitkommazahlen auf Gleichheit testen will, gibt es spezielle Funktionen, welche dies mit einer Angabe Epsilon für die erlaubte Abweichung tun. Was für einen Wert soll man aber für Epsilon nehmen? Gibt es irgend eine gute Konstante hierfür? epsilon von numeric_limits ist wohl nicht gut?
Ich programmiere nicht für die Raumfahrt und wende Operationen nicht 10'000-fach an, aber irgendwie widerstrebt es mir, einfach überall diese Magic Numbers à la 10e-7 zu schreiben
Setz Dein Epsilon so klein wie Möglich.
Steig ruhig mal mit e-50 ins rennen und guck, was passiert.
Kannst Du das Epsilon halten, ist doch alles super. Wenn nicht, musst Du überlegen, ob die größere Unschärfe bei Gleichheit noch zu sicheren Ergebnissen führt.
Dein Epsilon ist abhängig von den Daten, die verarbeitest und natürlich ihrem Maßstab. Möchtest Du Millimetergenau arbeiten, ist das Epsilon abhängig von der Frage, ob Du in Metern, Zentimetern oder Millimetern misst.
Weiterhin empfehle ich Dir, das Epsilon bedarfsgerecht festzulegen. So brauchst du für die Übereinstimmung von Strecken (z.B. 3D-Punkte) eventuell ein anderes Epsilon als für die Übereinstimmung von Winkeln.
Ich benutze dafür eine Klasse Double, die Vergleiche automatisch regelt. Nimm ein Template, leite die Datentypen ab und gib jedem Datentyp ein entsprechendes Epsilon mit.
Keine Raumfahrt... nur CAD.