Пытаюсь вычислить от Pi до N количество десятичных дробей с помощью C#
Вопрос
Примечание:Я уже читал эта тема, но я этого не понимаю, и это не дает решения, которое я мог бы использовать.Я ужасно разбираюсь в проблемах с числами.
Какой простой способ сгенерировать число 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-й цифры.
Удачи!
Если вы внимательно ознакомитесь с этим действительно хорошим руководством:
Вы найдете на странице 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;
}