Python 二次根函数的数学域误差

Python 二次根函数的数学域误差,python,python-3.x,Python,Python 3.x,我的代码: 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,我不知道为什么。大概你有这样的错误 from math import sqrt 使用 from cmath import sqrt 中的sqrt函数可以处理否定参数 比如说, >

我的代码:

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
,我不知道为什么。

大概你有这样的错误

from math import sqrt
使用

from cmath import sqrt
中的
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
来自数学导入sqrt的
>>
>>>sqrt(-4)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:数学域错误
>>>从cmath导入sqrt
>>>sqrt(-4)
2j

你大概有

from math import sqrt
使用

from cmath import sqrt
中的
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
来自数学导入sqrt的
>>
>>>sqrt(-4)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:数学域错误
>>>从cmath导入sqrt
>>>sqrt(-4)
2j

作为使用
cmath
这一绝妙想法的替代方案,您可以坚持使用实数透视图,仍然可以创建二次公式的安全版本。根式下的表达式D称为The,在数学中有多种用途。在处理二次函数时,经常会出现三种情况(例如,当将有理函数与二次分母进行积分时,您需要根据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)
()

作为使用
cmath
这一优秀想法的替代方案,您可以坚持实数观点,并且仍然创建二次公式的安全版本。根式下的表达式D称为The,在数学中有多种用途。在处理二次函数时,经常会出现三种情况(例如,当将有理函数与二次分母进行积分时,您需要根据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)
()

如果您将参数打印到
sqrt(…)
中,可能会给您一个提示..欢迎使用StackOverflow!你能提供完整的例子吗?就像这里解释的:。如果您将参数打印到
sqrt(…)
中,可能会给您一个提示。欢迎使用StackOverflow!你能提供完整的例子吗?就像这里解释的:@PM2Ring很好!当我写这篇文章时,我恳求咖啡因不足。我将调整代码。@PM2Ring很好!当我写这篇文章时,我恳求咖啡因不足。我将调整代码。