为什么sqrt(xt)不能正常工作? ValueError:数学域错误

时间:2017-06-20 09:25:51

标签: python python-3.x

所以我想制作一个程序,说明函数中的n解是什么?^ n -15 = xt其中n是正整数,xt是正方形数。但这不起作用:

from math import sqrt
n = 0
def is_square(x):
    answer = sqrt(x)
    return answer.is_integer()

while True:
    n += 1
    xt = 2 ^ n - 15
    if is_square(xt):
        print(xt)

错误说明了这一点:

Traceback (most recent call last):
  File "C:/Users/NemPl/Desktop/Python/Python programi/M/P #1.py", line 9, in <module>
    if is_square(xt):
  File "C:/Users/NemPl/Desktop/Python/Python programi/M/P #1.py", line 4, in is_square
    answer = sqrt(x)
ValueError: math domain error

3 个答案:

答案 0 :(得分:5)

sqrt的参数为负数时,可能会发生此错误。

math.sqrt函数无法计算负数的平方。

您可以使用cmath lib作为负数:

import cmath
print (cmath.sqrt(-2))
>>> 1.4142135623730951j

答案 1 :(得分:3)

简短回答:您的目标是计算负数的平方根。

如果我们在程序中添加print(xt)语句:

while True:
    n += 1
    xt = 2 ^ n - 15
    print(xt)
    if is_square(xt):
        print(xt)

我们看到查询的第一个元素是:

-16

虽然复数数字表示负数的平方根,但math.sqrt(..)适用于浮点数,因此“ reals ”的子集。现在对于实数,负数的平方根定义。

最后,不是^ 不计算功率,可以使用2 ** n(或在这种情况下为1 << n)来计算功率。插入符号 ^是按位或

答案 2 :(得分:2)

math.sqrt显然不喜欢会导致复杂结果的负数。来自documentation

  

这些功能不能用于复数;如果需要支持复数,请使用cmath模块中相同名称的函数。支持复数的函数和不支持复数的函数之间的区别是因为大多数用户不想学习理解复数所需的数学。接收异常而不是复杂的结果允许更早地检测用作参数的意外复数,以便程序员可以首先确定它的生成方式和原因。

如果您还需要复杂的结果,请使用cmath中的cmath.sqrt()