En utilisant import numpy as np
j'ai remarqué que
np.tan(np.pi/2)
donne le numéro dans le titre et non np.inf
16331239353195370.0
Je suis curieux de connaître ce nombre. Est-il lié à un paramètre de précision de la machine du système? Aurais-je pu le calculer à partir de quelque chose? (Je pense à quelque chose de similaire à sys.float_info
)
EDIT: Le même résultat est en effet reproductible dans d'autres environnements tels que Java, octace, matlab ... La dupe suggérée n'explique cependant pas pourquoi.
python
numpy
numerical-methods
Un gars
la source
la source
np.inf
. Mais il est simple non seulement d'expliquer pourquoi ce n'est pas le cas, mais aussi d'expliquer pourquoi la réponse est exactement ce qui a été vu - et c'est ce que j'ai fait ;-)Réponses:
pi
n'est pas exactement représentable en tant que flotteur Python (identique au type de la plate-forme Cdouble
). L'approximation représentable la plus proche est utilisée.Voici l'approximation exacte utilisée sur ma box (probablement la même que sur votre box):
Pour trouver la tangente de ce rapport, je vais maintenant passer à wxMaxima:
Donc essentiellement identique à ce que vous avez. L'approximation binaire
pi/2
utilisée est un peu inférieure à la valeur mathématique ("précision infinie") depi/2
. Vous obtenez donc une très grande tangente au lieu deinfinity
. Le calcultan()
est approprié pour l'entrée réelle!Pour exactement les mêmes types de raisons, par exemple,
ne renvoie pas 0. L'approximation
math.pi
est un peu inférieure àpi
, et le résultat affiché est correct étant donné cette vérité.AUTRES FAÇONS DE VOIR math.pi
Il existe plusieurs façons de voir l'approximation exacte utilisée:
math.pi
est exactement égale à la valeur mathématique ("précision infinie") de ce rapport.Ou comme un flottant exact en notation hexadécimale:
Ou d'une manière la plus facilement comprise par à peu près tout le monde:
Bien que cela ne soit pas immédiatement évident, chaque flottant binaire fini est exactement représentable comme un flottant décimal fini (l'inverse n'est pas vrai; par exemple, le décimal
0.1
n'est pas exactement représentable comme un flottant binaire fini), et leDecimal(some_float)
constructeur produit l'équivalent exact.Voici la vraie valeur de
pi
suivie de la valeur décimale exacte demath.pi
, et un signe d'insertion sur la troisième ligne pointe vers le premier chiffre où ils diffèrent:math.pi
est le même dans «presque toutes» les boîtes maintenant, parce que presque toutes les boîtes utilisent maintenant le même format binaire à virgule flottante (IEEE 754 double précision). Vous pouvez utiliser l'une des méthodes ci-dessus pour confirmer cela sur votre boîte, ou pour trouver l'approximation précise utilisée si votre boîte est une exception.la source
np.pi
est la représentation rationnelle la plus proche de l'epsilon du système?np.pi
a la même valeur que celle de Pythonmath.pi
(je n'ai pas vérifié, mais vous pouvez ;-)), c'est la valeur la plus proche du pi mathématique représentable dans leC double
format flottant natif de la plate-forme. Ce qui signifie la double précision IEEE 754 sur presque toutes les boîtes maintenant, et donc le flotteur binaire le plus proche avec 53 bits de précision (mantisse). Ainsi, l'ensemble des rationnels est contraint à la forme+/- I * 2**J
où l'entierI
vaut 0 ou2**52 <= I < 2**53
, et la plage des entiersJ
est suffisamment large pour couvrir tous les rationnels de cette forme n'importe oùpi
.np.pi
, nonmath.pi
.math.pi
,np.pi
etscipy.pi
sont tous identiques; ils sont dupliqués juste pour faciliter la dénomination; stackoverflow.com/questions/12645547/…