我有这个代码抛出math domain error
异常:
v = -1.0
for i in range (201):
print acos (v)
v += 0.01
但如果我将其更改为此,则可以:
v = -100
for i in range (201):
print acos (v / 100.0)
v += 1
这是因为四舍五入吗?
如何在Python中最好地解决这个问题?或者我应该像上一个例子那样做?
答案 0 :(得分:8)
如果你这样做:
>>> format(0.01, '.30f')
'0.010000000000000000208166817117'
你可以看到0.01
(作为双精度的浮点数)大于你在学校学到的数字0.01
。
所以,当你总结100次时,误差会变大:
>>> sum([0.01]*100)
1.0000000000000007
这足以给出数学域错误。
你能做什么?
round()
它到小数点:
>>> round(1.0000000000000007, 13)
1.0
13或14就足够了。
答案 1 :(得分:1)
你可以试试这个:
v = -1.0
for i in range(201):
print acos(v)
v = round(v + 0.01, 2)
它适用于您的问题。浮点数也是同样的老问题:并非所有十进制数都能用二进制精确表示。运行这个:
v = -1.0
for i in range(201):
print repr(v), acos(v)
v += 0.01
你会看到在循环结束时,错误发生之前,v
的值略大于1.0
, 是导致错误的原因math domain error
。