Como sabrá, Spotlight puede hacer matemáticas simples. Por ejemplo, escribir cos(pi)
dará como resultado -1
, como es de esperar. Acabo de escribir cos(pi/2)
, que debería ser 0 pero me dio -5e-12
.
Sí, probablemente se deba a un error de redondeo, pero vamos: cos(pi/2)
! En mi opinión, eso claramente parece un error. ¿Qué piensas?
Se debe a la falta de precisión de pi y a la falta general de precisión en el sistema integrado.
pi = 3.1415926536
pi/2 = 1.5707963268
cos(1.5707963268) = -5.103412e-12
FYI = 5.103412e-12 = 0.000000000005103412 ~ 0
Acerca de la precisión general del sistema:
3.141592653589793238462643383 = 3.1415926536
En Python obtenemos lo siguiente:
>>> float("3.141592653589793238462643383")
3.141592653589793
Como podemos ver, hay un problema con la precisión, ya que ni siquiera coincide con la representación flotante.
No están almacenando π con una precisión inusual de coma flotante. Están usando 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. El punto flotante de doble precisión tiene una significancia 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 exactamente como -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
Tengo una calculadora 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 de cos(90°)
.
Supongo que en Spotlight, cos(pi/2)
se calcula recuperando un valor para π, convirtiéndolo en una cadena decimal , almacenándolo como el valor binario (exacto, racional) 11.00100100001111110110101010001000100100001101101111 (o 10000), dividiendo por 2, y luego esencialmente restándolo de el verdadero valor 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 debería afectar solo al exponente, no al significado. Podría ser posible determinar cómo se aplica el redondeo reduciendo a la mitad o duplicando repetidamente.
Es un error que se puede reproducir en 10.9.2, y un error de redondeo de punto flotante como ese es bastante típico.
Es el valor de pi que se está manejando sin suficiente precisión si tuviera que adivinar.
Me dirigiría a https://developer.apple.com/bug-reporting/ si desea ver el aparato de corrección de errores de Apple en acción.
cos(acos(0))
. acos(0)
de hecho, devuelve un valor de π/2 tan preciso como se puede almacenar con doble precisión, y el coseno de esto es lo suficientemente cercano a cero como para que Spotlight solo muestre 0
.cos(2*acos(0)*0.5)
devuelve un número de orden 10^-10
. Entonces no es porque la constante π no sea lo suficientemente precisa. No puedo explicar este resultado: es demasiado impreciso para precisión doble y demasiado preciso para precisión simple.De las otras respuestas y comentarios queda claro lo siguiente:
El hecho de que obtenga un resultado distinto de cero NO es un error, incluso con una implementación perfecta del software, se encontraría con los límites de los cálculos de coma flotante. Sin embargo, el error del orden de 10^-12 es realmente grande.
Esto NO tiene la culpa de la inexactitud de los números de punto flotante. El resultado que obtienes es simplemente este:
cos(1.5707963268)
Eso se puede validar usando cualquier paquete de software alternativo. Si tuviera que evaluar cos(pi/2)
en uno de esos paquetes, definitivamente obtendrá un resultado mucho más cercano a cero que 10 ^ -12.
Para concluir veo dos posibles limitaciones, una de las cuales debe aplicarse:
Tal vez alguien con acceso al software pueda validar cuál de estos se aplica.
Actualización Como se menciona en el comentario, el problema parece ser la precisión de la constante pi
.
Teniendo en cuenta que -5e-12
es un número muy pequeño, se trata de un error de redondeo.
Creo que es la consecuencia de que Spotlight muestre más decimales de los que se usan en la definición de la pi
constante o la serie infinita utilizada para calcular funciones trigonométricas.
Navin
poitroae
harryg
pi
en sí mismo estaría codificado (ya que obtienes -1 paracos(pi)
), pero tan pronto como lo manipulas, obtienes un número de coma flotante, que tiene una precisión limitada. OSX no codificapi/2
,pi/4
etc., en realidad hace la operación.CodesInChaos
x.yzE-50
. No hay buenas soluciones para esto, salvo un sistema de álgebra computacional. Para cualquier programa basado en coma flotante, es fácil encontrar casos en los que debería devolver cero, pero no lo hace. El error aquí es un poco más grande de lo que esperaría dedouble
, pero no mucho.harryg
CodesInChaos
0.1
exactamente. precisamente, pero no es útil para números irracionales como pi, que no se pueden representar exactamente en binario o decimal.harryg
harryg
irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
Thorbjorn Ravn Andersen