pi
não é exatamente representável como Python float (igual ao tipo da plataforma C double
). A aproximação representável mais próxima é usada.
Aqui está a aproximação exata em uso na minha caixa (provavelmente a mesma que na sua caixa):
>>> import math
>>> (math.pi / 2).as_integer_ratio()
(884279719003555, 562949953421312)
Para encontrar a tangente dessa relação, vou mudar para wxMaxima agora:
(%i1) fpprec: 32;
(%o1) 32
(%i2) tan(bfloat(884279719003555) / 562949953421312);
(%o2) 1.6331239353195369755967737041529b16
Tão essencialmente idêntico ao que você conseguiu. A aproximação binária pi/2
usada é um pouco menor do que o valor matemático ("precisão infinita") de pi/2
. Então você obtém uma tangente muito grande em vez de infinity
. O calculado tan()
é apropriado para a entrada real!
Exatamente pelos mesmos motivos, por exemplo,
>>> math.sin(math.pi)
1.2246467991473532e-16
não retorna 0. A aproximação math.pi
é um pouco menor que pi
, e o resultado exibido está correto dada essa verdade.
OUTRAS FORMAS DE VER math.pi
Existem várias maneiras de ver a aproximação exata em uso:
>>> import math
>>> math.pi.as_integer_ratio()
(884279719003555, 281474976710656)
math.pi
é exatamente igual ao valor matemático ("precisão infinita") dessa proporção.
Ou como um float exato em notação hexadecimal:
>>> math.pi.hex()
'0x1.921fb54442d18p+1'
Ou da forma mais facilmente compreendida por quase todos:
>>> import decimal
>>> decimal.Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')
Embora possa não ser imediatamente óbvio, todo float binário finito é exatamente representável como um float decimal finito (o inverso não é verdadeiro; por exemplo, o decimal 0.1
não é exatamente representável como um float binário finito), e o Decimal(some_float)
construtor produz o equivalente exato.
Aqui está o valor verdadeiro de pi
seguido pelo valor decimal exato de math.pi
, e um circunflexo na terceira linha aponta para o primeiro dígito onde eles diferem:
true 3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
^
math.pi
é o mesmo em "quase todas" as caixas agora, porque quase todas as caixas agora usam o mesmo formato de ponto flutuante binário (precisão dupla IEEE 754). Você pode usar qualquer uma das maneiras acima para confirmar isso em sua caixa ou para encontrar a aproximação precisa em uso se sua caixa for uma exceção.