jueves, 28 de marzo de 2013

Calcular Numero PI en C/C++ | 10000 decimales


Después de varias veces proponiéndome calcular el número Pi por distintos métodos (Montecarlo, sucesiones, aproximaciones geométricas...) por fin he encontrado un Método que permite el cálculo de miles de dígitos de Pi con un computador doméstico, y en pocos segundos, y lo mejor de todo, sin necesidad de precisión en las variables de trabajo.
Existen numerosos métodos para calcular el número Pi, la mayoría de ellos basados en largas sucesiones, con términos que van tendiendo a cero, y que por lo tanto, complican el trabajo al ordenador, e impiden calcular gran cantidad de dígitos. Estos métodos, trabajan con coma flotante, con lo que la cantidad de dígitos viene limitada.
Aquí les voy a presentar un método, relativamente reciente, denominado "Spigot Algorithm", y que permite el cálculo de los distintos dígitos de Pi por separado. Este método fue durante un tiempo, el óptimo, pero en la actualidad existen otros métodos (mucho más complejos, y que trabajan con codificación binaria o hexadecimal) que o superan con creces. Sin embargo, creo que sigue teniendo un alto interés, puesto que permite a cada uno de nosotros, con un PC normal, calcular gran cantidad de dígitos (yo he probado hasta 10.000 dígitos de pi, pero seguro que se pueden más) de este número mágico.
Existen documentos en la red que lo explican detalladamente, pero a grandes rasgos, se trata únicamente de cambiar la base de trabajo, de decimal, a la base establecida por las diferentes sucesiones que convergen a Pi.

Aquí les dejo el código escrito en C, aunque también se puede encontrar en Pascal en el enlace de más abajo:

#include <stdio.h>

const int n=10000;
const int dim=((10*n)/3);
int i,j,k, resto, digant, nueves, aux;
int pi[dim+1];

int main (void)
{
    for (i=1;i<=dim;i++) pi[i]=2;
    nueves=0; digant=0;
    for (i=1;i<=n;i++)
    {
        resto=0;
        for (j=dim;j>=1;j--)
        {
            aux=10*pi[j]+resto*j;
            pi[j]=aux % (2*j-1);
            resto=aux/(2*j-1);
        }
        pi[1]=resto % 10;
        resto=resto/10;
        if (resto==9) nueves++;
        else if (resto==10)
        {
             printf("%i",digant);
             for (k=1;k<=nueves;k++) printf("0");
             digant=0;
             nueves=0;
        }
        else
        {
            printf("%i",digant);
            digant=resto;
            if (nueves!=0)
            {
                for(k=1;k<=nueves;k++) printf("9");
                nueves=0;
            }
        }
    }
    printf("%i",digant);
    scanf("%i");
}


Enlace interesante con el programa escrito en Pascal:

http://www.mathpropress.com/stan/bibliography/spigot.pdf

Y aquí una captura de pantalla:



Aquí tienen otro programa con cierto parecido, pero para el cálculo de PI

Un saludo.

2 comentarios:

  1. Hola una pregunta urgente
    Como harías un programa en c++ para obtener pi por la serie de euler

    ResponderEliminar
  2. Disculpe cómo se abría un seudocodigos aplicando el método del polígono

    ResponderEliminar