Utilizzo di Java su un PC Windows 7 (non è sicuro se ciò è importante) e chiamata Math.cos() su valori che dovrebbero restituire 0 (come pi/2) anziché restituisce piccoli valori, ma valori piccoli che, a meno di non fraintendermi, sono molto più grandi di 1 ulp off da zero.Java Math.cos() Il metodo non restituisce 0 quando previsto
Math.cos(Math.PI/2) = 6.123233995736766E-17
Math.ulp(Math.cos(Math.PI/2)) = 1.232595164407831E-32
È questo, infatti, all'interno di 1 ULP e sto semplicemente confuso? E questo sarebbe un metodo wrapper accettabile per risolvere questa inesattezza minore?
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 : Innanzitutto un commento sul tuo "non so se questo è importante". Il comportamento della maggior parte delle operazioni matematiche non è definito con precisione in modo che il sistema operativo e la CPU possano avere importanza. Se si desidera un'operazione matematica il cui comportamento è strettamente definito (che probabilmente è più semplice da risolvere) si desidera utilizzare StrictMath, non Math (ovviamente le operazioni StrictMath devono essere più lente perché non possono utilizzare l'operazione hardware accelerata disponibile nella CPU). – SyntaxT3rr0r
Math.cos() è solo un wrapper per StrictMath.cos(), che è a sua volta una funzione nativa. – dimo414