¿Por qué Spotlight da un valor incorrecto para `cos (pi / 2)`?

8

Como ya sabrás, Spotlight puede hacer matemáticas simples. Por ejemplo, la escritura cos(pi)resultará -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?

Poitroae
fuente
1
cos (x) es una función trascendental. A menos que codifiquen valores para pi, pi / 2, etc., debe esperar algún error.
Navin
@Navin en realidad espero que codifiquen estos valores ya que son muy importantes.
poitroae
1
pien sí estaría codificado (a medida que obtienes -1 cos(pi)) pero tan pronto como lo manipulas obtienes un número de coma flotante, que tiene una precisión limitada. OSX no codifica pi/2, pi/4etc., en realidad hace la operación.
harryg
2
@harryg Si bien hay errores de redondeo que se pueden resolver cambiando a decimal, este no es uno de ellos. Decimal es útil si desea representar 0.1exactamente. precisamente, pero no es útil para números irracionales como pi que no pueden representarse exactamente en binario o decimal.
CodesInChaos
1
Como referencia, en Ruby:irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
harryg

Respuestas:

13

Se debe a la falta de precisión de pi y a la falta general de precisión en el sistema incorporado.

pi = 3.1415926536

pi/2 = 1.5707963268 

cos(1.5707963268) = -5.103412e-12

FYI =  5.103412e-12 = 0.000000000005103412 ~ 0 


Sobre 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.

Matthieu Riegler
fuente
Se debe a la falta de precisión, pero un error de esta magnitud no se puede culpar a los números de coma flotante.
Dennis Jaheruddin
2
Probablemente sea más una falta de precisión con el valor pi.
Matthieu Riegler
5

No almacenan π 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. El punto flotante de doble precisión 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 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 para 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 restando eso de El verdadero valor de π / 2. Debe 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. Es posible determinar cómo se aplica el redondeo mediante la reducción a la mitad o la duplicación.

usuario130144
fuente
No hay nada malo con Markdown: MathJax solo está habilitado en sitios relacionados con Math, no en todo SE.
grg
1
cos (pi / 2 + cos (pi / 2)) se muestra como 0 exactamente.
Nick Matteo
4

Es un error que se puede reproducir en 10.9.2, y un error de redondeo de coma flotante como este es bastante típico.

Es el valor de pi que se maneja sin suficiente precisión si tuviera que adivinar.

  • cos (999999 * pi) no tiene un error
  • cos ((999999 + 1) * pi) tiene un error, probablemente redondeando

Me dirijo a https://developer.apple.com/bug-reporting/ si quieres ver el aparato de reparación de errores de Apple en acción.

bmike
fuente
55
¿Es un error realmente? ¿Cuál debería ser la precisión en tal operación?
Édouard
No soy un desarrollador registrado, pero le agradecería que nos lo envíe.
poitroae
44
@ Édouard Se puede considerar que un error si el usuario se ha llevado a esperar una cierta capacidad para las matemáticas simbólicas. ¡Cualquier sistema de álgebra computacional (CAS) sabrá por supuesto que cos (π / 2) = 0 exactamente! Por otro lado, no es razonable esperar que Spotlight contenga un CAS. Y en el ámbito de la aritmética de coma flotante, se esperan resultados como los informes OP. Cualquier informe de error podría etiquetarse mejor como una solicitud de función, tal vez.
Harald Hanche-Olsen
1
@ Édouard bmike es, de hecho, correcto que esto es un error y no solo un error de redondeo. La precisión esperada de tal operación, dada la aritmética estándar de doble precisión, es aproximadamente 10 ^ -16, no 10 ^ -12. Puede probarlo usted mismo escribiendo un programa en su idioma favorito que aproveche el soporte de coma flotante de la CPU, haga el cálculo y examine el patrón de bits del resultado. Como dice bmike, la razón probable es que el valor π que usa Spotlight no está definido con suficiente precisión.
Szabolcs
2
Algo raro está sucediendo aquí. 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 doble precisión y demasiado preciso para precisión simple.
Szabolcs
4

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á con los límites de los cálculos de coma flotante. Sin embargo, el error en el orden de 10 ^ -12 es realmente grande.

Esto NO tiene la culpa de la inexactitud de los números de coma flotante. El resultado que obtienes es solo esto:

cos(1.5707963268)

Eso se puede validar utilizando cualquier paquete de software alternativo. Si tuviera que evaluar cos(pi/2)en uno de esos paquetes, definitivamente obtendría un resultado mucho más cercano a cero que 10 ^ -12.

Para concluir, veo dos posibles limitaciones, una de las cuales debe aplicarse:

  1. Pi no se almacena con suficiente precisión, o al menos pi / 2 da como resultado una precisión insuficiente
  2. Cos simplemente toma una precisión insuficiente como entrada

Quizás alguien con acceso al software pueda validar cuál de estos aplica.

Actualización Como se mencionó en el comentario, el problema parece ser la precisión de la constante pi.

Dennis Jaheruddin
fuente
Esto es raro 1.5707963268 es el resultado que Spotlight le brinda cuando calcula pi / 2. Después de algunos intentos simples, parece que Spotlight muestra 10 dígitos significativos para el número inferior a 1 y 11 para los números superiores a 1. Pero, ¿por qué extraña razón de implementación se aplicaría un paso de redondeo dentro del cálculo en lugar de después?
Édouard
1
También quería señalar que si proporciona a Spotlight una aproximación más precisa pi / 2 (al copiar y pegar más de 10 dígitos de Wolfram Alpha, por ejemplo), la precisión aumenta.
Édouard
Gracias por confirmar mi suposición de que la precisión del pi fue la causa del error entre 0 y aproximadamente 10 ^ -12 en la pregunta del OP.
bmike
¿Con qué frecuencia ves esto: "10 ^ -12 es realmente grande"
GEdgar
2

Teniendo en cuenta que -5e-12es un número muy pequeño, este es 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 serie piconstante o infinita utilizada para calcular las funciones trigonométricas.

Alexander - Restablece a Monica
fuente