我正在 python(64 位操作系统)中测试 Pi 的一些实现,并且有兴趣测量答案的准确性(有多少小数位是正确的?)以增加迭代。我不想比较超过 15 位小数,因为超出此范围浮点表示本身就不准确。
例如对于低迭代次数,我得到的答案是
>>> x
3.140638056205993
我想与 math.pi 进行比较
>>> math.pi
3.141592653589793
对于上述问题,我希望我的答案是 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)
最佳答案
您可以计算两者之间差异的对数
>>> val = 3.140638056205993
>>> epsilon = abs(val - math.pi)
>>> abs(int(math.log(epsilon, 10))) + 1
3
本质上,您要找出 10 的哪个次方才能等于两个数字之间的差。仅当两个数字之差小于 1 时,此方法才有效。
关于python - 测量浮点结果精确到小数点后 N 位的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40199363/