我在python中编码并发现了一个奇怪的错误:
import math
print(math.tan(math.pi/4) == 1)
打印错误,因为math.tan(math.pi / 4)是0.9999999999 ......
你知道为什么Python表现出这样的行为吗?我的意思是,如果出现精确问题以外的原因吗?
谢谢!
答案 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