比较 Haskell 中的大数以通过快速检查

问题描述 投票:0回答:1

我制作了一个函数,使用 n 个梯形的梯形规则计算某个函数 g 从 a 到 b 的定积分。 即

definiteIntegral (-4) 5 (\x -> x) 5 = 4.499999999999998

我需要开发一个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 中实现。

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

haskell math functional-programming difference numerical-integration
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.