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

8

Como usted sabe, Spotlight puede hacer matemáticas simples. Por ejemplo, escribir cos(pi) resultará en -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?

    
pregunta poitroae 11.03.2014 - 21:39

5 respuestas

13

Es debido a la falta de precisión de pi y debido 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 


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.

    
respondido por el Matthieu Riegler 11.03.2014 - 21:45
5

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.

    
respondido por el user130144 12.03.2014 - 20:42
4

Es un error reproducible 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 maneja sin la suficiente precisión si tuviera que adivinar.

  • cos (999999 * pi) no tiene un error
  • cos ((999999 + 1) * pi) tiene un error: es probable que se redondee

Me dirigiría a enlace si quieres ver el aparato de corrección de errores de Apple en acción.

    
respondido por el bmike 11.03.2014 - 21:46
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 que ejecutaría dentro de los límites de los cálculos de punto flotante. Sin embargo, el error en el orden de 10 ^ -12 es realmente grande.

Esto NO es el culpable de la inexactitud de los números de punto flotante. El resultado que obtienes es solo esto:

cos(1.5707963268)

Se puede validar utilizando 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:

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

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

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

    
respondido por el Dennis Jaheruddin 12.03.2014 - 10:44
2

Teniendo en cuenta que -5e-12 es un número muy pequeño, este es un error de redondeo.

Creo que es la consecuencia de que los proyectores muestran más decimales que los utilizados en la definición de la constante pi o la serie infinita utilizada para calcular las funciones trigonométricas.

    
respondido por el Alexander 11.03.2014 - 21:46

Lea otras preguntas en las etiquetas