Angenommen, ich schreibe eine Physik-Engine mit Kollisionserkennung, die Floats verwendet. Eine Methode könnte sein, zu prüfen, ob sich zwei Physikobjekte schneiden oder berühren.Schreiben aussagekräftiger Komponententests für Code mit Gleitkomma-Ungenauigkeiten (z. B. Kollisionserkennung)
class PhysicsObject {
Vector3f position;
[...]
public void isIntersecting(PhysicsObject otherObject) {
boolean isTouchingOrIntersecting = [do calculations];
return isTouchingOrIntersecting;
}
}
Für die Simulation selbst, die Gleitkommagenauigkeit (auch bei Schwimmern verwendet wird) ist gut genug, da alle Ungenauigkeiten nicht sichtbar/bemerkbar sein wird (und sofort in der nächsten Simulationsschritt korrigiert).
Aber wie soll ich meine Komponententests schreiben, besonders für die Grenzfälle? Ich kann Tests mit zwei weit entfernten Objekten schreiben und zwei Objekte, die sich deutlich schneiden, aber wie wäre es, wenn sie sich genau berühren würden? Abhängig von den Float-Werten kann die Methode je nach Art der externen Bedingung (Compiler, Architektur usw.) True oder False zurückgeben.
Oder sollte ich sagen, dass es nicht wichtig ist, welches Ergebnis die Methode in diesem Grenzfall liefert und es daher keinen Sinn macht, einen Unit Test für diesen Fall zu schreiben?
Wenn der Rückgabewert der Methode wieder ein float ist, ist es klar, dass ich relative Fehler und epsilons verwenden sollte. Aber ich benutze dieses Kollisionserkennungsproblem als ein Beispiel für die ganze Klasse ähnlicher Probleme, wenn Gleitkommawerte in ein "genaues" (boolesches, ganzzahliges) Ergebnis übersetzt werden, und wie man diese (im Kontext von 3D-Grafik/Physik) testet Code).