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í:

Enlace

¿Fue útil?

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:

Patrones

de 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top