Usando import numpy as np
eu notei que
np.tan(np.pi/2)
dá o número no título e não np.inf
16331239353195370.0
Estou curioso sobre este número. Está relacionado a algum parâmetro de precisão da máquina do sistema? Eu poderia ter calculado a partir de algo? (Estou pensando em algo semelhante a sys.float_info
)
EDIT: O mesmo resultado é realmente reproduzível em outros ambientes como Java, octace, matlab ... O dupe sugerido não explica por que, no entanto.
python
numpy
numerical-methods
Um cara
fonte
fonte
np.inf
. Mas é simples não apenas explicar por que não é, mas também explicar por que a resposta é exatamente o que foi visto - e foi o que fiz ;-)Respostas:
pi
não é exatamente representável como Python float (igual ao tipo da plataforma Cdouble
). 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):
Para encontrar a tangente dessa relação, vou mudar para wxMaxima agora:
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") depi/2
. Então você obtém uma tangente muito grande em vez deinfinity
. O calculadotan()
é apropriado para a entrada real!Exatamente pelos mesmos motivos, por exemplo,
não retorna 0. A aproximação
math.pi
é um pouco menor quepi
, 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:
math.pi
é exatamente igual ao valor matemático ("precisão infinita") dessa proporção.Ou como um float exato em notação hexadecimal:
Ou da forma mais facilmente compreendida por quase todos:
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 oDecimal(some_float)
construtor produz o equivalente exato.Aqui está o valor verdadeiro de
pi
seguido pelo valor decimal exato demath.pi
, e um circunflexo na terceira linha aponta para o primeiro dígito onde eles diferem: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.fonte
np.pi
é a representação racional mais próxima do épsilon do sistema?np.pi
tenha o mesmo valor do Pythonmath.pi
(não verifiquei, mas você pode ;-)), é o valor mais próximo do pi matemático representável noC double
formato de ponto flutuante nativo da plataforma . O que significa precisão dupla IEEE 754 em quase todas as caixas agora e, portanto, o flutuador binário mais próximo com 53 bits de precisão (mantissa). Portanto, o conjunto de racionais é restrito à forma em+/- I * 2**J
que inteiroI
é 0 ou2**52 <= I < 2**53
, e o intervalo de inteiroJ
é amplo o suficiente para cobrir todos os racionais dessa forma em qualquer lugar próximopi
.np.pi
, nãomath.pi
.math.pi
,np.pi
escipy.pi
são todos iguais; eles são duplicados apenas por conveniência de nomenclatura; stackoverflow.com/questions/12645547/…