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)
最近遇到一个问题:
我想像这样计算各种数字的各种根:
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)