He escrito tan 90 grados en google y dio 1.6331779e + 16. ¿Cómo llegó a esta respuesta? ¿Límites? ¿Algo de magia?
Respuestas
¿Demasiados anuncios?Como Daniel Fischer, dijo, es debido a errores de redondeo en punto flotante IEEE de matemáticas, que está muy extendida en las computadoras y los lenguajes de programación. Desde él se explica por qué es precisamente ese número, me voy a tomar una puñalada en la respuesta más general.
El ejemplo
((1.0 - 0.9) - 0.1) = -2.7755575615628914*10^-17
Obviamente, esto es matemáticamente incorrecto, pero se produce porque el equipo (A) no tiene precisión infinita y (B) no guardar los números en base 10. La clave que 0.9
y 0.1
no se puede no se puede representar exactamente, justo como "un tercio" no se puede representar exactamente en decimal.
El problema no mostrar inmediatamente (print(0.9)
sale bien) porque el equipo es lo suficientemente inteligente como para redondear las pequeñas desviaciones cuando se convierte decimales, pero la "relación a distancia" entre 0
y -2.8*10^-17
es un poco demasiado para ocultar.
Bits y bytes
Suponiendo que estamos buscando a un 32-bit float
, -0.9
se almacena como:
Section Bits Translation
+/1 sign bit 1 Is negative
exponent: 01111110 -1 (126 above a -127 offset)
mantissa 11001100110011001100110 0.79999995231628426710886
Observe cómo la mantisa contiene una repetición 1100
? patrón? Es casi exactamente como el almacenamiento de 1/3
como 0.3333333333
en decimal. En ambos casos no se puede almacenar de forma precisa sin quedarse sin espacio.
De todos modos, cuando las partes de que la representación juntos, se obtiene:
(-1) * 2^(-1) * (1+ 0.79999995231628426710886)
O, aproximadamente, -0.8999999761581421
. Esta desconexión entre la representación decimal (lo cual es bueno) y la representación binaria (que es fea... er, incompleta) es la primera ficha de dominó en un potencial cascada de sutil error de redondeo.
Porque parece que Google Calculadora funciona internamente
- en radianes en lugar de grados
- con aritmética de punto flotante en lugar de computación simbólica
El uso de radianes significa que la GC es el uso de un ángulo de $\frac{\pi}{2}$ radianes. El más cercano representable double
el valor es de $1.5707963267948965579989817342720925807952880859375$. He de indicar que este valor aproximado de $\frac{\pi}{2} - \epsilon$, donde $\epsilon \aprox 6.123233995736766 \times 10^{-17} $ (calcula mediante el uso de un mayor valor de precisión de $\pi$).
Recordemos que $\tan (\frac{\pi}{2} - \epsilon) = \cuna \epsilon = \frac{1}{\tan \epsilon} $. En mi máquina, esta se evalúa a $1.633123935319537 \times 10^{16}$. (La aproximación de ángulo pequeño de $\cuna \epsilon \approx \frac{1}{\epsilon}$ pasa a dar la misma respuesta.) Esto es parecido a lo que Google Calculadora devuelve, pero difiere por 33 ppm.