Tratando de calcular Pi a número N de decimales con C #
Pregunta
Nota: ya he leído este tema , pero yo no lo entiendo y no proporciona una solución que podría utilizar. Soy terrible con problemas de números.
¿Qué es una forma sencilla de generar Pi a qué número de decimales que un usuario quiera? Esto no es para hacer la tarea, tratando de completar algunos de los proyectos enumerados aquí:
Solución
Un algoritmo clásico para el cálculo de dígitos de pi
es el algoritmo de Gauss-Legendre. Si bien no es tan rápido como algunos de los algoritmos más modernos que tiene la ventaja de ser comprensible.
Let
a_0 = 1
b_0 = 1/Sqrt(2)
t_0 = 1/4
p_0 = 1
Entonces
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
Entonces
pi =. (a_n + b_n)^2 / (4 * t_n)
Aquí (significa =.
"aproximadamente igual a") Este algoritmo exhibe convergencia cuadrática (el número de cifras decimales correctas duplica con cada iteración).
Lo dejo a usted para traducir esto a C # incluyendo el descubrimiento de una biblioteca de precisión arbitraria aritmética.
Otros consejos
El tema que estás hablando calcular el valor de PI utilizando la serie de Taylor. Utilizando la función de "doble F (int i)" escrito sobre ese tema le dará el valor de PI después de la "i" términos.
Esta forma de calcular PI es un poco lento, te sugiero que mirar el PI algoritmo rápido .
También se puede encontrar una implementación aquí que conseguir la PI a calcular la enésima dígito.
Buena suerte!
Si usted toma una mirada cercana a esta muy buena guía:
Patronesde Programación Paralela : Comprensión y aplicación de patrones en paralelo con .NET Framework 4
que encontrará en la página 70 de este lindo aplicación (con pequeños cambios de mi lado):
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;
}