[C] Calcular 10.000 decimales de pi

Iniciado por cypascal, 30 Marzo 2013, 15:02 PM

0 Miembros y 1 Visitante están viendo este tema.

cypascal

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

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:

#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.
Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES

imoen

Hola

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

bs imoen
Medion Akoya p6624
i-3 370
8 gigas DDR 3 RAM //750 hd 5400
gforce gt425 optimus XDD
Esta es mi casa, mi pueblo , o lo que queda de el aun asi lucharemos ... POR BENALIA....!!

srta imoen

avesudra

#2
Si puedes implementar este:
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.
Cita de: imoen en 30 Marzo 2013, 16:09 PM
merseine :) o como se escriba
Mersenne  ;)
Regístrate en

cypascal

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.
Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES

avesudra

#4
Cita de: cypascal en 30 Marzo 2013, 22:08 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
Regístrate en

cypascal

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/

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.
Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES