Python余弦函数精度

时间:2013-02-16 11:24:17

标签: python decimal cosine

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

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

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

2 个答案:

答案 0 :(得分: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'

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

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

答案 1 :(得分:4)

正如迪特里希指出的那样,所包含的数学包使用数值近似来计算触发函数 - 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

没有很多情况会产生影响,而且情绪相当慢。我测试了计算机在五秒内用数学计算可以做多少余弦计算,并且用同情心测试,并且用数学计算 38次计算。这取决于你在寻找什么。