我正在测试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)
答案 0 :(得分:3)
您可以计算两者之间差异的对数
>>> val = 3.140638056205993
>>> epsilon = abs(val - math.pi)
>>> abs(int(math.log(epsilon, 10))) + 1
3
基本上,你要找出等于两个数字之间差异所需的10的幂。仅当两个数字之间的差异小于1时才有效。