Найти тему
Gerpea

Вычисление 3.14 в JavaScript

Оглавление

На сегодняшний день одним из самых быстрых и эффективных алгоритмов для вычисления числа Пи считается алгоритм Чудновского

Принцип этого алгоритма лежал в основе рекорда 2019 года по вычислению числа Пи 31.4 триллиона знака

Алгоритм Чудновского

Формула Чудновского
Формула Чудновского

В итоге опуская все математические преобразования

Получим формулу для вычисления Пи

Формула приближения PI
Формула приближения PI

Для перевода этой формулы в код нам понадобится узнать что такое 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

Но перед этим нужно немного упростить формулу убрав из нее дробную степень

 Формула PI
Формула PI

Перепишем старые определения констант и добавим новые. Заодно вынесем лишние вычисления из метода 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

Подписывайтесь на канал, ставьте лайк
Пишите насколько длинное число удалось получить вам

Наука
7 млн интересуются