pin'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/2utilisé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.piest 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.1n'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 pisuivie 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.piest 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.