Python中的平方根
>>> 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