在处理一个浮点错误时,我发现了pyth math moduel的 isclose
办法. 该方法计算了以下几个方面的相对epsilon a
和 b
使用以下公式。
max(rel_tol * max(abs(a), abs(b))
默认情况下, rel_tol
设置为 1e-09
. 根据文档,这 "保证了两个值在小数点后9位之内是相同的"。
让我们看看下面的例子...
a=1234.000001
b=1234
# the relative epsilon, as calculated with the above formula, would be 0.000001234000001
# so math.isclose returns true
math.isclose(a,b)
根据文档,这似乎应该为 false
而不是,因为它在小数点后第9位以内不准确。 但是,由于相对epsilon略微比不上 1e-06
,这就是区别,它返回 true
. 我在一些地方看到过这个相对epsilon公式,但从来没有解释过为什么要使用它。 我希望了解为什么这个公式是可以接受的,以及我如何将其应用到我的使用中。isclose
. 谢谢你
你可能混淆了差值和相对公差。
你是对的,a和b之间的差值是1e-6,这两个数字只有到第六位才是相同的。小数位.
然而,Python文档说的是 小数 其中包含了句号前的数字。因此,这两个数字对第9个数字也是一样的。小数.
当你处理小数时,用相对容差而不是差值的原因很容易理解。如果你所有的数字都小于1e-10,而我们要用差值,我们永远无法比较两个浮点数。但是如果你使用相对容差,你就可以更好地衡量两个浮点数之间的 "相对距离"。
关于isclose的有用性,一个例子可以是传感器测量。如果你写了一段代码,等待信号沉降到一个浮点值,你不想测试测量值是否等于期望值,因为由于四舍五入的误差,它可能永远不会发生,而是等待测量值接近期望值。
希望对你有帮助