2017-05-02 3 views
0

Ich teste einfach die Clausen-Funktion von mpmath und gsl. Der Code ist unten:Warum mpmath langsamer als gsl auf der gleichen Präzision? Und welche Ergebnisse sind richtig?

mp.prec = 53 
time_begin = time.time() 
print "mpmath results:" 
print clsin(2,3.1415926535897327) 
print "time1:" 
print (time.time() - time_begin) 
time_begin = time.time() 
print "gsl results:" 
print gsl_sf_clausen(3.1415926535897327) 
print "time2" 
print (time.time() - time_begin) 

Die Ergebnisse sind unten:

mpmath results: 
4.19482951966115e-14 
time1: 
0.00391387939453 
gsl results: 
4.18544219761e-14 
time2 
2.69412994385e-05 

Aus den Ergebnissen ich auf der gleichen Präzision gefunden, sind die Ergebnisse sehr unterschiedlich (mpmath: 4.19 ... aber GSL: 4.18 ...), möchte ich wissen, welches ist mehr Genauigkeit? Und der MPMath mehr als 100 mal langsamer als gsl_sf_clausen auf die gleiche Präzision, warum?

Danke

Antwort

1

Wie Sie wahrscheinlich wissen, Clausen Funktion ist genau 0 bei x = pi. Du fütterst es eine Zahl, die extrem nah an Pi ist. Abhängig davon, wie die Auswertung der Clausen-Funktion implementiert wird, kann die Berechnung an dieser Stelle loss of significance wegen der fast vollständigen Aufhebung von Termen beinhalten.

Vermutlich haben gsl und mpmath keine identische Implementierung der Clausen-Funktion, daher unterscheiden sich ihre Laufzeit und ihre Ausgaben. Dies ist nicht ungewöhnlich. Selbst für etwas scheinbar Einfaches wie das Finden der Umkehrung einer Matrix werden Sie manchmal auf unterschiedliche Pakete stoßen, die bei gleicher Präzision unterschiedliche Ergebnisse liefern.

Wolfram Alpha gibt 4.19620646966946940430 ... e-14 zurück, die näher an mpmath Wert ist. Und mpmath selbst wird mit WolframAlpha einverstanden sein, wenn die Präzision erhöht wird.

>>> mp.dps = 25 
>>> clsin(2, mpf('3.1415926535897327')) 
mpf('4.196206469668926047718406898e-14') 

Was uns zu einem anderen Punkt bringt: mpmath ist so konzipiert, mit einer bestimmten Genauigkeit von Gleitkommazahlen zu arbeiten, während gsl erscheint doppelte Genauigkeit Schwimmer zu verwenden (ich weiß nicht wirklich seine Interna kennen). Es ist also keine Überraschung, dass der Algorithmus von mpmath, der mit dem Gedanken entworfen wurde, dass eine sehr hohe Genauigkeit erforderlich sein könnte, länger dauert.

Verwandte Themen