4

从数学中我们知道 90 度角的余弦为 0,但 Python 说它不止于此。

import math
math.cos(math.radians(90))
6.123233995736766e-17

Python和数字“0”之间有什么关系?

4

2 回答 2

7

跟着我重复:

计算机无法处理实数。

Python 使用双精度 IEEE 浮点数,它四舍五入到 53 位二进制精度并且对范围有限制。由于 π/2 是一个无理数,计算机将其四舍五入为最接近的可表示数字(或接近的可表示数字——一些运算具有精确舍入,一些运算具有大于 1/2 ULP 的误差)。

因此,您从未要求计算机计算cos(π/2),而是真正要求计算机计算cos(π/2+ε),其中 ε 是计算 π/2 的舍入误差。然后将结果再次四舍五入。

为什么 Excel(或其他程序)显示正确的结果?

可能性 1:程序进行符号计算,而不是数字计算。这适用于 Mathematica 和 Maxima 等程序,而不适用于 Excel。

可能性 2:程序隐藏了数据(很可能)。Excel 只会显示您要求的数字,例如,

>>> '%.10f' % math.cos(math.radians(90))
'0.0000000000'

Python 有一个经过微调的函数来打印浮点数,以便它们在往返文本和返回的过程中幸存下来。这意味着 Python 默认打印的数字比例如printf.

可能性 3:您正在使用的程序有两个取消的舍入错误。

于 2013-02-16T11:30:17.273 回答
6

正如 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 倍的计算。这取决于你在寻找什么。

于 2013-04-28T20:16:45.043 回答