pi
n'est pas exactement représentable comme un float Python (comme le float de la plateforme C). double
type). L'approximation représentable la plus proche est utilisée.
Voici l'approximation exacte utilisée sur ma boîte (probablement la même que sur votre boîte) :
>>> 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 obtenu. L'approximation binaire de pi/2
utilisé est un peu moins que la valeur mathématique ("précision infinie") de pi/2
. On obtient 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 moins que pi
et le résultat affiché est correct 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 égal à la valeur mathématique ("précision infinie") de ce rapport.
Ou en tant que flottant exact en notation hexagonale :
>>> math.pi.hex()
'0x1.921fb54442d18p+1'
Ou d'une manière plus facilement compréhensible par 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 en tant que flottant décimal fini (l'inverse étant no vrai ; par exemple, la décimale 0.1
n'est pas exactement représentable sous la forme d'un flotteur binaire fini), et les Decimal(some_float)
produit l'équivalent exact.
Voici la vraie valeur de pi
suivi de la valeur décimale exacte de math.pi
et un signe d'insertion sur la troisième ligne indique le premier chiffre où ils diffèrent :
true 3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
^
math.pi
est le même sur "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 que sur su ou pour trouver l'approximation précise utilisée si votre boîte est une exception.