比较Haskell中的大数字以通过quickCheck

时间:2017-12-02 02:29:57

标签: haskell math functional-programming integration difference

我已经创建了一个函数,使用具有n个梯形的梯形法则计算某个函数g从a到b的定积分。 即definiteIntegral (-4) 5 (\x -> x) 5 = 4.499999999999998

我需要开发一个quickCheck函数来测试我的函数。我想利用一个属性,即积分内的系数可以取在外面并乘以积分。

这是我的quickCheck功能:

prop :: (Double, Double, Integer, Double) -> Property
prop (a, b, n, random) = (n > 0) ==> abs(random * (definiteIntegral a b (\x->x) n) - (definiteIntegral a b (\x-> random * x) n)) <= marginOfError
                            where 
                                marginOfError = 1e-5

我遇到的问题是我需要根据积分的大小来改变误差范围。这是因为2.8109220919999948-2.810922091999996 = -1.3322676295501878e-152.8109220919999948e15-2.810922091999996e15 = -1

因此,我需要某种方法来检查这两个数字,看看它们是否相似,但我当前的误差范围方法不起作用。我想我需要检查有效数字或科学计数法中用10乘以幂的数字,但我不确定如何在Haskell中实现。

有什么想法吗? 提前致谢。

1 个答案:

答案 0 :(得分:0)

为了计算两个数字的相当稳健的误差幅度,可以将它们平均,并除以一些大的常数;用它作为误差范围。

margin :: Double -> Double -> Double
margin a b = (a + b) / (1e5) -- Increase this for more precision; decrease for less

close :: Double -> Double -> Bool
close a b = (abs (a - b)) < (margin a b)