首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求解二次公式

求解二次公式
EN

Stack Overflow用户
提问于 2013-05-02 14:30:57
回答 5查看 6.7K关注 0票数 0

我正在写一个使用二次公式求解二次方程的程序,但它只在a=1时有效,但我希望它在a大于1时有效

下面是我的代码:

代码语言:javascript
复制
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,但是当我使用一个大于1的数字时,比如使用4,我会得到这个错误

代码语言:javascript
复制
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

有什么办法可以解决这个问题吗?如果是的话,救命啊!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-02 14:37:54

问题就在这里:

  1. 运算符优先级:您的/2*a应该为/(2*a)才能正常工作。
  2. sqrtmath.sqrt的域在负numbers.
  3. Edit 2上跳转:紧跟在</2*a>d13之后的 y = ...应为be

要修复后一种情况,您需要某种条件:

代码语言:javascript
复制
disc = b**2 - 4*a*c
sqrtdisc = math.sqrt(disc) if disc >= 0 else math.sqrt(-disc)*1j

编辑:您也可以使用cmath.sqrt,它会自动处理负数:

代码语言:javascript
复制
disc = b**2 - 4*a*c
sqrtdisc = cmath.sqrt(disc)

(感谢其他回答者,他们有效地让我知道了cmath的存在。)

票数 6
EN

Stack Overflow用户

发布于 2013-05-02 14:37:18

获取ValueError的原因是表达式b**2-4*a*c返回的是负值,这对于math.sqrt是不允许的。

代码语言:javascript
复制
>>> 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处理负值:

代码语言:javascript
复制
>>> import cmath
>>> cmath.sqrt(-1)
1j
票数 5
EN

Stack Overflow用户

发布于 2013-05-02 14:41:18

要处理复数,请改用cmath。

代码语言:javascript
复制
import cmath
cmath.sqrt(negativenumber)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16331745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档