Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: cypascal en 30 Marzo 2013, 15:02 pm



Título: [C] Calcular 10.000 decimales de pi
Publicado por: cypascal en 30 Marzo 2013, 15:02 pm
He visto que había un tema abierto sobre el cálculo de PI, pero no dejaba comentar, así que abro éste.
Llevaba un tiempo queriendo calcular grandes cantidades de dígitos de Pi, pero siempre me encontraba con la misma limitación, no se puede trabajar en coma flotante. Así que decidí indagar por la red, y me encontré con un algoritmo que permite el cálculo de los dígitos de Pi por separado y de manera muy rápida. Este método se conoce como "Spigot Algorithm", y se basa a grosso modo en trabajar en una base distinta a la decimal.
Si queréis más información sobre el algorítmo y el código, con su ejecución y una salida, les dejo este enlace:

http://cypascal.blogspot.com.es/2013/03/calcular-pi.html (http://cypascal.blogspot.com.es/2013/03/calcular-pi.html)

Yo he comprobado que los decimales son correctos hasta 10.000, pero supongo que se puede llegar a bastantes más. El tiempo de ejecución es muy pequeño, menor de un segundo.

Aquí también el código:

Código:
#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");
}

Si conocen algoritmo que también consiga gran cantidad de dígitos, y que no sea demasiado complicado de implementar, díganmelo, que es un tema que siempre me ha interesado.

Salu10.


Título: Re: [C] Calcular 10.000 decimales de pi
Publicado por: imoen en 30 Marzo 2013, 16:09 pm
Hola

si te gusta esto, prueba a calcular numeros primo de merseine :) o como se escriba

bs imoen


Título: Re: [C] Calcular 10.000 decimales de pi
Publicado por: avesudra en 30 Marzo 2013, 18:06 pm
Si puedes implementar este:
Algoritmo de Chudnovsky (http://es.wikipedia.org/wiki/Algoritmo_de_Chudnovsky)
El cual se usó para escribir este programa que no sé cuantos dígitos calcula pero muchos muchos usando la librería GMP:
http://gmplib.org/pi-with-gmp.html dale donde pone this program , porque es que no sé poner el enlace directo.
merseine :) o como se escriba
Mersenne  ;)


Título: Re: [C] Calcular 10.000 decimales de pi
Publicado por: cypascal en 30 Marzo 2013, 22:08 pm
Conocía ese algoritmo, (que es el que se usa en la actualidad) pero me topaba otra vez con el problema de la precisión. Con la biblioteca gmp efectivamente se evita, y se puede calcular con ese algoritmo, y probablemente obtengas una burrada (pero burrada burrada ¿10^20 dígitos?) de dígitos. El problema que tengo es que no consigo ejecutar la librería gmp

Salu10.


Título: Re: [C] Calcular 10.000 decimales de pi
Publicado por: avesudra en 30 Marzo 2013, 22:17 pm
El problema que tengo es que no consigo ejecutar la librería gmp

Salu10.
¿Ejecutarla? Será compilarla y enlazarla ¿no? Para eso escribí hace poco un tutorial:

http://underc0de.org/foro/c-c/%28tutorial%29como-compilar-gmp-5-1-0%28the-gnu-multiple-precision-arithmetic-library%29/

Aquí tienes un tuto mío más antiguo y menos gráfico aunque explica como configurarla en codeblocks:

http://www.mediafire.com/?v7b076oohh0cav8


Título: Re: [C] Calcular 10.000 decimales de pi
Publicado por: cypascal en 30 Marzo 2013, 22:39 pm
Muchas gracias por los enlaces, probare mañana que tendré tiempo y ya te contaré a ver que tal, a ver si esta vez lo consigo, porque ya he estado mirando, en este enlace:

http://suchideas.com/journal/2007/07/installing-gmp-on-windows/ (http://suchideas.com/journal/2007/07/installing-gmp-on-windows/)

y me fallaba el paso 4.IV donde dice que hay que ejecutar un .exe de los ficheros que te descargas de la biblioteca.

Probaré con los tuyos, muchas gracias!!

Salu10.