Usar Java en una PC con Windows 7 (no estoy seguro si eso importa) y llamar a Math.cos() con valores que deberían devolver 0 (como pi/2) devuelve valores pequeños, pero valores pequeños que, a menos que no lo entiendan, son mucho mayores que 1 ulp de cero.Java Math.cos() El método no devuelve 0 cuando se esperaba
Math.cos(Math.PI/2) = 6.123233995736766E-17
Math.ulp(Math.cos(Math.PI/2)) = 1.232595164407831E-32
¿Esto es, de hecho, dentro de 1 ulp y estoy simplemente confundido? ¿Y sería este un método de envoltura aceptable para resolver esta pequeña inexactitud?
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 : Primero un comentario sobre su "no estoy seguro si eso importa". El comportamiento de la mayoría de las operaciones matemáticas no está definido con precisión, por lo que el sistema operativo y la CPU pueden ser importantes. Si desea una operación matemática cuyo comportamiento esté estrictamente definido (que posiblemente sea más fácil de solucionar), debe usar StrictMath, no matemática (por supuesto, las operaciones StrictMath probablemente serán más lentas porque no pueden usar la operación acelerada de hardware disponible en la CPU). – SyntaxT3rr0r
Math.cos() es solo un contenedor para StrictMath.cos(), que a su vez es una función nativa. – dimo414