Verwenden von Java auf einem Windows 7-PC (nicht sicher, ob das wichtig ist) und Aufrufen von Math.cos() auf Werten, die stattdessen 0 (wie Pi/2) zurückgeben sollten gibt kleine Werte zurück, aber kleine Werte, die, wenn ich nicht falsch verstanden habe, viel mehr als 1 ul von Null entfernt sind.Java Math.cos() Methode gibt 0 nicht zurück, wenn erwartet
Math.cos(Math.PI/2) = 6.123233995736766E-17
Math.ulp(Math.cos(Math.PI/2)) = 1.232595164407831E-32
Ist dies in der Tat innerhalb von 1 ULP und ich bin einfach verwirrt? Und wäre dies eine akzeptable Wrapper-Methode, um diese kleine Ungenauigkeit zu beheben?
public static double cos(double a){
double temp = Math.abs(a % Math.PI);
if(temp == Math.PI/2)
return 0;
return Math.cos(a);
}
@ dimo414 : Zuerst ein Kommentar zu Ihrer "nicht sicher, ob das zählt". Das Verhalten der meisten mathematischen Operationen ist nicht genau definiert, daher können Betriebssystem und CPU eine Rolle spielen. Wenn Sie eine mathematische Operation haben wollen, deren Verhalten streng definiert ist (die leichter zu beheben sind), verwenden Sie StrictMath, nicht Math (natürlich sollten StrictMath-Operationen wahrscheinlich langsamer sein, da sie nicht die hardwarebeschleunigte Operation in der CPU verwenden können). – SyntaxT3rr0r
Math.cos() ist nur ein Wrapper für StrictMath.cos(), die selbst eine native Funktion ist. – dimo414