测量浮点精度得到N个小数位

时间:2016-10-23 03:58:29

标签: python decimal floating

我正在测试python(64位操作系统)中Pi的一些实现,并且有兴趣测量答案的准确度(多少小数位是正确的?)以增加迭代次数。我不希望比较超过15个小数位,因为除此之外浮点表示本身是不准确的。

E.g。对于低迭代次数,我得到的答案是

>>> x
3.140638056205993

我希望与math.pi进行比较

>>> math.pi
3.141592653589793

对于上述我希望我的答案是3(小数点后3位错误) 我这样做的方式是:

>>> p = str('%.51f' % math.pi)
>>> q = str('%.51f' % x)
>>> for i,(a,b) in enumerate(zip(p,q)):
...     if a != b:
...         break

以上看起来很笨拙,即将浮点数转换为字符串,然后逐个字符地比较,是否有更好的方法可以做到这一点,比如更多Pythonic或者使用原始浮动值本身?

顺便说一下,我发现math.frexp,这可以用来做这个吗?

>>> math.frexp(x)
(0.7851595140514982, 2)

1 个答案:

答案 0 :(得分:3)

您可以计算两者之间差异的对数

>>> val = 3.140638056205993
>>> epsilon = abs(val - math.pi)
>>> abs(int(math.log(epsilon, 10))) + 1
3

基本上,你要找出等于两个数字之间差异所需的10的幂。仅当两个数字之间的差异小于1时才有效。