当前位置: 首页 > 知识库问答 >
问题:

如何在Python中计算平方根?

曹光霁
2023-03-14

我需要计算一个数字的平方根,例如√9=3√2=1.4142。我如何用Python实现它?

输入可能都是正整数,并且相对较小(比如说不到10亿),但万一不是,有什么东西可能会断裂吗?

注:这是在元讨论一个现有的标题相同的问题后,试图提出一个规范问题。

相关的

  • python中的整数平方根

共有3个答案

赵高雅
2023-03-14

根据您的目标,尽可能长时间地延迟平方根的计算可能是个好主意。症状可能会有帮助。

SymPy是一个用于符号数学的Python库。

import sympy
sympy.sqrt(2)
# => sqrt(2)

一开始这似乎不是很有用。

但是,征兆可以提供比浮点数或小数更多的信息:

sympy.sqrt(8) / sympy.sqrt(27)
# => 2*sqrt(6)/9

此外,精度也没有损失。(√2) ²仍然是一个整数:

s = sympy.sqrt(2)
s**2
# => 2
type(s**2)
#=> <class 'sympy.core.numbers.Integer'>

相比之下,浮点数和小数将返回一个非常接近2但不等于2的数字:

(2**0.5)**2
# => 2.0000000000000004

from decimal import Decimal
(Decimal('2')**Decimal('0.5'))**Decimal('2')
# => Decimal('1.999999999999999999999999999')

Symphy还了解更复杂的示例:

from sympy import Symbol, integrate, pi, sqrt, exp, oo
x = Symbol('x')
integrate(exp(-x**2), (x, -oo, oo))
# => sqrt(pi)
integrate(exp(-x**2), (x, -oo, oo)) == sqrt(pi)
# => True

最后,如果需要十进制表示,可以要求比需要更多的数字:

sympy.N(sympy.sqrt(2), 1_000_000)
# => 1.4142135623730950488016...........2044193016904841204
关翰
2023-03-14
>>> import numpy as np
>>> np.sqrt(25)
5.0
>>> np.sqrt([2, 3, 4])
array([1.41421356, 1.73205081, 2.        ])

文件

对于负输入,它将返回nan,因此np。自由党。科学数学。sqrt()适用于这种情况。

>>> a = [4, -1, np.inf]
>>> np.sqrt(a)
<stdin>:1: RuntimeWarning: invalid value encountered in sqrt
array([ 2., nan, inf])
>>> np.lib.scimath.sqrt(a)
array([ 2.+0.j,  0.+1.j, inf+0.j])
商开宇
2023-03-14
>>> 9 ** (1/2)
3.0
>>> 9 ** .5  # Same thing
3.0
>>> 2 ** .5
1.4142135623730951

(注意:在Python 2中,1/2被截断为0,因此必须使用1.0/2或类似值强制进行浮点运算。请参见Python为什么对平方根给出“错误”的答案?)

此方法可推广到n根:

>>> 8 ** (1/3)
2.0
>>> import math
>>> math.sqrt(9)
3.0

文件

指数适用于负数和复数,尽管结果略有偏差,我不知道为什么:

>>> (-25) ** .5  # Should be 5j
(3.061616997868383e-16+5j)
>>> 8j ** .5  # Should be 2+2j
(2.0000000000000004+2j)

注意-25上的括号!否则它将被解析为-(25**.5),因为求幂比负数更紧密。

同时,math只为浮点数构建,因此对于x

>>> import cmath
>>> cmath.sqrt(-25)
5j
>>> cmath.sqrt(8j)
(2+2j)

这两个选项都涉及到到到浮点的隐式转换,因此浮点精度是一个因素。例如:

>>> n = 10**30
>>> square = n**2
>>> x = square**.5
>>> x == n
False
>>> x - n  # how far off are they?
0.0
>>> int(x) - n  # how far off is the float from the int?
19884624838656

非常大的数字甚至可能不适合浮点数,您将得到overflowerrror:int太大,无法转换为float。请参阅Python Sqrt限制?

让我们看一下十进制,例如:

除非指数也是十进制的,否则求幂失败:

>>> decimal.Decimal('9') ** .5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for ** or pow(): 'decimal.Decimal' and 'float'
>>> decimal.Decimal('9') ** decimal.Decimal('.5')
Decimal('3.000000000000000000000000000')

同时,mathcmath将分别将其参数静默地转换为floatcomplex,这可能意味着精度损失。

decimal也有自己的。sqrt()。另请参见使用Python3的十进制模块计算n次根

 类似资料:
  • 问题内容: 我需要在sqlite数据库中计算欧几里得距离。 除了编写和加载用于数学函数的动态库外,有人知道如何在sqlite中计算平方根吗? 我快要在这里http://en.wikipedia.org/wiki/Fast_inverse_square_root求助于快速反平方根算法,尽管它可能会变得比我现在需要的更多乐趣。 另外,很高兴弄清楚如何进行幂运算(这是一个普遍的问题,比单独乘以一个数字更

  • 问题内容: 我正在使用Python和Numpy计算任意次数的最佳拟合多项式。我传递了x值,y值以及要拟合的多项式的阶数(线性,二次等)的列表。 这很有效,但是我还想计算r(相关系数)和r- 平方(确定系数)。我正在将我的结果与Excel的最佳拟合趋势线功能及其计算的r平方值进行比较。使用这个,我知道我正在为线性最佳拟合(度等于1)正确计算r平方。但是,我的函数不适用于度数大于1的多项式。 Exce

  • 问题内容: 假设我有一个清单: 我想创建一个计算n天移动平均值的函数。所以如果是5,我希望我的代码计算第一个1-5,将其相加并找到平均值,即3.0,然后继续计算2-6,计算平均值,即4.0,然后3- 7、4-8、5-9、6-10。 我不想计算前n-1天,因此从第n天开始,它将计算前几天。 这似乎可以打印出我想要的内容: 但是,我不知道如何计算这些列表中的数字。有任何想法吗? 问题答案: 旧版本的P

  • 问题内容: k跳过图是一个ngram,它是所有ngram和每个(ki)跳过图直到(ki)== 0(包括0个跳过克)的超集。那么,如何在python中有效地计算这些skipgram? 以下是我尝试过的代码,但未达到预期的效果: 上面的代码无法正确渲染,但是打印后输出如下 [[‘this’,’happened’,’more’],[‘happened’,’more’,’or’],[‘more’,’or’

  • 我想要一个代码,显示某人在语音频道中的完整时间,但我不知道如何启动和停止计数器。

  • 问题内容: 我有一个日期范围,并且每个日期都有一个度量值。我想计算每个日期的指数移动平均值。有人知道怎么做这个吗? 我是python的新手。似乎没有将平均值内置到标准python库中,这让我感到有些奇怪。也许我找的地方不对。 因此,给定以下代码,如何计算日历日期的IQ点的移动加权平均值? (可能是一种更好的数据结构方式,任何建议将不胜感激) 问题答案: 编辑:看来SciKits(补充SciPy的附