【问题标题】:Million decimal places in PythonPython中的百万小数位
【发布时间】:2013-05-18 19:51:13
【问题描述】:

我们最近深入研究了微积分中的无限级数,话虽如此,我从中获得了很多乐趣。我在 python 中导出了我自己的 infinte infinte 系列,并设置为 1 得到 pi/4*4 得到 pi。我知道这不是最快的算法,所以请不要讨论我的算法。我想讨论的是如何在 python 中表示非常非常小的数字。我注意到的是,当我的程序迭代系列时,它会在小数点后 20 位(给或取)处停止。我尝试使用 decimal 模块并且只推到大约 509。我想要一个无限(几乎)表示。

有没有办法做这样的事情?我认为没有任何数据类型能够处理如此庞大的数据,但如果你能告诉我一个解决方法,我将非常感激。

【问题讨论】:

  • 如果它在小数点后 509 位后停止,则表明算法存在缺陷,而不是数据类型。
  • @KenWayneVanderLinde 不,他们只是建议在该模块上使用十进制模块。
  • @JoeyArnoldAndres:你唱的decimal 模块怎么样?您确定您的算法不只是减慢到看起来停止的程度吗?
  • 那是因为您是从float 转换而来的,而那些只会转到大约 1e-308 左右。 >>> Decimal('1e-400')Decimal('1E-400')

标签: python decimal precision pi


【解决方案1】:

Python 的 decimal module 要求您指定“上下文”,这会影响表示的精确度。

我可能会推荐gmpy2 用于这种类型的事情 - 您可以对有理数(任意精度)进行计算并在最后一步转换为十进制。

这是一个示例 - 根据需要替换您自己的算法:

import gmpy2
# See https://gmpy2.readthedocs.org/en/latest/mpfr.html
gmpy2.get_context().precision = 10000
pi = 0
for n in range(1000000):
    # Formula from http://en.wikipedia.org/wiki/Calculating_pi#Arctangent
    numer = pow(2, n + 1)
    denom = gmpy2.bincoef(n + n, n) * (n + n + 1)
    frac = gmpy2.mpq(numer, denom)
    pi += frac
    # Print every 1000 iterations
    if n % 1000 == 0:
        print(gmpy2.mpfr(pi))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2015-02-02
    • 2014-12-12
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    相关资源
    最近更新 更多