Calculo de pi en alta precisión (aporte)

Iniciado por engel lex, 9 Abril 2014, 08:16 AM

0 Miembros y 2 Visitantes están viendo este tema.

scott_

Cita de: engel lex en 11 Abril 2014, 07:26 AM
do-while: lo que es la arrogancia! XD al final si era el factorial el error! XD (eso creo)
XD pero ahorita está más feo aún pero funciona! y es increiblemente eficiente!

de ahora en adelante publicaré el codigo en el post inicial...  no lo publicaré como un gran bloque sino, cada sección... olvidense de imprimir en archivo y de la modularidad! XD eso aún lo postergo

Gh057: lo había visto! XD pero me tomará otro dia adaptarlo, aunque como tiene similaridad con Ramanujan no se me debría ser tan difícil...


alguna vez vi algo de comentario de código cómicos... este merece uno que vi

Código (cpp) [Seleccionar]
//cuando empeze a hacer esto solo dios y yo sabiamos lo que hacia, en este momento solo dios lo sabe

aqui la correccion de Ramanujan

Código (cpp) [Seleccionar]
string metodo_ramanujan(unsigned long int digitos, long &exponente) {
   digitos/=8;
   digitos*=1.01;
   unsigned long int i, j;
   mpf_t sumatoria, buff_sumatoria, buff_ciclo_superior, buff_ciclo_inferior, primera_parte,
           buff_ciclo_inferior2, factorial_superior, factorial_inferior;
   mpf_init_set_ui(sumatoria, 1103); //sumatoria=0
   mpf_init_set_ui(buff_sumatoria, 0); //buff_sumatoria=0
   mpf_init_set_ui(buff_ciclo_superior, 0); //buff_ciclo_superior=0
   mpf_init_set_ui(buff_ciclo_inferior, 0); //buff_ciclo_inferior=0
   mpf_init_set_ui(primera_parte, 0); //primera_parte=0
   mpf_init_set_ui(buff_ciclo_inferior2, 0); //buff_ciclo_inferior2=0
   mpf_init_set_ui(factorial_superior, 1); //factorial_superior=1
   mpf_init_set_ui(factorial_inferior, 1); //factorial_inferior=1
   mpf_sqrt_ui(primera_parte, 2); //primera_parte=sqrt(2)
   mpf_mul_ui(primera_parte, primera_parte, 2); //primera_parte*=2
   mpf_div_ui(primera_parte, primera_parte, 9801); //primera_parte/=9801
   
   for (i = 1; i <= digitos; i++) {
       for (j = (i - 1)*4 + 1; j <= i * 4; j++) {
           mpf_mul_ui(factorial_superior, factorial_superior, j);
       }
       mpf_set_ui(buff_ciclo_superior, 26390);
       mpf_mul_ui(buff_ciclo_superior, buff_ciclo_superior, i);
       mpf_add_ui(buff_ciclo_superior, buff_ciclo_superior, 1103);
       mpf_mul(buff_ciclo_superior, buff_ciclo_superior, factorial_superior);
       mpf_mul_ui(factorial_inferior, factorial_inferior, i);
       mpf_pow_ui(buff_ciclo_inferior, factorial_inferior, 4);
       mpf_set_ui(buff_ciclo_inferior2, 396);
       mpf_pow_ui(buff_ciclo_inferior2, buff_ciclo_inferior2, 4 * i);
       mpf_mul(buff_ciclo_inferior, buff_ciclo_inferior, buff_ciclo_inferior2);
       mpf_div(buff_sumatoria, buff_ciclo_superior, buff_ciclo_inferior);
       mpf_add(sumatoria, sumatoria, buff_sumatoria);
       
   }
   mpf_mul(sumatoria, sumatoria, primera_parte);
   mpf_ui_div(sumatoria, 1, sumatoria);
   return mpf_get_str(NULL, &exponente, 10, 0, sumatoria);
}


si no fuera tan flojo (y estuviera claro en el tema), intentara hacer operator overload para usar los operadores normales! D:

a partir de ahora modifico el post principal

Disculpa por revivir el post. Muy buen post, en definitiva Pi tiene muchos decimales, que en calculos escolares me basta con 3.1416 xD, Pero jamás entendí la ecuacuón de Ramanujan.
Me volví loco y opté por enender otras, ¿me la puedes explicar con peras y manzanas?  :P

Un Cordial Saludo  ;D
Si no intentas salvar una vida, jamás salvarás la de nadie más

engel lex

Cita de: owl-eyes en 14 Agosto 2014, 02:33 AM
Disculpa por revivir el post. Muy buen post, en definitiva Pi tiene muchos decimales, que en calculos escolares me basta con 3.1416 xD, Pero jamás entendí la ecuacuón de Ramanujan.
Me volví loco y opté por enender otras, ¿me la puedes explicar con peras y manzanas?  :P

Un Cordial Saludo  ;D


que cosa no entendiste? las operaciones en el código?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

scott_

Si no intentas salvar una vida, jamás salvarás la de nadie más

engel lex

lo voy a traducir a codigo en lenguaje "normal"(c++) para que sea más visible

recordaré la formula por cosas paracticas


Código (cpp) [Seleccionar]

unsigned long int i, j;

float sumatoria, buff_sumatoria, buff_ciclo_superior, buff_ciclo_inferior, primera_parte, buff_ciclo_inferior2, factorial_superior, factorial_inferior;

sumatoria=1103;
buff_sumatoria=0;
buff_ciclo_superior=0;
buff_ciclo_inferior=0;
primera_parte=0;
buff_ciclo_inferior2=0;
factorial_superior=1;
factorial_inferior=1;

//sqrt(2)
primera_parte=sqrt(2);

//sqrt(2) * 2
primera_parte*=2;

//sqrt(2)*2 / 9801
primera_parte/=9801

for (i = 1; i <= digitos; i++) {//sabiendo que ramanujan produce 8 digitos con un margen de error de 1% por ciclo, según mis pruebas
        for (j = (i - 1)*4 + 1; j <= i * 4; j++) {
            factorial_superior*=*j;//ciclo acumulador del factorial (4k)!
        }
        //29690 * k
        buff_ciclo_superior= 26390;
        buff_ciclo_superior *= i;

        //(1103 + 29690*k)
        buff_ciclo_superior+=1103;

        //(4k)! * (1103+29690*k)
        buff_ciclo_superior*=factorial_superior;
       
        //(k!)^4
        factorial_inferior*=i;
        buff_ciclo_inferior = pow(factorial_inferior, 4);

        //396^4k
        buff_ciclo_inferior2 = 396;
        buff_ciclo_inferior2 = pow(buff_ciclo_inferior2, 4 * i);
       
        //(k!)^4 * 396^4
        buff_ciclo_inferior*=buff_ciclo_inferior2;

        // (4k)!*(1103+29690*k) / (k!)^4*396^4
        buff_sumatoria = buff_ciclo_superior / buff_ciclo_inferior;

        sumatoria+=buff_sumatoria;//la sumatoria...

    }

    //sqrt(2)*2/9801 * SUMATORIA (4k)!*(1103+29690*k) / (k!)^4*396^4
    sumatoria*=primera_parte;

    // el resultado original es 1/pi, entonces con esto hago la inversión
    sumatoria = 1 / sumatoria;

    //convierte a texto para poder imprimirlo
    return mpf_get_str(NULL, &exponente, 10, 0, sumatoria);




espero que así sea más visible
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

scott_

Mejor  ;D ;D ;D

Que lenguaje C++ si se una gran parte de él  ;-)

Gracias y un Cordial Saludo  ;D
Si no intentas salvar una vida, jamás salvarás la de nadie más

engel lex

Cita de: owl-eyes en 14 Agosto 2014, 03:14 AM
Mejor  ;D ;D ;D

Que lenguaje C++ si se una gran parte de él  ;-)

Gracias y un Cordial Saludo  ;D

es que siempre fue en c++ solo que para poder manejar grandes cifras (al final manejaba 10 millones de digitos (en menos de 5 minutos creo...) descargate la librería y prueba el código e intenta a ver si puedes hacer el que no pude, el de Chudnovsky que lo intenté y se me hizo muy complicado (luego estuve muy saturado de trabajo en la oficina para pensar en esto XD)

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.