math.pi的Python精度

时间:2014-07-25 13:11:28

标签: python floating-point precision

我在python中编码并发现了一个奇怪的错误:

import math
print(math.tan(math.pi/4) == 1)

打印错误,因为math.tan(math.pi / 4)是0.9999999999 ......

你知道为什么Python表现出这样的行为吗?我的意思是,如果出现精确问题以外的原因吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

这是R FAQ 7.31翻译成Python:

http://www.hep.by/gnu/r-patched/r-faq/R-FAQ_82.html

python中的那个例子给出了相同的结果:

>>> a = math.sqrt(2)
>>> a*a - 2
4.440892098500626e-16

您的切线示例的差异也非常非常小:

>>> math.tan(math.pi/4) - 1
-1.1102230246251565e-16

并且刚刚通过除以4并且采用角度的tan的所有浮点运算累积。

答案 1 :(得分:1)

你会得到精度误差,因为它非常明显。但是,如果你想获得Pi的相关值,那么你可以使用它(也称为阿基米德方法):

import math

# max error allowed
eps = 1e-10

# initialize w/ square
x = 4
y = 2*math.sqrt(2)

ctr = 0
while x-y > eps:
    xnew = 2*x*y/(x+y)
    y    = math.sqrt(xnew*y)
    x    = xnew
    ctr += 1

print("PI = " + str((x+y)/2))
print("# of iterations = " + str(ctr))

答案 2 :(得分:1)

解决此问题的一个好方法是实现自定义函数isEqual,它将两个数字与指定的delta进行比较

DELTA = 0.0001

def isEqual(number1, number2)
  if (number1 - DELTA) < number2 or (number1 + DELTA) > number2 # as example and demonstration of the idea