我的代码:
def root1(a,b,c):
return (-b+sqrt((b**2)-4*a*c))/2*a
def root2(a,b,c):
return (-b-sqrt((b**2)-4*a*c))/2*a
我得到ValueError: math domain error
,我无法弄明白为什么。
答案 0 :(得分:6)
大概你有类似
的东西from math import sqrt
使用
代替该导入from cmath import sqrt
cmath
中的sqrt
函数可以处理否定参数。
例如,
>>> from math import sqrt
>>> sqrt(-4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
>>> from cmath import sqrt
>>> sqrt(-4)
2j
答案 1 :(得分:1)
作为使用cmath
的优秀想法的替代方法,您可以坚持实数透视并仍然创建二次公式的安全版本。激进派下的表达式D称为discriminant,在数学中有多种用途。在处理二次方位时看到三种情况并不常见(例如,当将有理函数与二次分母相结合时,根据D <0,D = 0或D> 0,需要使用不同的方法)。下面的代码计算判别式并返回一个元组,它具有0,1或2个数字,具体取决于是否有0,1或2个实根。调用代码可以检查返回值的长度,并根据它确定要执行的操作:
def discriminant(a,b,c):
return b**2 - 4*a*c
def quadratic(a,b,c):
D = discriminant(a,b,c)
if D > 0:
sqr = math.sqrt(D)
return ((-b + sqr)/(2*a), (-b - sqr)/(2*a))
elif D == 0:
return (-b/(2*a),)
else:
return ()
例如:
>>> quadratic(1,2,-3)
(1.0, -3.0)
>>> quadratic(1,2,1)
(-1.0,)
>>> quadratic(1,2,3)
()