pi
ist nicht genau als Python-Float darstellbar (wie der double
Typ der Plattform C ). Die am nächsten darstellbare Näherung wird verwendet.
Hier ist die genaue Annäherung, die auf meiner Box verwendet wird (wahrscheinlich die gleiche wie auf Ihrer Box):
>>> import math
>>> (math.pi / 2).as_integer_ratio()
(884279719003555, 562949953421312)
Um den Tangens dieses Verhältnisses zu finden, werde ich jetzt zu wxMaxima wechseln:
(%i1) fpprec: 32;
(%o1) 32
(%i2) tan(bfloat(884279719003555) / 562949953421312);
(%o2) 1.6331239353195369755967737041529b16
Also im Wesentlichen identisch mit dem, was du hast. Die verwendete binäre Näherung pi/2
ist etwas kleiner als der mathematische Wert ("unendliche Genauigkeit") von pi/2
. Sie erhalten also stattdessen eine sehr große Tangente infinity
. Die berechnete tan()
ist für die tatsächliche Eingabe geeignet!
Aus genau den gleichen Gründen, z.
>>> math.sin(math.pi)
1.2246467991473532e-16
gibt keine 0 zurück. Die Annäherung math.pi
ist etwas kleiner als pi
und das angezeigte Ergebnis ist angesichts dieser Wahrheit korrekt .
ANDERE WEGE ZU SEHEN math.pi
Es gibt verschiedene Möglichkeiten, um die genaue verwendete Annäherung zu sehen:
>>> import math
>>> math.pi.as_integer_ratio()
(884279719003555, 281474976710656)
math.pi
ist genau gleich dem mathematischen Wert ("unendliche Genauigkeit") dieses Verhältnisses.
Oder als exakter Float in Hex-Notation:
>>> math.pi.hex()
'0x1.921fb54442d18p+1'
Oder auf eine Weise, die für fast jeden am einfachsten zu verstehen ist:
>>> import decimal
>>> decimal.Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')
Obwohl dies möglicherweise nicht sofort offensichtlich ist, ist jeder endliche binäre Float genau als endlicher Dezimal-Float darstellbar (das Gegenteil ist nicht der Fall; z. B. ist die Dezimalzahl 0.1
nicht genau als endlicher binärer Float darstellbar), und der Decimal(some_float)
Konstruktor erzeugt das genaue Äquivalent.
Hier ist der wahre Wert von pi
gefolgt vom exakten Dezimalwert von math.pi
, und ein Caret in der dritten Zeile zeigt auf die erste Ziffer, wo sie sich unterscheiden:
true 3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
^
math.pi
ist jetzt für "fast alle" Boxen gleich, da fast alle Boxen jetzt dasselbe binäre Gleitkommaformat verwenden (IEEE 754 doppelte Genauigkeit). Sie können eine der oben genannten Möglichkeiten verwenden, um dies auf Ihrer Box zu bestätigen oder um die genaue verwendete Annäherung zu ermitteln, wenn Ihre Box eine Ausnahme darstellt.