首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用HUnit测试双打的哈斯克尔相等?

用HUnit测试双打的哈斯克尔相等?
EN

Stack Overflow用户
提问于 2012-02-17 03:55:27
回答 5查看 1K关注 0票数 3

HUnit有没有做近似等式的方法?显然,这是失败的:

代码语言:javascript
复制
test1 = TestCase (assertEqual "Should equal" (get_scores) [(0.3, 0.3), (0.6, 0.36), (1.0, 0.3399999)])
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-17 04:19:58

注意:我不知道是否有一种正确的/官方的/公认的方法来做到这一点。

Here's assertEqual的源代码

代码语言:javascript
复制
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,我们可以以相同的风格创建我们自己的:

代码语言:javascript
复制
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 ...
票数 1
EN

Stack Overflow用户

发布于 2012-02-17 04:22:10

对于浮点近似比较,有一个带有一些不错的实用工具的库:

http://hackage.haskell.org/package/ieee754

票数 3
EN

Stack Overflow用户

发布于 2022-01-18 08:02:08

自从这个问题第一次被提出以来,HUnit-approx package已经发布了。

它使用隐式变量epsilon和近似相等运算符~?~,而不是~=?

下面是一个简短的示例:

代码语言:javascript
复制
tweak :: Float -> Float
tweak x = x * 1.0001

egApproxTest  = let ?epsilon = 0.01 in
    [ "strictEqual" ~: 0 ~=? tweak 0,
      "approxEqual" ~: 2 ~?~ tweak 2 ]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9318146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档