# 124: sample288 (浮動小数点演算) で期待値エラー [↑up](bunny_notes) - issued: 2021-11-28 - 分類: A サンプルコードが fail - status: Closed (2021-12-01) ## 概要 以下のコードで期待値エラーが発生する。 $$
{ 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 元は、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) $$} これにてクローズ。