为什么我会收到此错误?
我正试图解决这样的等式:
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
答案 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