¿Por qué me aparece un error al utilizar math.sin (math.pi) en python?

Noté una falla al usar math.sin (math.pi). La respuesta debería haber sido 0 pero en su lugar es 1.2246467991473532e-16. Si la statement es math.sin (math.pi / 2) la respuesta es 1.0, que es correcta. ¿Por qué este error?

El resultado es normal: los números en las computadoras generalmente se representan con flotadores , que tienen una precisión finita (se almacenan en unos pocos bytes). Esto significa que solo un número finito de números reales puede ser representado por flotantes. En particular, π no se puede representar exactamente, por lo que math.pi no es π, sino una muy buena aproximación. Es por math.sin(math.pi) que math.sin(math.pi) no tiene que ser sin (π) sino solo algo muy cercano a él.

El valor exacto que observa para math.sin(math.pi) es comprensible: la precisión relativa de los flotadores (precisión doble) es aproximadamente 1e-16. Esto significa que math.pi puede estar equivocado en aproximadamente π * 1e-16 ~ 3e-16. Como sen (π-ε) ~ ε, el valor que obtiene con math.sin(math.pi) puede estar en el peor de los casos ~ 3e-16 (en valor absoluto), que es el caso (este cálculo no se supone para dar el valor exacto pero solo el orden correcto de magnitud, y lo hace).

Ahora, el hecho de que math.sin(math.pi/2) == 1 no sea impactante: puede ser (no he comprobado) que math.pi/2 (un flotador) está tan cerca del valor exacto π / 2 que el valor flotante más cercano al pecado ( math.pi/2 ) es exactamente 1. En general, puede esperar que el resultado de una función aplicada a un número de punto flotante esté desactivado en aproximadamente 1e-16 relativo (o ser aproximadamente 1e-16 en lugar de 0).

Python no hace cálculos simbólicos, y pi es irracional.

Entonces … el error de redondeo no debería ser sorprendente.