我已经创建了一个函数,使用具有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-15
,2.8109220919999948e15-2.810922091999996e15 = -1
。
因此,我需要某种方法来检查这两个数字,看看它们是否相似,但我当前的误差范围方法不起作用。我想我需要检查有效数字或科学计数法中用10乘以幂的数字,但我不确定如何在Haskell中实现。
有什么想法吗? 提前致谢。
答案 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)