- 此问题在此处已有答案**:
Integer square root in python(15个答案)
17小时前关门了。
我在python中处理200位数的数字。当使用math. sqrt(n)求一个数字的平方根时,我得到了一个错误的答案。
In[1]: n=9999999999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999998292000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000726067
In[2]: x=int(math.sqrt(n))
In[3]: x
Out[1]: 10000000000000000159028911097599180468360808563945281389781327
557747838772170381060813469985856815104L
In[4]: x*x
Out[2]: 1000000000000000031805782219519836346574107361670094060730052612580
0264077231077619856175974095677538298443892851483731336069235827852
3336313169161345893842466001164011496325176947445331439002442530816L
In[5]: math.sqrt(n)
Out[3]: 1e+100
由于x * x(201位数)大于n(200位数),x的值将大于预期值,这里发生了什么?我在这里犯了什么错误吗?我还能如何找到非常大的数的根?
4条答案
按热度按时间hl0ma9xz1#
使用the decimal module:
收益率
fnvucqvd2#
math.sqrt
返回IEEE-754 64位结果,大约为17位,还有其他库可以处理高精度值,除了上面提到的decimal
和mpmath
库之外,我还维护gmpy2
库(https://code.google.com/p/gmpy/)。gmpy2
库还可以返回整数平方根(isqrt
)或快速检查整数是否为精确平方(is_square
)。o2gm4chl3#
这是一个整数平方根程序,使用了我不久前写的Hero方法,初始近似值是输入值位长的一半,所以收敛速度很快,但是,我还没有计时,看看在Python中它是否比使用更简单的初始近似值更快。
vdzxcuhz4#
你可以用python3 Num类(包num7)找到非常大的数的根,如下所示: