从数学中我们知道 90 度角的余弦为 0,但 Python 说它不止于此。
import math
math.cos(math.radians(90))
6.123233995736766e-17
Python和数字“0”之间有什么关系?
从数学中我们知道 90 度角的余弦为 0,但 Python 说它不止于此。
import math
math.cos(math.radians(90))
6.123233995736766e-17
Python和数字“0”之间有什么关系?
跟着我重复:
计算机无法处理实数。
Python 使用双精度 IEEE 浮点数,它四舍五入到 53 位二进制精度并且对范围有限制。由于 π/2 是一个无理数,计算机将其四舍五入为最接近的可表示数字(或接近的可表示数字——一些运算具有精确舍入,一些运算具有大于 1/2 ULP 的误差)。
因此,您从未要求计算机计算cos(π/2)
,而是真正要求计算机计算cos(π/2+ε)
,其中 ε 是计算 π/2 的舍入误差。然后将结果再次四舍五入。
可能性 1:程序进行符号计算,而不是数字计算。这适用于 Mathematica 和 Maxima 等程序,而不适用于 Excel。
可能性 2:程序隐藏了数据(很可能)。Excel 只会显示您要求的数字,例如,
>>> '%.10f' % math.cos(math.radians(90))
'0.0000000000'
Python 有一个经过微调的函数来打印浮点数,以便它们在往返文本和返回的过程中幸存下来。这意味着 Python 默认打印的数字比例如printf
.
可能性 3:您正在使用的程序有两个取消的舍入错误。
正如 Dietrich 指出的那样,包含的 Math 包使用数值近似值来计算三角函数 - pi 具有通过浮点数表示的某种程度的精度。但是也有很多很好的 python 包可以进行符号计算——如果你愿意的话,Sympy是一种进行更精确计算的简单方法。
考虑:
import math
math.cos( 3*math.pi/2 )
# Outputs -1.8369701987210297e-16
相对于
import sympy
sympy.cos( 3*sympy.pi/2 )
# Outputs 0
在很多情况下这会有所不同,并且 sympy 的速度要慢得多。我用 math 和 sympy 测试了我的计算机可以在 5 秒内完成多少次余弦计算,它用 math 做了 38 倍的计算。这取决于你在寻找什么。