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

在python中对长数字使用数学模块的sqrt函数

冯玮
2023-03-14

我在python中使用的是200位数字。当用数学求一个数的平方根时。我得到了一个错误的答案。

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的值将大于预期值。这里发生了什么?有没有什么概念我弄错了?我怎样才能找到非常大的数的根呢?

共有3个答案

袁翔
2023-03-14

这是一个使用Hero方法的整数平方根程序,我不久前写的。对于初始近似,它使用输入值位长度的一半,因此它开始非常快地收敛。但是,我并没有对它进行计时,看看它在Python中是否比使用更简单的初始近似更快

#! /usr/bin/env python

''' Long integer square roots. Newton's method.

    Written by PM 2Ring. Adapted from C to Python 2008.10.19
'''

import sys

def root(m):
    # Get initial approximation
    n, a, k = m, 1, 0
    while n > a:
        n >>= 1
        a <<= 1
        k += 1
        #print k, ':', n, a

    # Go back one step & average
    a = n + (a>>2)
    #print a

    # Apply Newton's method
    while k:
        a = (a + m // a) >> 1
        k >>= 1
        #print k, ':', a
    return a

def main():
    m = len(sys.argv) > 1 and int(sys.argv[1]) or 2*10L**100
    print "The Square Root of", m
    print root(m)

if __name__ == '__main__':
    main()
终逸仙
2023-03-14

math.sqrt返回IEEE-754 64位结果,大约是17位。还有其他库将使用高精度值。除了上面提到的decimalmpma库之外,我还维护了gmpy2库(https://code.google.com/p/gmpy/)。

>>> import gmpy2
>>> n=gmpy2.mpz(99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999982920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000726067)
>>> gmpy2.get_context().precision=2048
>>> x=gmpy2.sqrt(n)
>>> x*x
mpfr('99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999982920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000726067.0',2048)
>>>

gmpy2库还可以返回整数平方根(isqrt),或者快速检查整数是否为正平方(为平方)。

孟沛
2023-03-14

使用十进制模块:

import decimal
D = decimal.Decimal
n = D(99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999982920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000726067)

with decimal.localcontext() as ctx:
    ctx.prec = 300
    x = n.sqrt()
    print(x)
    print(x*x)
    print(n-x*x)

产量

9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999145.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999983754999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999998612677

99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999982920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000726067.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0E-100
 类似资料:
  • 本文向大家介绍Python的math模块中的常用数学函数整理,包括了Python的math模块中的常用数学函数整理的使用技巧和注意事项,需要的朋友参考一下 在数学之中,除了加减乘除四则运算之外——这是小学数学——还有其它更多的运算,比如乘方、开方、对数运算等等,要实现这些运算,需要用到 Python 中的一个模块:Math 模块(module)是 Python 中非常重要的东西,你可以把它理解为

  • 问题内容: 在Python程序中,给定带有函数名称的字符串的最佳方法是什么。例如,假设我有一个模块,我有一个内容为的字符串。最好的通话方式是什么? 我需要获取函数的返回值,这就是为什么我不只是使用。我想出了如何通过使用eval定义一个返回该函数调用结果的函数来执行此操作的方法,但是我希望有一种更优雅的方法来执行此操作。 问题答案: 假设模块与方法: 你可以将第2行和第3行缩短为: 如果这对你的用例

  • 本文向大家介绍Python函数和模块的使用总结,包括了Python函数和模块的使用总结的使用技巧和注意事项,需要的朋友参考一下 函数和模块的使用 在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解。 $$x_1 + x_2 + x_3 + x_4 = 8$$ 事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案。想到这一点问题的答案就呼之欲出了。 $

  • Python3 数字 描述 sqrt() 方法返回数字x的平方根。 语法 以下是 sqrt() 方法的语法: import math math.sqrt( x ) 注意:sqrt()是不能直接访问的,需要导入 math 模块,通过静态对象调用该方法。 参数 x -- 数值表达式。 返回值返回数字x的平方根。 实例 以下展示了使用 sqrt() 方法的实例: #!/usr/bin/pytho

  • 如果你取一个数字,取它的平方根,去掉小数点,然后把它提高到二次方,结果应该总是小于或等于原来的数字。 这在python中似乎是正确的,直到你出于某种原因在上尝试它。 它看起来像是数学。pow(数学楼层(数学sqrt(99999999999999975425)),2)返回。 我假设这与我们在python中存储值的方式有关...一些与浮点算术相关的东西,但我不能具体解释这是如何影响这种情况的。

  • 问题内容: 因此,我尝试将使用ctypes模块将为处理Windows上的结点/符号链接/等而编写的python C扩展移植到纯Python。不幸的是,由于我以前对ctypes的使用非常有限,所以我认为我可能在某个地方犯了一个错误,导致我的代码无法正常运行。到目前为止,这是我所拥有的: 当前,在运行时,该代码为目标联结创建一个文件夹。(在这种情况下,请进行测试)甚至似乎正在应用reparse标签向系