python - 测量浮点结果精确到小数点后 N 位的精度

标签 python decimal floating

我正在 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/

相关文章:

Java 十进制格式

objective-c - 如何实现 float 在内容 View 上的叠加按钮

python - 从 Notepad++ 运行 Python 时获取当前路径

java - Java中如何将数字四舍五入到小数点后n位

python - Jupyter Notebook 服务器无法启动

c++ - std::hex 保持值不变

c - C 中的负数除法

c - STM32 float 计算错误

python - 类范围内的动态实例变量

Python pyodbc 连接到 IBM Netezza Erroring