![](/img/trans.png)
[英]Whence the 27 digits of extra precision in `decimal.Decimal(1.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)
或者使用复杂的exp
和log
来获取主根:
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.