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

2024-09-30 20:28:01 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么我会得到这个错误?在

我试着解这样一个方程:

轴^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

Tags: pymost错误decallfilelast方程
2条回答

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

不管有什么区别,这都应该是有效的:

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

示例:

^{pr2}$

当使用具有相同值的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

看起来

b**2 - a*c

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

即使您认为表达式的计算结果应为正值,浮点舍入错误也可能导致负值。请记住,浮点运算并不精确。在

虽然一个更可能的解释是你把表达式转录错误了。你当然是说:

^{pr2}$

话虽如此,如果二次曲线没有实解,那么你会遇到域误差。如果二次型有重复的实解(即两个解的值相同),那么舍入误差也会导致域误差。在

例如,考虑以下等式:

(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

所以即使方程有一个真正的解,你仍然可能会碰到这个问题。在

相关问题 更多 >