我需要计算一些数字的平方根,例如 √9 = 3
和 √2 = 1.4142
。我怎样才能在 Python 中做到这一点?
输入可能都是正整数,而且相对较小(比如不到十亿),但以防万一,是否有任何可能会损坏的东西?
有关的
- python中的整数平方根
- 在 Python 中是否有 x 的第 n 个根的简写?
- **(1⁄2)、math.sqrt 和 cmath.sqrt 之间的区别?
- 为什么 math.sqrt() 对于大数不正确?
- Python sqrt 限制非常大的数字?
- 在 Python 中哪个更快:x**.5 或 math.sqrt(x)?
- 为什么 Python 给出平方根的“错误”答案? (特定于 Python 2)
- 使用 Python 3 的 decimal 模块计算 n 次根
- 如何使用 python 取 -1 的平方根? (专注于 NumPy)
- 任意精度的平方根
注意:这是 在 Meta 上讨论 一个现有的同名 问题后对一个 规范问题 的尝试。
原文由 wjandrea 发布,翻译遵循 CC BY-SA 4.0 许可协议
选项 1:
math.sqrt()
标准库中的
math
模块有 一个sqrt
函数 来计算一个数的平方根。它采用任何 可以转换为float
的类型(包括int
)作为参数并返回float
。选项 2:分数指数
幂运算符 (
**
) 或内置的pow()
函数也可用于计算平方根。从数学上讲,a
的平方根等于a
的1/2
。幂运算符需要数字类型并匹配 二进制算术运算符的转换规则,因此在这种情况下,它将返回
float
或complex
数字。(注意:在 Python 2 中,
1/2
被截断为0
,所以你必须用1.0/2
强制 浮点运算。 平方根的“错误”答案? )此方法可以推广到 nth root ,尽管不能精确表示为
float
的分数(如 1⁄3 或任何不是 2 的幂的分母)可能会导致一些不准确:边缘案例
消极而复杂
求幂适用于负数和复数,但结果略有不准确:
注意
-25
上的括号!否则它被解析为-(25**.5)
因为 取幂比一元取反更紧密。Meanwhile,
math
is only built for floats, so forx<0
,math.sqrt(x)
will raiseValueError: math domain error
and for complexx
,它会提高TypeError: can't convert complex to float
。相反,您可以使用cmath.sqrt(x)
,它比求幂更准确(并且可能也更快):精确
这两个选项都涉及到
float
的隐式转换,因此 浮点精度是一个因素。例如:非常大的数字甚至可能不适合 float,您将得到
OverflowError: int too large to convert to float
。请参阅 Python sqrt limit for very large numbers?其他类型
让我们看看
Decimal
例如:求幂失败,除非指数也是
Decimal
:Meanwhile,
math
andcmath
will silently convert their arguments tofloat
andcomplex
respectively, which could mean loss of precision.decimal
也有自己的.sqrt()
。另见 使用 Python 3 的 decimal 模块计算 n 次根