【发布时间】:2015-03-24 21:46:50
【问题描述】:
我在 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*x(201 位)大于 n(200 位)。这里发生了什么?有什么概念我在这里弄错了吗?我还能如何找到非常大的数字的根?
【问题讨论】:
-
把
x=int(math.sqrt(n))改成x=math.sqrt(n)试试看 -
它以指数形式给出与 1e+100 相同的答案。
-
math.sqrt()返回一个受 IEEE 754 算法约束的浮点值,而不是 bignum。 -
要处理如此大的数字,您应该查看标准的
decimal模块,或第3 方mpmath模块。或者,如果您只想要一个整数平方根,您可以使用Babylonian method 编写一个,也就是英雄方法,这是牛顿方法的一个特例。
标签: python long-integer