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

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?

cos(x) es una función trascendental. A menos que codifiquen valores para pi, pi/2, etc., debe esperar algún error.
@Navin en realidad espero que codifiquen estos valores ya que son muy importantes.
pien sí mismo estaría codificado (ya que obtienes -1 para 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.
Incluso si aumentara la precisión, lo único que ganaría es que el resultado se convierte en 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 de double, pero no mucho.
Supongo que es una característica del hecho de que las computadoras trabajen en binario mientras que nosotros trabajamos en decimal.
@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 se pueden representar exactamente en binario o decimal.
Ya veo, esa es una buena explicación. Por lo tanto, es una simple falta de precisión y, probablemente, un redondeo poco inteligente al mostrar la respuesta.
Para referencia, en Ruby:irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
Esto es típico de cualquier calculadora que no conoce muchas reglas con símbolos, sino que simplemente convierte cada nombre en un número cuando lo ve.

Respuestas (5)

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.

Se debe a la falta de precisión, pero un error de esta magnitud no se puede achacar a los números de coma flotante.
Probablemente sea más una falta de precisión con el valor pi.

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.

No hay nada malo con Markdown: MathJax solo está habilitado en sitios relacionados con matemáticas, no en todo el SE.
cos(pi/2 + cos(pi/2)) se muestra exactamente como 0.

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.

  • cos(999999*pi) no tiene un error
  • cos((999999+1)*pi) tiene un error - probable redondeo

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.

¿Es un error, de verdad? ¿Cuál debería ser la precisión en tal operación?
No soy un desarrollador registrado, ¡pero estaría muy agradecido si pudiera enviarlo por nosotros!
@poitroae Puede registrarse de forma gratuita como desarrollador de Safari y posiblemente todavía haya un nivel de Mac gratuito. Tengo una lista de errores para escribir, así que dejaré la suya para que otra persona la archive.
@Édouard, sea amable con el autor de la pregunta: he editado su comentario sobre la pregunta principal. Si quisieras explicar cómo sucede esto, lo votaría. Los valores numéricos de Apple suelen comportarse bien para los errores de redondeo, por lo que me sorprendió un poco que Spotlight no fuera más preciso.
@Édouard Puede considerarlo un error si se ha hecho que el usuario espere alguna capacidad para las matemáticas simbólicas. ¡Cualquier sistema de álgebra computacional (CAS) por supuesto sabrá 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 punto flotante, se esperan resultados como los informes OP. Cualquier informe de error podría etiquetarse mejor como una solicitud de función, tal vez.
@Édouard bmike tiene razón en que se trata de un error y no solo de un error de redondeo. La precisión esperada de tal operación, dada la aritmética estándar de doble precisión, es de aproximadamente 10^-16, no 10^-12. Puede probar esto usted mismo escribiendo un programa en su idioma favorito que aproveche el soporte de punto flotante de la CPU, haciendo el cálculo y examinando 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.
@Édouard Otra forma de demostrar que se trata de un error debido a la precisión insuficiente en la constante π es calcular 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.
Algo raro está pasando 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 precisión doble y demasiado preciso para precisión simple.
cos(1.5707963267948966) da 0. Pero cos(3.14159265358979323846264338/2) no da 0.
@bmike Mi comentario estaba destinado a ser leído en primer grado (no estaba seguro de si la pregunta era sobre resultados no exactos o precisión insuficiente). A pesar de mis mejores esfuerzos, parecía que todavía sonaba algo cáustico. Sin embargo, al editar mi comentario, introdujo un error: los números de coma flotante son una representación de software (de números); hablar de la representación de software de números de coma flotante no tiene mucho sentido, al menos para mí.
@Édouard no dude en publicar un nuevo comentario si desea que lo borre, ya que al final tiene que tener sentido para usted. Mis disculpas si mi intento de ayudar no dio en el blanco.

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:

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

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.

esto es raro 1.5707963268 es el resultado que te da Spotlight cuando calculas pi/2. Después de algunos intentos simples, parece que Spotlight muestra 10 dígitos significativos para el número por debajo de 1 y 11 para los números por encima de 1. Pero, ¿por qué extraño motivo de implementación se aplicaría un paso de redondeo dentro del cálculo en lugar de después?
También quería señalar que si proporciona a Spotlight una aproximación pi/2 más precisa (copiando y pegando más de 10 dígitos de Wolfram Alpha, por ejemplo), la precisión aumenta.
Gracias por confirmar mi suposición de que la precisión de pi fue la causa del error entre 0 y aproximadamente 10 ^ -12 en la pregunta del OP.
¿Con qué frecuencia ves esto: "10^-12 es realmente grande"

Teniendo en cuenta que -5e-12es 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 piconstante o la serie infinita utilizada para calcular funciones trigonométricas.