Пытаюсь вычислить от Pi до N количество десятичных дробей с помощью C#

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

  •  19-09-2019
  •  | 
  •  

Вопрос

Примечание:Я уже читал эта тема, но я этого не понимаю, и это не дает решения, которое я мог бы использовать.Я ужасно разбираюсь в проблемах с числами.

Какой простой способ сгенерировать число Pi с тем количеством десятичных знаков, которое требуется пользователю?Это не для домашней работы, просто пытаюсь завершить некоторые из перечисленных здесь проектов:

Ссылка

Это было полезно?

Решение

Классический алгоритм вычисления цифр pi — алгоритм Гаусса-Лежандра.Хотя он не так быстр, как некоторые из более современных алгоритмов, у него есть то преимущество, что он понятен.

Позволять

a_0 = 1
b_0 = 1/Sqrt(2)
t_0 = 1/4
p_0 = 1

Затем

a_(n+1) = (a_n + b_n) / 2
b_(n+1) = Sqrt(a_n * b_n)
t_(n+1) = t_n - p_n * (a_n - a_(n+1))^2
p_(n+1) = 2 * p_n

Затем

pi =. (a_n + b_n)^2 / (4 * t_n)

Здесь (=. означает «приблизительно равно») Этот алгоритм демонстрирует квадратичную сходимость (количество правильных десятичных знаков удваивается с каждой итерацией).

Я оставлю вам возможность перевести это на C#, включая открытие арифметической библиотеки произвольной точности.

Другие советы

Тема, о которой вы говорите вычислите значение PI, используя ряд Тейлора.Использование функции «double F (int i)», написанной по этой теме, даст вам значение PI после членов «i».

Этот способ расчета PI довольно медленный, я предлагаю вам взглянуть на Быстрый алгоритм PI.

Вы также можете найти одну реализацию здесь которые позволяют вычислить PI до n-й цифры.

Удачи!

Если вы внимательно ознакомитесь с этим действительно хорошим руководством:

Шаблоны для параллельного программирования:Понимание и применение параллельных шаблонов с .NET Framework 4

Вы найдете на странице 70 эту симпатичную реализацию (с незначительными изменениями с моей стороны).:

static decimal ParallelPartitionerPi(int steps)
{
    decimal sum = 0.0;
    decimal step = 1.0 / (decimal)steps;
    object obj = new object();
    Parallel.ForEach(Partitioner.Create(0, steps),
        () => 0.0,
        (range, state, partial) =>
            {
                for (int i = range.Item1; i < range.Item2; i++)
            {
                decimal x = (i + 0.5) * step;
                partial += 4.0 / (1.0 + x * x);
            }
            return partial;
        },
        partial => { lock (obj) sum += partial; });
    return step * sum;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top