Как подсчитать число π (пи) с очень большой точностью (до 10000 знаков)?

Как подсчитать число π (пи) с очень большой точностью (до 10000 знаков)?


Ответы (2 шт):

Автор решения: Fox Fox

Готовый консольный скрипт:

import os

print("-" * 50 + "\nВычисление числа Пи с точностью до n знаков после запятой:\n" + "-" * 50)

ok = True

try: import mpmath
except Exception as e: print(f"Ошибка импорта модуля! Подробнее:\n{e}"); ok = False

if ok:

 # Устанавливаем точность до 10000 знаков:
 mpmath.mp.dps = 10000

 # Выводим число Пи:
 print(f"\nЧисло Пи с точностю до {mpmath.mp.dps} знаков после запятой:\n\n", mpmath.mp.pi)

print("\nНажмите любую клавишу для продолжения...")
os.system("pause > nul" if os.name == "nt" else "read > /dev/null")
→ Ссылка
Автор решения: Stanislav Volodarskiy

Стандартный модуль decimal реализует вещественную арифметику произвольной точности. В разделе Recipes есть код функции pi(), который вычисляет π с установленной точностью. После небольшой доработки получилась программа:

import decimal


def pi():
    with decimal.localcontext() as ctx:
        ctx.prec += 2
        prev_s = 0
        t = decimal.Decimal(3)
        s = 3
        n = 1
        na = 0
        d = 0
        da = 24
        while s != prev_s:
            prev_s = s
            n += na
            na += 8
            d += da
            da += 32
            t = t * n / d
            s += t
    return +s


p = int(input())
with decimal.localcontext() as ctx:
    ctx.prec = p
    print(pi())
$ echo 3 | python pi.py
3.14

$ echo 10 | python pi.py
3.141592654

$ echo 20 | python pi.py
3.1415926535897932385

$ echo 10000 | python pi.py
3.1415926535...5525637568

В основе программы лежит тождество (arcsine approximation of π)

π = 6 arcsin(1/2)

Арксинус представляется рядом Тейлора (Maclaurin expansion of arcsin x):

arcsin x = ∑n≥0 (2nn) x2n+1 / (4n(2n + 1))

→ Ссылка