如何最好地处理这个Python数字错误?

时间:2012-01-02 01:04:50

标签: python math floating-point

我有这个代码抛出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中最好地解决这个问题?或者我应该像上一个例子那样做?

2 个答案:

答案 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