No están almacenando π con una precisión de punto flotante inusual. Están utilizando un valor incorrecto para π con doble precisión. Para aproximar 3.1415926536 en binario, se requieren al menos 38 bits:
3.14159265359922… > 11.001001000011111101101010100010001001
Observe que 2 ^ -36 es aproximadamente 1.5e-11, que coincide con el 99 final. Flotante de doble precisión punto tiene un significado de 52 bits. Para evaluar cos(pi/2)
como -5e-12, la única otra opción posible sería un tipo de 48 bits, lo que sería muy extraño.
Cerca de 0 y π, donde la derivada es casi cero, cos (θ) no se puede calcular con mucha precisión:
cos(3.1415926536) ≈ -0.999999999999999999999947911
Eso difiere de -1 en aproximadamente 5.2e-23, que es más pequeño que ε para double
, por lo que cos(3.1415926536)
se calcula como exactamente -1 ... lo cual es incorrecto.
Cerca de ± π / 2, la derivada [ -sin (θ) ] es casi ± 1, por lo que el error en la entrada se convierte en la salida.
cos(1.57079632679961) ≈ -4.71338076867830836e-12
cos(1.57079632679962) ≈ -4.72338076867830836e-12
cos(1.57079632680000) ≈ -5.10338076867830836e-12
Resulta que tengo una calculadora de TI que muestra un dígito menos y calcula cos(π/2)
como -5.2e-12. Sin embargo, es muy diferente electrónicamente y fue diseñado para dar un valor exacto para cos(90°)
.
Supongo que en Spotlight, cos(pi/2)
se calcula mediante la recuperación de un valor para π, conversión a una cadena decimal , que se almacena como el valor binario (exacto, racional) 11.0010010000111111011010101010001000100101010111111 (o 10000), dividiendo por 2, y luego esencialmente restando eso del valor verdadero de π / 2. Debería averiguar si cos(pi/2 + cos(pi/2))
está más cerca de cero (podría ser -2.2e-35).
La multiplicación por una potencia de dos debe afectar solo al exponente, no al significado. Podría ser posible determinar cómo se aplica el redondeo mediante la reducción a la mitad o la duplicación.