Python余弦函数精度

mul*_*rse 2 python trigonometry decimal

从数学上我们知道90度角的余弦是0,但Python说它比这更多.

import math
math.cos(math.radians(90))
6.123233995736766e-17
Run Code Online (Sandbox Code Playgroud)

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

Die*_*Epp 6

在我之后重复:

计算机无法处理实数.

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'
Run Code Online (Sandbox Code Playgroud)

Python具有精细调整的功能,用于打印浮动,以便它们能够在文本和文本的往返过程中存活.这意味着Python默认打印的数字比例如多printf.

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

  • _Computers无法处理实数._ @Dietrich:许多其他基于计算机的程序将返回0(即计算器,excel).我试图使用圆函数,但我得到的最大值是0.0,而不是0. (3认同)
  • @Dietrich Epp:我重复了你让我重复的那句话“计算机无法处理实数”,但这对我来说听起来不对。这对我来说意味着计算机无法处理 1 + 1 = 2。 (2认同)
  • @NormalAnomaly 不,实数是小数/无理数。1 是一个整数,可以完美表示而不会损失任何精度。Excel 和计算器使用一些技巧来打印 0,但在内部它们并不比 6.123233995736766e-17 更好 (2认同)

en_*_*ght 6

正如 Dietrich 指出的那样,包含的 Math 包使用数值近似值来计算三角函数 - pi 具有通过浮点数表示的某种精度水平。但是也有很多很好的 Python 包可以进行符号计算-如果您愿意,Sympy是一种进行更精确计算的简单方法。

考虑:

import math
math.cos( 3*math.pi/2 )
# Outputs -1.8369701987210297e-16
Run Code Online (Sandbox Code Playgroud)

相对于

import sympy
sympy.cos( 3*sympy.pi/2 ) 
# Outputs 0
Run Code Online (Sandbox Code Playgroud)

没有多少情况会产生影响,并且 sympy 速度要慢得多。我用 math 和 sympy 测试了我的计算机可以在五秒钟内完成多少余弦计算,并且它用 math进行了38 倍的计算。这取决于你在寻找什么。