haskell-jp / questions #99 at 2022-01-02 13:14:18 +0900

HspecのExpectations(`shouldBe` とか)について質問です
数値をテストする際に、浮動少数計算によって起きる僅かな誤差を取り除いてくれるExpectationってありますか...?
今3次元ベクトルを回転行列で変換する関数を書いていて、そのテストをしたいのですが三角関数周りの誤差でテストが書けずにいます...
例えば cos (pi/2) shouldBe` 0` は成功してほしいのですが失敗するなどします。

現在は、ある程度の誤差を無視する以下のような関数を作成してそれで判定をしているのですが、何かしら一般的な方法があったりしますでしょうか...?
almostEqual :: Float -> Float -> Bool
almostEqual a b = a+diff >= b && b <= a+diff 
  where
    diff = 0.1 -- 無視してよい誤差の範囲を決めるよしなな数字、今は適当

自分で使ったことはないのですがこういうのがあるみたいです
https://hackage.haskell.org/package/HUnit-approx-1.1.1.1/docs/Test-HUnit-Approx.html
HUnitは使ってないのでそのままは使えなさそうですが、実装の仕方参考になりました!ありがとうございます!!
上記した almostEqual よりも、差分を計算する方が良さそうなのでそうしてみます!
type Expectation = Assertion からわかる通り、hspecはHUnitのラッパーなのでそのまま使えますよ!
なるほど!知りませんでしたありがとうございます...!!