x ** python 中的 1/3?

x ** 1/3 in python?

最近遇到一个问题:

我想像这样计算各种数字的各种根:

x = x ** 1/y+1

None 我知道的方法生成了有效代码。

方法一:

x = 54
y = 2
x = x ** 1/y+1
print(x)

打印值为 28.0 而不是 3.7798

方法二:

x = 54
y = 2
x = x ** 1/(y+1)
print(x)

打印值为 18.0 而不是 3.7798

方法三:

x = 216
y = 2
x = x ** (1/(y+1))
print(x)

打印值为 5.99 而不是 6

有没有一种方法可以使 y 达到 20?

编辑:

另一个建议的方法:

def nth_root(val, n):
    ret = int(val**(1./n))
    return ret + 1 if (ret + 1) ** n == val else ret

y = 1
print(nth_root(19, (y+1)))

打印 4

您似乎(还)不理解编程语言中的操作顺序。您需要括号以确保将 1 添加到 y,then 取倒数,然后 then 将其用作指数。 "natural"顺序相反

x = x ** (1.0/(y+1))

只有您的最后一个代码有效,因为 ** 的优先级高于 /(并且 / 的优先级高于 +)。

该值不正好是 6,因为浮点数并不完全准确。第三个不能表示为浮点数。

你要的是这个(假设你用的是Python3):

x = x ** (1/(y+1))

对于 Python 2,以下任一方法都有效:

from __future__ import division
x = x ** (1/(y+1))

或(在 Python 3 上也很好):

x = x ** (1.0/(y+1))

问题是您需要在正确的位置应用括号以获得正确的运算顺序。

方法三是浮点运算。参见:https://docs.python.org/3.5/tutorial/floatingpoint.html

有关 Python 2 级与 Python 3 级的更多信息: Division in Python 2.7. and 3.3

你的所有值都符合预期。根据 python operator precedence:

x ** 1/y+1被解析为((x ** 1) / y) + 1,而

x ** 1/(y+1) 实际上是 (x ** 1) / (y + 1).

您可能想要的是 x ** (1. / (y + 1))。请注意,1. 是一个浮点数,导致整个表达式被评估为浮点数。这也意味着您将以有限的精度工作,例如,得到 5.99999 而不是 6 是可以预期的。

既然其他人都已经告诉你为什么你的方法3是正确的,我会坚持给你一个准确的答案。 You can read more about why you're not getting exactly 6,但基本上是因为你的电脑在计算的时候没有准确地代表1/3,导致最后的答案不对。

所以,最简单的解决方案是使用 sympy:

import sympy

y = 216
x = 2
x = sympy.root(y,x+1)
print(x)