Python中的平方根

3 投票
3 回答
26584 浏览
提问于 2025-04-17 18:58
>>> import math
>>> math.sqrt(4)
2.0

为什么Python不提供负的平方根(因为-2也是4的平方根)?
我该如何让Python输出负的平方根呢?

3 个回答

4

这并不是Python特有的问题,也不是平方根函数独有的情况。这是一个在处理某些函数的反函数时常常会遇到的问题,特别是那些不是“单射”的函数。你可以查看这个链接了解更多:http://en.wikipedia.org/wiki/Injective_function

简单来说,就是如果一个函数有多个不同的x值对应同一个y值,那它的反函数就会出现问题。比如y=x**2就是一个例子。

你也可以对很多其他函数提出类似的疑问,比如反正弦函数(arcsin)。比如说,什么样的“x”能让sin(x)=0.5?即使我们只考虑-180度到+180度的范围(也就是-π到+π),也会有两个解,x=30度和x=150度。但是反正弦的实现总是只会返回30度(π/6)。如果我们想要“另一个反解”,通常需要根据这个特定函数的性质来找。

对于反平方根(sqrt),我们只需要在前面加个负号就行了。对于反正弦函数,我们则需要用到补角,比如pi-arcsin(0.5)就是一个例子。

10

如果你想要找到一个数字的所有根,可以使用 numpy.root 这个工具。

>>> import numpy
>>> def root(n, r):
    p = [1] + [0] * (r - 1) + [-n]
    return numpy.roots(p)

>>> root(4, 2)
array([ 2., -2.])
>>> root(-4, 2)
array([ 0.+2.j,  0.-2.j])
>>> root(1, 3)
array([-0.5+0.8660254j, -0.5-0.8660254j,  1.0+0.j       ])

另外一个选择是使用 Sympy多项式模块

>>> from sympy import symbols, solve
>>> solve(x**2 - 4)
[-2, 2]
>>> from sympy import symbols, solve
>>> solve(x**2 - 4)
[-2, 2]
>>> solve(x**3 - 1)
[1, -1/2 - sqrt(3)*I/2, -1/2 + sqrt(3)*I/2]
>>> solve(x**2 + 4)
[-2*I, 2*I]
9

你觉得这样怎么样:

def my_sqrt(x):
    root1 = math.sqrt(x)
    root2 = -root1
    return root1,root2

撰写回答