Вычисление π с “бесконечной” двоичной точностью в C#
Вопрос
Пока что похоже, что базовое уравнение Фабриса Белларда № 2 - это правильный путь
По иронии судьбы для этого потребуется тип BigReal;есть ли у нас это для .Net?.Net 4.0 имеет BigInteger.
У кого-нибудь есть версия на Хаскелле?
Решение
Поскольку вы запрашиваете версию на Хаскелле, вот документ автор Ежи Карчмарчук, названный "Самым ненадежным методом в мире для вычисления π":
Эта статья представляет собой нетипичное упражнение по ленивому функциональному кодированию, написанное для развлечения и обучения.Это может быть прочитано и понято любым, кто разбирается в языке программирования Haskell.Мы покажем, как реализовать Формулу Бейли-Борвейна-Плоу для π корекурсивным, инкрементным способом который выдает цифры 3, 1, 4, 1, 5, 9...до воспоминаний истощение.Это не способ продолжить, если кому-то нужно много цифр!Наша стратегия кодирования порочна и опасна, и она доказуемо терпит неудачу.Он основан на арифметике в области бесконечных последовательностей цифр представляющих правильные дроби в развернутом виде в целочисленной основе.Мы показываем, как манипулировать:складывать, умножать на целое число и т.д.такие последовательности от слева направо до бесконечности, что, очевидно, не может работать во всех случаях из-за двусмысленностей.Некоторые глубокие философские следствия обсуждаются в выводах.
На самом деле это не решает проблему эффективным или очень практичным способом, но развлекает и показывает некоторые проблемы с ленивой арифметикой бесконечной точности.
Тогда есть еще эта статья Джереми Гиббонса.
Другие советы
Безусловно, мой любимый кран Haskell для pi принадлежит Джереми Гиббонсу:
pi = g(1,0,1,1,3,3) where
g(q,r,t,k,n,l) =
if 4*q+r-t<n*t
then n : g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l)
else g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)
Математическую основу, которая оправдывает эту реализацию, можно найти в:
Википедия подробно описывает множество способов получения численных приближений числа пи здесь.Они также дают некоторый пример псевдокода
Редактировать :Если вы заинтересованы в такого рода математических задачах, не имея какой-либо связанной с ними реальной проблемы для решения (что, безусловно, является хорошим отношением, ИМХО), вы могли бы посетить Страница проекта Эйлера
Существует такая возможность обрабатывать большие рациональные числа в DLR- динамические языки на основе (например Железный Питон).Или вы можете использовать любую переносимую реализацию больших действительных чисел на C / C ++ с помощью P/Вызвать.