为什么我会得到数学域错误?

时间:2014-03-03 15:45:05

标签: python sqrt

为什么我会收到此错误?

我正试图解决这样的等式:

ax ^ 2 + bx + c

Traceback (most recent call last):
  File "I:/Taller de Programacion I/Clase 5/11.py", line 6, in <module>
    x1 = (-b + sqrt(b ** 2 - a * c)) / (2 * a)
ValueError: math domain error

2 个答案:

答案 0 :(得分:1)

似乎

b**2 - a*c

是否定的。将该值传递给sqrt()时,会遇到域错误。

即使您认为表达式应该评估为正值,浮点舍入误差也可能导致负值。请记住,浮点运算并不精确。

虽然更可能的解释是您已错误地转录了表达式。当然你的意思是:

b**2 - 4*a*c

话虽如此,如果二次方没有真正的解,那么您将遇到域错误。如果二次方有重复的实数解(即两个解具有相同的值),则舍入误差也可能导致域错误。

例如,考虑等式:

(x-0.7)(x-0.7) = 0

系数为:

a: 1.0
b: -1.4
c: 0.49

如果我将这些内容提供给Python,我会得到以下内容:

>>> a=1.0
>>> b=-1.4
>>> c=0.49
>>> b**2 - 4*a*c
-2.220446049250313e-16

因此,即使有一个具有真正解决方案的方程式,你仍然可以解决这个问题。

答案 1 :(得分:1)

math模块(我猜你正在使用)不支持复数。使用cmath(python2和python3)或幂运算符**(python3)。

无论判别标志如何,这都应该有效:

x1 = (-b + (b ** 2 - 4 * a * c) ** .5) / 2 / a

示例:

>>> b = 1
>>> a = 2
>>> c = 3
>>> (-b + (b ** 2 - 4 * a * c) ** .5) / 2 / a
(-0.24999999999999992+1.1989578808281798j)

使用具有相同值的math.sqrt会引发所描述的错误:

>>> (-b + sqrt(b ** 2 - a * c)) / (2 * a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error