pi
no es exactamente representable como Python float (igual que el double
tipo de la plataforma C ). Se utiliza la aproximación representable más cercana.
Aquí está la aproximación exacta en uso en mi caja (probablemente la misma que en su caja):
>>> import math
>>> (math.pi / 2).as_integer_ratio()
(884279719003555, 562949953421312)
Para encontrar la tangente de esa relación, ahora voy a cambiar a wxMaxima:
(%i1) fpprec: 32;
(%o1) 32
(%i2) tan(bfloat(884279719003555) / 562949953421312);
(%o2) 1.6331239353195369755967737041529b16
Esencialmente idéntico a lo que tienes. La aproximación binaria a pi/2
usada es un poco menor que el valor matemático ("precisión infinita") de pi/2
. Entonces obtienes una tangente muy grande en lugar de infinity
. ¡El calculado tan()
es apropiado para la entrada real!
Exactamente por el mismo tipo de razones, por ejemplo,
>>> math.sin(math.pi)
1.2246467991473532e-16
no devuelve 0. La aproximación math.pi
es un poco menor que pi
, y el resultado mostrado es correcto dada esa verdad.
OTRAS FORMAS DE VER math.pi
Hay varias formas de ver la aproximación exacta en uso:
>>> import math
>>> math.pi.as_integer_ratio()
(884279719003555, 281474976710656)
math.pi
es exactamente igual al valor matemático ("precisión infinita") de esa relación.
O como un flotador exacto en notación hexadecimal:
>>> math.pi.hex()
'0x1.921fb54442d18p+1'
O de la manera más fácil de entender para casi todos:
>>> import decimal
>>> decimal.Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')
Si bien puede no ser inmediatamente obvio, cada flotante binario finito es exactamente representable como un flotante decimal finito (lo contrario no es cierto; por ejemplo, el decimal 0.1
no es exactamente representable como un flotante binario finito), y el Decimal(some_float)
constructor produce el equivalente exacto.
Aquí está el valor real de pi
seguido del valor decimal exacto de math.pi
, y un signo de intercalación en la tercera línea apunta al primer dígito donde difieren:
true 3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
^
math.pi
es el mismo en "casi todos" los cuadros ahora, porque casi todos los cuadros ahora usan el mismo formato de punto flotante binario (IEEE 754 doble precisión). Puede utilizar cualquiera de las formas anteriores para confirmar eso en su caja, o para encontrar la aproximación precisa en uso si su caja es una excepción.