我需要计算一个数字的平方根,例如√9=3
或√2=1.4142
。我如何用Python实现它?
输入可能都是正整数,并且相对较小(比如说不到10亿),但万一不是,有什么东西可能会断裂吗?
注:这是在元讨论一个现有的标题相同的问题后,试图提出一个规范问题。
相关的
根据您的目标,尽可能长时间地延迟平方根的计算可能是个好主意。症状可能会有帮助。
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
>>> 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])
>>> 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')
同时,math
和cmath
将分别将其参数静默地转换为float
和complex
,这可能意味着精度损失。
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的附