4

さて、これはかなり奇妙な問題です。

組み込みの Haskell 正弦関数 (sin) が機能していないようです。

sin 0正しく、 を与え0ます。

sin pi何らかの理由で、1.2246467991473532e-16

これらは組み込みの prelude 関数を使用しています。単に ghci (Haskell インタープリター) を起動して入力するsin piと、間違った答えが得られます。

またcos (pi/2)6.123233995736766e-17

なぜこれが考えられるのでしょうか?関数の組み込みが単に間違っているように見えます..Haskell標準ライブラリが数学的に指向されていることを考えると、これは非常にありそうにありません。

編集: へー、私は単に e-16 を見落としただけです.. 夜遅くにコーディングすることで得られるものだと思います。とにかくみんなありがとう!

4

2 に答える 2

20

これはマトラブです

>> sin(pi)
ans =
  1.2246e-016

そして、ここにパイソンがあります

>>> from math import sin, pi
>>> sin(pi)
1.2246467991473532e-16

浮動小数点精度の限界に達しています。What Every Computer Scientist Should Know About Floating Point Arithmeticを読むことをお勧めします。


eこれらの数字の末尾にある は、それらが科学表記法 (のコンパクトな形式) であることを示し、「× 10^」を表します。たとえば、この表記法で2e3は、2 × 10 3 = 2000 に対応します。ここでは、10 -16を掛けた数値があり、これは小さいです。完全に書き出された 1.2246467991473532e-16= 0.00000000000000012246467991473532 なので、エラーの量は非常に小さいです。


Haskell で正確な実数計算が必要な場合は、次のようにCRealパッケージを使用できます。

>>> import Data.Number.CReal
>>> sin (0.0  :: CReal)
0.0
>>> sin (pi   :: CReal)
0.0
>>> cos (pi/2 :: CReal)
0.0

これは、「ボンネットの下」 aCRealが function であるため機能しますInt -> Integer。出力する桁数が与えられるとd、この関数は、Integerで割ると、小数点以下の桁10^d数が正しい実数を与える を生成します。d

于 2013-07-10T09:30:54.187 に答える
2

倍精度 pi 自体のエラーは -2.3846200000000026e-17 であるため、sin のような関数の精度でさらに 10 進数を失うことは悪くありません。

于 2013-07-10T13:20:40.157 に答える