El método Java Math.cos () no devuelve 0 cuando se esperaba

Usar Java en una PC con Windows 7 (no estoy seguro si eso importa) y llamar a Math.cos () en valores que deberían devolver 0 (como pi / 2) en su lugar devuelve valores pequeños, pero valores pequeños que, a menos que esté malentendido, son mucho mayor que 1 ulp fuera de cero.

Math.cos(Math.PI/2) = 6.123233995736766E-17
Math.ulp(Math.cos(Math.PI/2)) = 1.232595164407831E-32

¿Es esto de hecho dentro de 1 ulp y simplemente estoy confundido? ¿Y este sería un método envolvente aceptable para resolver esta inexactitud menor?

public static double cos(double a){
    double temp = Math.abs(a % Math.PI);
    if(temp == Math.PI/2)
        return 0;
    return Math.cos(a);
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta