pi
n'est pas exactement représentable en tant que flotteur Python (identique au type de la plate-forme C double
). 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):
>>> import math
>>> (math.pi / 2).as_integer_ratio()
(884279719003555, 562949953421312)
Pour trouver la tangente de ce rapport, je vais maintenant passer à wxMaxima:
(%i1) fpprec: 32;
(%o1) 32
(%i2) tan(bfloat(884279719003555) / 562949953421312);
(%o2) 1.6331239353195369755967737041529b16
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") de pi/2
. Vous obtenez donc une très grande tangente au lieu de infinity
. Le calcul tan()
est approprié pour l'entrée réelle!
Pour exactement les mêmes types de raisons, par exemple,
>>> math.sin(math.pi)
1.2246467991473532e-16
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:
>>> import math
>>> math.pi.as_integer_ratio()
(884279719003555, 281474976710656)
math.pi
est exactement égale à la valeur mathématique ("précision infinie") de ce rapport.
Ou comme un flottant exact en notation hexadécimale:
>>> math.pi.hex()
'0x1.921fb54442d18p+1'
Ou d'une manière la plus facilement comprise par à peu près tout le monde:
>>> import decimal
>>> decimal.Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')
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 le Decimal(some_float)
constructeur produit l'équivalent exact.
Voici la vraie valeur de pi
suivie de la valeur décimale exacte de math.pi
, et un signe d'insertion sur la troisième ligne pointe vers le premier chiffre où ils diffèrent:
true 3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
^
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.