На сегодняшний день одним из самых быстрых и эффективных алгоритмов для вычисления числа Пи считается алгоритм Чудновского
Принцип этого алгоритма лежал в основе рекорда 2019 года по вычислению числа Пи 31.4 триллиона знака
Алгоритм Чудновского
В итоге опуская все математические преобразования
Получим формулу для вычисления Пи
Для перевода этой формулы в код нам понадобится узнать что такое Q и T
Q и T - Математические функции которые выражаются как
Выглядит немного запутано, но давайте по порядку
Определим константы
Реализуем алгоритм вычисления P, Q и T
Вычислить Пи
Необходимо решить до какого знака после запятой мы будем считать. Данный алгоритм при каждой итерации позволяет нам находить 14.1816474627... значащих знаков
Можете попробовать посчитать сами
После расчета значения вынесем его в константу
Наконец мы готовы считать знаки после запятой
Напишем функцию для расчета Пи
Так же нам понадобиться проверить результат
> node pi_result.js
3.1415926535897935600871733186
Время работы алгоритма: 0s 0.139102ms
Ура? Ошибка!
Мы смогли найти интересующее нас количество знаков, можно вздохнуть спокойно и пойти применять полученное значение на практике
Но если присмотреться повнимательнее, то можно найти ошибку
Сравним
3.1415926535897935600871733186
3.1415926535897932384626433832
Первое значение получено нами, второе взято из интернета
Расхождение начинается после 15 знака. Именно столько значящих знаков имеет тип double в JavaScript
Работа над ошибками
Для вычисления большего количество знаков нам понять как работать с большими числами в JS
Для этой цели может подойти библиотека для работы с большими числами BigNumber.js
Но перед этим нужно немного упростить формулу убрав из нее дробную степень
Перепишем старые определения констант и добавим новые. Заодно вынесем лишние вычисления из метода compute_PQT
Перепишем наши функции вычисления
Вторая попытка
> node pi_result.js
3.1415926535897932384626433833
Время работы алгоритма: 0s 3.432017ms
Заметим что время работы алгоритма стало больше, это особенность хранения чисел в строках
Сравним
3.1415926535897935600871733186
3.1415926535897932384626433833
3.1415926535897932384626433832
Отлично
Отличается только последняя цифра и происходит это потому что при выводе мы используем toFixed, который округляет число в большую сторону при переводе в строку
Еще одна проблема
RangeError: Maximum call stack size exceeded
Эта ошибка возникает когда у среды исполнения node.js переполняется стэк вызовов
Избежать ее можно предоставив среде исполнения возможность очистить стэк
Полный код программы можно найти на GitHub
Подписывайтесь на канал, ставьте лайк
Пишите насколько длинное число удалось получить вам