124: sample288 (浮動小数点演算) で期待値エラー

↑up

概要

以下のコードで期待値エラーが発生する。

unno@Noether compiler % cat test/samples/sample288.hs
main = do print (pi :: Double)
          print (exp 1 :: Double)
          print (log 10 :: Double)
          print (sqrt 2 :: Double)
          print (pi ** 2 :: Double)
          print (logBase 2 10 :: Double)
          print (sin 1 :: Double)
          print (cos 1 :: Double)
          print (tan 1 :: Double)
          print (asin (-1) :: Double)
          print (acos (-1) :: Double)
          print (atan 1 :: Double)
          print (sinh 1 :: Double)
          print (cosh 1 :: Double)
          print (tanh 1 :: Double)
          print (asinh 1 :: Double)
          print (acosh 2 :: Double)
          print (atanh 0.5 :: Double)

調査ログ

2021-12-01 (Wed)

元は、x86 上で動作する GHC で期待値を作っていて、x86 機上では bunny の結果も一致していたのだが、M1 上では一致しなくなってしまったようだ。調べてみると、M1 上では GHC による結果も、bunny の結果も少しずつ異なっているようだ:

式			期待値(GHC x86)		GHC arm64		bunny arm64
------------------------------------------------------------------------------------------
pi :: Double		3.141592653589793	3.141592653589793	3.141592653589793
exp 1 :: Double		2.718281828459045	2.718281828459045	2.7182818284590455
                                                                                         ^
log 10 :: Double	2.302585092994046	2.302585092994046	2.302585092994046
sqrt 2 :: Double	1.4142135623730951	1.4142135623730951	1.4142135623730951
pi ** 2 :: Double	9.869604401089358	9.869604401089358	9.869604401089358
logBase 2 10 :: Double	3.3219280948873626	3.3219280948873626	3.3219280948873626
sin 1 :: Double		0.8414709848078965	0.8414709848078965	0.8414709848078965
cos 1 :: Double		0.5403023058681398	0.5403023058681398	0.5403023058681398
tan 1 :: Double		1.5574077246549023	1.557407724654902	1.5574077246549023
                                                                 ^
asin (-1) :: Double	-1.5707963267948966	-1.5707963267948966	-1.5707963267948966
acos (-1) :: Double	3.141592653589793	3.141592653589793	3.141592653589793
atan 1 :: Double	0.7853981633974483	0.7853981633974483	0.7853981633974483
sinh 1 :: Double	1.1752011936438014	1.1752011936438014	1.1752011936438014
cosh 1 :: Double	1.543080634815244	1.5430806348152437	1.543080634815244
                                                                ^^
tanh 1 :: Double	0.7615941559557649	0.7615941559557649	0.7615941559557649
asinh 1 :: Double	0.8813735870195429	0.881373587019543	0.8813735870195429
                                                                ^^
acosh 2 :: Double	1.3169578969248166	1.3169578969248166	1.3169578969248166
atanh 0.5 :: Double	0.5493061443340549	0.5493061443340549	0.5493061443340548
                                                                                         ^

この違いは処理系(演算ライブラリ)の違いによる誤差として許容することとし、 この違いが問題にならないようにテストプログラムを修正することにする:

sample288b.hs:

print' n x = putStrLn $ take n $ show x
  

main = do print (pi :: Double)
          print' 17 (exp 1 :: Double)
          print (log 10 :: Double)
          print (sqrt 2 :: Double)
          print (pi ** 2 :: Double)
          print (logBase 2 10 :: Double)
          print (sin 1 :: Double)
          print (cos 1 :: Double)
          print' 17 (tan 1 :: Double)
          print (asin (-1) :: Double)
          print (acos (-1) :: Double)
          print (atan 1 :: Double)
          print (sinh 1 :: Double)
          print' 16 (cosh 1 :: Double)
          print (tanh 1 :: Double)
          print' 16 (asinh 1 :: Double)
          print (acosh 2 :: Double)
          print' 17 (atanh 0.5 :: Double)

これにてクローズ。