2016-09-07 12 views
-2

私はちょうどnumpysine機能をチェックしました。どうやら、それはpiの周りに非常に不正確な結果を生み出します。なぜnumpyの正弦関数はある点では不正確なのですか?

In [26]: import numpy as np 

In [27]: np.sin(np.pi) 
Out[27]: 1.2246467991473532e-16 

numpyがあるので、不正確であるのはなぜ期待される結果は0ですか?

計算結果を不正確と見なすことが許容できるかどうかは確かではありません。その絶対誤差は1つのマシンイプシロン(binary64の場合)ですが、相対誤差は+infです - 。何か案が?

[編集]浮動小数点計算が不正確である可能性があることを十分に理解しています。しかし、ほとんどの浮動小数点ライブラリは、小さな誤差範囲内で結果を提供することができます。ここで、相対誤差は+ infであり、許容できないようです。

1/(1e-16 + sin(pi)) 

私たちがnumpyの実装を使用すると、結果が悲惨に間違っているでしょう。

+2

「e-16」がありましたか? –

+1

"とても不正確"は相対的なものだと思います... 0と0.00000000000000012246468の差は、コンピュータが無限のシーケンスを正確に表す能力を考えると比較的小さいです。 – Lost

+0

@FredLarsonはい。私はe-16の部分に気づいた。上で述べたように、その絶対誤差は1つのマシンイプシロン(binary64の場合)になりますが、相対誤差は+ – zell

答えて

7

ここでの主な問題は、np.piが正確にπではないことです。実際の非理想的な実数πに近いが、〜1e-16ではまだ近い有限バイナリ浮動小数点数です。 np.sin(np.pi)は、実際にはsin(np.pi)の真の無限精度結果に近い値を返しています(すなわち、理想的な数学的なsin()関数は、0よりも近似されたnp.piの値を与えられます)。

+0

a = np.sin(np.pi)... np.allclose(a、np.PZERO)#真... np.allclose(a、np.NZERO)#Trueを使用すると、現在の表現が気に入らなければ 'ゼロ' –

-1

この値は、計算に使用されるアルゴリズムに依存します。典型的な実装では、1つのマシンイプシロン内に収束するまで、迅速に収束する無限級数を使用します。最近の多くのチップ(インテル960からはじまる)は命令セットにそのような機能を持っていました。

これに対して返される値が0になるようにするには、最も正確なアルゴリズム、最も近い一致結果を保証するために精度の高い演算を実行するアルゴリズム、特殊なケースを認識するアルゴリズムのいずれかが必要です。正確な値。

+3

私は、ルックアップテーブルを使っているだけで、反復アルゴリズムではないと確信しています。また、 'np.pi'は単なる浮動小数点なので、piとほぼ同じです。 – wim

+0

私はNumPyが何をしているのか調べました。それを見つけることができません。おそらく参考になりますか?私はそれがネイティブのチップ機能を気にしないかどうかを知りたいです。私がソフトウェアを「信頼」しているので、良い参考資料は私にいくつかのことを教えてくれるかもしれないし、この答えを完全に暴動させるかもしれません。 – Prune

+2

[Cライブラリ実装](http://stackoverflow.com/a/2285277/10077)を使用することがあります。 –

関連する問題