HUnit有没有做近似等式的方法?显然,这是失败的:
test1 = TestCase (assertEqual "Should equal" (get_scores) [(0.3, 0.3), (0.6, 0.36), (1.0, 0.3399999)])发布于 2012-02-17 04:19:58
注意:我不知道是否有一种正确的/官方的/公认的方法来做到这一点。
Here's assertEqual的源代码
assertEqual :: (Eq a, Show a) => String -- ^ The message prefix
-> a -- ^ The expected value
-> a -- ^ The actual value
-> Assertion
assertEqual preface expected actual =
unless (actual == expected) (assertFailure msg)
where msg = (if null preface then "" else preface ++ "\n") ++
"expected: " ++ show expected ++ "\n but got: " ++ show actual在此基础上,基于JUnit's function for testing double equality,我们可以以相同的风格创建我们自己的:
import Control.Monad (unless)
assertEquals :: String -- ^ The message prefix
-> Double -- ^ The maximum difference between expected and actual
-> Double -- ^ The expected value
-> Double -- ^ The actual value
-> Assertion
assertEquals preface delta expected actual =
unless (abs (expected - actual) < delta) (assertFailure msg)
where msg = ... same as above ...发布于 2012-02-17 04:22:10
对于浮点近似比较,有一个带有一些不错的实用工具的库:
http://hackage.haskell.org/package/ieee754
发布于 2022-01-18 08:02:08
自从这个问题第一次被提出以来,HUnit-approx package已经发布了。
它使用隐式变量epsilon和近似相等运算符~?~,而不是~=?。
下面是一个简短的示例:
tweak :: Float -> Float
tweak x = x * 1.0001
egApproxTest = let ?epsilon = 0.01 in
[ "strictEqual" ~: 0 ~=? tweak 0,
"approxEqual" ~: 2 ~?~ tweak 2 ]https://stackoverflow.com/questions/9318146
复制相似问题