Mit import numpy as np
habe ich das bemerkt
np.tan(np.pi/2)
gibt die Nummer im Titel an und nicht np.inf
16331239353195370.0
Ich bin neugierig auf diese Nummer. Bezieht es sich auf einen Präzisionsparameter der Systemmaschine? Könnte ich es aus etwas berechnet haben? (Ich denke nach dem Vorbild von etwas ähnlichem sys.float_info
)
BEARBEITEN: Das gleiche Ergebnis ist in der Tat in anderen Umgebungen wie Java, Octace, Matlab ... reproduzierbar. Der vorgeschlagene Betrug erklärt jedoch nicht, warum.
python
numpy
numerical-methods
Ein Mann
quelle
quelle
np.inf
. Aber es ist einfach zu erklären, warum es nicht so ist, sondern auch zu erklären, warum die Antwort genau das ist, was gesehen wurde - und so habe ich es getan ;-)Antworten:
pi
ist nicht genau als Python-Float darstellbar (wie derdouble
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):
Um den Tangens dieses Verhältnisses zu finden, werde ich jetzt zu wxMaxima wechseln:
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") vonpi/2
. Sie erhalten also stattdessen eine sehr große Tangenteinfinity
. Die berechnetetan()
ist für die tatsächliche Eingabe geeignet!Aus genau den gleichen Gründen, z.
gibt keine 0 zurück. Die Annäherung
math.pi
ist etwas kleiner alspi
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:
math.pi
ist genau gleich dem mathematischen Wert ("unendliche Genauigkeit") dieses Verhältnisses.Oder als exakter Float in Hex-Notation:
Oder auf eine Weise, die für fast jeden am einfachsten zu verstehen ist:
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 derDecimal(some_float)
Konstruktor erzeugt das genaue Äquivalent.Hier ist der wahre Wert von
pi
gefolgt vom exakten Dezimalwert vonmath.pi
, und ein Caret in der dritten Zeile zeigt auf die erste Ziffer, wo sie sich unterscheiden: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.quelle
np.pi
der Epsilon des Systems am nächsten kommt?np.pi
hat den gleichen Wert wie Pythonmath.pi
(ich habe es nicht überprüft, aber Sie können ;-)), ist es der Wert, der dem mathematischen pi am nächsten kommt, der im nativenC double
Gleitkommaformat der Plattform dargestellt werden kann. Dies bedeutet, dass IEEE 754 jetzt auf fast allen Boxen doppelte Genauigkeit aufweist und somit der nächste binäre Float mit 53 Bit (Mantissen-) Genauigkeit. Die Menge der Rationalen ist also auf die Form beschränkt, in der die+/- I * 2**J
GanzzahlI
0 oder 0 ist2**52 <= I < 2**53
, und der Bereich der GanzzahlJ
ist weit genug, um alle Rationalen dieser Form irgendwo in der Nähe abzudeckenpi
.np.pi
nichtmath.pi
.math.pi
,np.pi
undscipy.pi
sind alle gleich; Sie werden nur zur Vereinfachung der Benennung dupliziert. stackoverflow.com/questions/12645547/…