Python中计算毕达哥拉斯三角恒等式出现非预期结果的原因
问题原因
这是IEEE 754标准双精度浮点数运算的固有精度误差导致的,是所有遵循该标准的编程语言都会出现的共性现象,和Python语言本身的实现无关。
具体原因可以拆解为三点:
- 数学层面的π是无限不循环无理数,但Python
math库提供的pi是仅保留了约16位十进制有效数字的近似值,pi/i的计算结果从源头就和理论精确值存在微小偏差。 sin、cos三角函数的底层实现采用的是数值近似计算方法,输出结果是和理论值误差极小的近似值,并非完全精确的数学结果。- 后续的平方、加法运算会进一步累积上述微小误差,最终就可能出现
1.0000000000000002、0.9999999999999999这类和1偏差不到1e-15的结果,偏差量级已经达到双精度浮点数的最小精度边界,属于完全正常的运算结果。
通用处理方案
如果需要在代码中校验计算结果是否符合三角恒等式预期,不要直接用r == 1做精确相等判断,改用带容错阈值的近似判断即可:
# 阈值可以根据业务精度需求调整,1e-12对于绝大多数场景都足够 assert abs(r - 1) < 1e-12
内容的提问来源于stack exchange,提问作者Kai Ruben Enerhaugen
相关产品推荐
相关产品推荐

