两个不同的答案,当它们在数学上是相同的..?

时间:2017-06-28 14:25:34

标签: python-3.x math syntax brackets

我在我的程序中遇到了一个错误,它正在执行重新排列方法来查找方程的根。

我注意到Python基于括号产生了两个不同的答案。 例如

-4**(1/3) = -1.5874010519681994
-4.0**(1/3) = -1.5874010519681994
(-4)**(1/3) = (0.7937005259840999+1.3747296369986024j)
(-4.0)**(1/3) = (0.7937005259840999+1.3747296369986024j)

我已将-4.0分配给变量x,然后将x **(1/3)分配给y,但是我得到复数而不是实际答案。

这是为什么?是否有一种简单的方法可以防止这种情况发生?

由于

2 个答案:

答案 0 :(得分:3)

您的示例中有两件事情发生。

首先,-4周围的括号很重要,因为取幂是在按操作顺序否定之前完成的。因此,在前两个例子中,首先完成功率,然后对功率的结果进行否定。这是您所期望的,因此您没有对此进行查询,但这并未采用-4的多维数据集根,而是4的多维数据集根的负数。

第二个问题是Python中的大多数浮点运算并不精确。 1/3的结果不是分数而是浮点数。如果对存储as_integer_ratio值的变量使用1/3方法,则会得到结果

(6004799503160661, 18014398509481984)

表明它实际上不是1比3.因此,取一些1/3的力量与取其立方根不同,因为实际上没有涉及这样的分数。 Python将指数解释为实数值,而不是理性值,对于负数,将x**y的值解释为exp(y*ln(x)),就像在数学中一样。负实数的对数是一个复数,因此最终结果也很复杂。

如果您真的想要-4的立方根,那么您可以像前两个示例一样编写计算。如果你想在一般情况下采用可能为负数的根,你可以用定义

编写一个例程
def power_frac(base, numerator, denominator):
    """Return base**(numerator/denominator) where base is a
    floating-point number and both numerator and denominator are
    integers.
    """

这个函数需要检查很多情况,因为(例如)负数的偶数根不是真的。但这可以做到。我不相信这样的功能被融入Python。请记住,指数必须以两个整数(或一个分数值)给出,因为当你将指数计算为浮点除法时,Python无法计算出你所指的确切分数。

如果您只想要任何实数的立方根,可以使用

def cuberoot(x):
    return x**(1/3) if x >= 0 else -(-x)**(1/3)

答案 1 :(得分:2)

这不是一个错误,它是运营商优先的问题。如果您选中the docs,则会看到减号运算符-的优先级低于取幂运算符**。因此,您的第一个表达是:

- (4 ** (1/3))

第二个是:

(-4) ** (1/3) 

根本不是同一件事。