Unterschied zwischen math.exp (2) und math.e ** 2 [duplizieren]

8

Beim Programmieren habe ich einen Unterschied zwischen dem Ergebnis von math.exp (2) und math.e ** 2 festgestellt. Wie Sie unten sehen können, tritt dieser Unterschied bei der Berechnung von e ^ 1 nicht auf.

Da ich kein erfahrener Programmierer bin, habe ich mich gefragt, warum das anders ist? Ich nehme an, es hat etwas mit dem Aufrunden zu tun. Die Python-Dokumente sagen, dass math.exp(x) return e**x , aber dies scheint nicht genau richtig zu sein. Wie kommt es also, dass sich die Operation math.exp(x) von math.e**x unterscheidet?

%Vor%     
oscarwhiskybravo 10.06.2015, 12:54
quelle

2 Antworten

4

Es ist anders wegen der Unterschiede in der Implementierung der Funktionen. Keines ist perfekt aufgrund der Natur des Fließkommas.

Der Operator ** ist in floatobject.c implementiert und enthält Es gibt viele Sonderfälle, aber hier wird keiner von ihnen aufgerufen, so dass es letztendlich die Standardfunktion C pow erreicht. Die Funktion math.pow tut letztendlich das Gleiche.

Die Funktion exp ist ein einfacher Wrapper um die gleichnamige C-Funktion, die mit einem Makro in mathmodule.c .

Wie dem auch sei, exp ist präziser (beide Ergebnisse stimmen überein, innerhalb der Genauigkeit, die Gleitkomma erlaubt, hochpräzise Antworten, die ich in bc berechnet habe). Höchstwahrscheinlich liegt das daran, dass intern der pow-Wert den Logarithmus für die erweiterte Genauigkeit des doppelkoordinaten e -Werts berechnet, den Sie als erstes Argument übergeben, was etwas kleiner als 1 ist.

Das grundlegende Problem ist, dass math.e , das ist die Zahl, die Sie die Macht von berechnen, ist:

%Vor%

Der wahre Wert von e ist

%Vor%

Und dieser Fehler wird verstärkt, wenn Sie pow oder ** verwenden, während dies möglicherweise nicht der Fall ist (oder intern möglicherweise einen höheren Genauigkeitswert verwendet), wenn Sie exp aufgrund der Details der Algorithmen verwenden es benutzt.

    
Random832 10.06.2015, 13:12
quelle
5

exp(x) wird viel niedriger implementiert als e**x . Es ist im Wesentlichen ein Wrapper für eine Funktion in libc. Diese Funktion ist wahrscheinlich (auf einer bestimmten Ebene) mit der Erweiterung Taylor-Serie , um den Wert direkt zu berechnen (oder möglicherweise eine andere mathematische Methode) Ich bin mir nicht sicher).

Auf der anderen Seite nimmt e**x eine Zahl und erhöht sie auf eine Potenz. Dies ist eine völlig andere Strategie und wahrscheinlich in den meisten Fällen weniger präzise. Es ist schwierig, die Anzahl der Kräfte zu erhöhen.

    
Kevin 10.06.2015 13:07
quelle

Tags und Links