我正在编写一个程序来使用二次方程式求解二次方程,但只有在a = 1时它才有效,但我希望它在a大于1的情况下工作
这是我的代码:
import math
def solve(a, b, c):
x = ((-1)* b + math.sqrt(b**2-4*a*c))/2*a
print "x = %s" %x
print "or"
y = ((-1)* b - math.sqrt(b**2-4*a*c))/2*a
print "x = %s" %x
while 1:
a = int(raw_input("Enter A :"))
b = int(raw_input("Enter B :"))
c = int(raw_input("Enter C :"))
solve(a, b, c)
它适用于1但是当我使用多于一个的数字时,我使用说4我得到此错误
Traceback (most recent call last):
File "C:\Documents and Settings\User\Desktop\Factor.py", line 18, in <module>
solve(a, b, c)
File "C:\Documents and Settings\User\Desktop\Factor.py", line 5, in solve
x = ((-1)* b + math.sqrt(b**2-4*a*c))/2*a
ValueError: math domain error
如果有这样的帮助,有没有办法解决这个问题!!
答案 0 :(得分:5)
问题在于:
/2*a
应该/(2*a)
才能正常工作。sqrt
:[{1}}的域名为负数。math.sqrt
在y = ...
之后print "or"
要修复后者,你需要某种条件:
x = ...
修改:您还可以使用disc = b**2 - 4*a*c
sqrtdisc = math.sqrt(disc) if disc >= 0 else math.sqrt(-disc)*1j
,自动处理负数:
cmath.sqrt
(感谢各位其他回答者有效地告诉我disc = b**2 - 4*a*c
sqrtdisc = cmath.sqrt(disc)
存在。)
答案 1 :(得分:4)
您获得ValueError
的原因是您的表达式b**2-4*a*c
返回了一个负值,math.sqrt
不允许这样做。
>>> math.sqrt(-1)
Traceback (most recent call last):
File "<ipython-input-38-5234f21f3b4d>", line 1, in <module>
math.sqrt(-1)
ValueError: math domain error
使用cmath.sqrt
来处理负值:
>>> import cmath
>>> cmath.sqrt(-1)
1j
答案 2 :(得分:4)
要处理复数,请改用cmath。
import cmath
cmath.sqrt(negativenumber)
答案 3 :(得分:3)
您获得math domain error
,因为您给math.sqrt
一个负值。这可能会在您增加a
时发生,因为您没有将b
增加到足以使b**2-4*a*c
给出正值。
答案 4 :(得分:0)
尝试使用类似的东西来获得根源:
def roots(a, b, c):
def getDiscriminant(a, b, c,Error = "Imaginary Roots"):
try:
return (b ** 2 - (4 * a * c)) ** .5
except:
return Error
D = getDiscriminant(a, b, c)
if D == False:
return False
b = -b
a = 2 * a
firstroot = float((b + D) / float(a))
secondroot = float((b - D) / float(a))
return (firstroot,secondroot)