2017-05-02 6 views
0

私は単純にクローズン関数mpmathgslをテストします。以下のコードは次のとおりです。同じ精度でmpmathがgslよりも遅いのはなぜですか?そして結果は正しい?

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) 

結果は以下の通りです:4.19 ...しかしGSL:4.18私は同じ精度で見出された結果から、

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

、結果は非常に異なる(mpmathです...)、どちらがより正確であるか知りたいですか? 同じ精度でmpmathがgsl_sf_clausenよりも100倍以上遅いのはなぜですか?

ありがとうございました

答えて

1

ご存知のとおり、Clausen関数はx = piではまったく0です。あなたはpiに非常に近い数をそれに供給しています。 Clausenの関数の評価がどのように実行されるかに応じて、この時点での計算には、ほぼ完全な解約のためにloss of significanceが含まれる可能性があります。

おそらく、gslとmpmathはClausenの関数と同じ実装を持たないため、実行時間と出力が異なります。これは珍しいことではありません。たとえ行列の逆行列を見つけるだけの単純なものであっても、同じ精度レベルで動作しながら、異なる結果を返す異なるパッケージに出会うことがあります。

Wolfram Alphaは、4.19620646966946940430 ... m-math値に近いe-14を返します。精度が上がるとmpmath自体がWolframAlphaに同意します。別のポイントに私たちをもたらします

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

gslは、倍精度浮動小数点数を(私は本当に、その内部を知りません)を使用するように見える一方でmpmathは、浮動小数点数の任意の精度で動作するように設計されています。したがって、非常に高い精度が要求される可能性があると考えられて設計されたmpmathのアルゴリズムは、実行に時間がかかります。

関連する問題