繁体   English   中英

为什么Python中的(-27)**(1.0 / 3.0)不是-3.0?

[英]Why is (-27)**(1.0/3.0) not -3.0 in Python?

在数学中,您可以采用负数的立方根,因为负数乘以两个其他负数会产生负数。 将某事物提升到分数幂1 / n与获取它的第n个根相同。 因此,-27或(-27)**(1.0 / 3.0)的立方根出现-3。

但是在Python 2中,当我输入(-27)**(1.0 / 3.0)时,它会给我一个错误:

Traceback (most recent call last):
  File "python", line 1, in <module>
ValueError: negative number cannot be raised to a fractional power

Python 3不会产生异常,但它提供的复数看起来不像-3:

>>> (-27)**(1.0/3.0)
(1.5000000000000004+2.598076211353316j)

为什么我不能得到具有数学意义的结果? 这是否有解决方法?

-27有一个真正的立方根(和两个非真实的立方根),但是(-27)**(1.0/3.0)并不意味着“取真正的立方根-27”。

首先,由于浮点表示的限制, 1.0/3.0不能评估到恰好三分之一。 它准确地评估

0.333333333333333314829616256247390992939472198486328125

虽然默认情况下,Python不会打印确切的值。

其次, **不是根发现操作,无论是真根还是主根或其他选择。 它是取幂运算符。 负数对任意实数的一般取幂是混乱的,通常的定义与真正的第n根不匹配; 例如,(-27)^(1/3)的通常定义将给出主根,复数,而不是-3。

Python 2决定为这样的事情引发错误可能更好,除非你明确表达你的意图,例如通过对绝对值取幂然后应用符号:

def real_nth_root(x, n):
    # approximate
    # if n is even, x must be non-negative, and we'll pick the non-negative root.
    if n % 2 == 0 and x < 0:
        raise ValueError("No real root.")
    return (abs(x) ** (1.0/n)) * (-1 if x < 0 else 1)

或者使用复杂的explog来获取主根:

import cmath
def principal_nth_root(x, n):
    # still approximate
    return cmath.exp(cmath.log(x)/n)

或者只是投放到complex复杂幂(相当于EXP-日志事达舍入误差):

>>> complex(-27)**(1.0/3.0)
(1.5000000000000004+2.598076211353316j)

Python 3对负数到非整数使用复指数,它给出y == 1.0/n的主n次根:

>>> (-27)**(1/3)  # Python 3
(1.5000000000000004+2.598076211353316j)

内置pow 记录类型强制规则适用于此处,因为您使用浮点数作为指数。

只需确保base或exponent是一个复杂的实例,它可以工作:

>>> (-27+0j)**(1.0/3.0)
(1.5000000000000004+2.598076211353316j)
>>> (-27)**(complex(1.0/3.0))
(1.5000000000000004+2.598076211353316j)

要找到所有三个根,请考虑numpy

>>> import numpy as np
>>> np.roots([1, 0, 0, 27])
array([-3.0+0.j        ,  1.5+2.59807621j,  1.5-2.59807621j])

这里的列表[1, 0, 0, 27] 1,0,0,27 [1, 0, 0, 27]是指等式1x³+0x²+ 0x + 27的系数。

我不认为Python或它的版本支持此功能。 我将相同的等式粘贴到我的Python解释器(IDLE)中,它解决了它,没有错误。 我使用的是Python 3.2。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM