【问题标题】:i need more decimal places for pi calculation [closed]我需要更多小数位来计算 pi [关闭]
【发布时间】:2021-12-18 19:50:42
【问题描述】:

我正在尝试用 python 制作一个 Pi 计算器,但我需要更多的小数位。

如果有人编辑了我的代码并仔细解释了他们所做的事情,那将会很有帮助。

这是我正在使用的代码。

import math
d = 0
ans = 0
display = 0
while True:
    display += 1
    d += 1
    ans += 1/d**2
    if display == 1000000:
        print(math.sqrt(ans*6))
        display = 0
    # displays value calculated every 1m iterations

大约 85m 次迭代后的输出:(3.14159264498239)

我需要超过 15 个小数位 (3.14159264498239........)

【问题讨论】:

  • 与什么相比更多?你的实际要求是什么?此外,您通常会使用while True 来代替while loop == loop 进行无限循环。
  • 我在输出中需要更多小数位,因为我在计算一个看似无限多的值。
  • 您不能期望 Stack Overflow 用户下载并运行您的代码(在一般情况下)。你应该清楚地表明你的实际和期望的结果是什么。
  • 看看decimal
  • @JonSG 这只是问题的一部分。即使使用 python 的正常浮点精度,该系列的效率也极低。在 1200 万次迭代中,序列只能精确到 6 位,python 可以毫无问题地表示。

标签: python decimal floating-accuracy pi


【解决方案1】:

对于 π²∕6,您使用的是一个非常缓慢收敛的级数,因此您不会通过这种方式获得非常精确的值。浮点限制阻止了3.14159264498239 之后的进一步进展,但无论如何,你不会在任何合理的时间内取得进一步进展。您可以通过一些组合来解决这些问题

  • 微优化您的代码,

  • 存储值列表,将其反转并使用math.fsum

  • 使用decimal.Decimal

  • 使用更好的系列(如this one),

  • 使用快速收敛到 π 值的方法,而不是一系列(如this one),

  • 使用 PyPy,或者比 Python 更快的语言,

  • from math import pi.

【讨论】:

    【解决方案2】:

    您可以尝试使用生成器:

    def oddnumbers():
        n = 1
        while True:
            yield n
            n += 2
    
    
    def pi_series():
        odds = oddnumbers()
        approximation = 0
        while True:
            approximation += (4 / next(odds))
            yield approximation
            approximation -= (4 / next(odds))
            yield approximation
    
    
    approx_pi = pi_series()
    
    for x in range(10000000):
        print(next(approx_pi))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2021-04-29
      • 2013-11-02
      • 1970-01-01
      • 2011-05-07
      相关资源
      最近更新 更多