Вычисление π с “бесконечной” двоичной точностью в C#

StackOverflow https://stackoverflow.com/questions/1524057

  •  19-09-2019
  •  | 
  •  

Вопрос

Пока что похоже, что базовое уравнение Фабриса Белларда № 2 - это правильный путь

alt text

По иронии судьбы для этого потребуется тип 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)

Математическую основу, которая оправдывает эту реализацию, можно найти в:

Алгоритм Spigot для цифр числа Pi

Википедия подробно описывает множество способов получения численных приближений числа пи здесь.Они также дают некоторый пример псевдокода

Редактировать :Если вы заинтересованы в такого рода математических задачах, не имея какой-либо связанной с ними реальной проблемы для решения (что, безусловно, является хорошим отношением, ИМХО), вы могли бы посетить Страница проекта Эйлера

Существует такая возможность обрабатывать большие рациональные числа в DLR- динамические языки на основе (например Железный Питон).Или вы можете использовать любую переносимую реализацию больших действительных чисел на C / C ++ с помощью P/Вызвать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top