Ich habe eine Vektorklasse (2D mathematischer Vektor) mit float
s als seine Komponenten.Verwenden Sie doppelt so lange wie möglich vor dem Gießen zu schweben?
Für einige Zwischenberechnungen habe ich die Wahl, Doppel zu verwenden. Soll ich die doppelte Zwischenpräzision so lange wie möglich verwenden, nur Gießen, um am Ende zu schweben, oder ist es besser, so bald wie möglich irgendwelche Doppel zu schweben?
Zum Beispiel, hier sind zwei mögliche Implementierungen der Vektornormierung.
Erstens halten die Doppel für alle Berechnungen:
public class Vector2f {
private float x;
private float y;
....
public Vector2f normalize() {
double length = Math.sqrt((x * x) + (y * y));
return new Vector2f(
(float) (x/length),
(float) (y/length)
);
}
}
Zweitens Umwandlung sofort zu schweben:
public Vector2f normalize() {
float length = (float) Math.sqrt((x * x) + (y * y));
return new Vector2f(
x/length,
y/length
);
}
Im Allgemeinen ist es immer besser, die Präzision so lange wie möglich beizubehalten, besonders wenn Ihre Werte sehr klein sind/nahe bei Null liegen. –
Ich denke, es hängt von der Anwendung und den Werten ab, die Sie haben. Beachten Sie jedoch, dass die Leistung unter konstanten Conversions von Float zu Double und Back leiden kann. Sie können nur entscheiden, was für Ihre Anwendung besser ist, indem Sie beide ausprobieren und prüfen, ob die zweite Version gut genug ist. –
Nicht verwandt, aber beachten Sie, dass Sie, wenn Sie weiterhin double verwenden, tun können: 'double factor = 1.0/Math.sqrt ((x * x) + (y * y)); ... neues Vector2f (x * Faktor, y * Faktor); '. –