NADA de tomas aéreas he dicho! XD
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes Menú
sumatoria = factorial = 1;
for(i=1;i<ciclos;i++){
factorial *= i/(i*2+1);
sumatoria += factorial;
}
sumatoria *=2;
pi = sumatoria
#include <iostream>
#include <stdlib.h>
#include <string>
#include <gmp.h>
#include <gmpxx.h>
#include <time.h>
#include <sstream>
using namespace std; // :P
string metodo_euler(unsigned long int digitos, mp_exp_t &exponente);
string metodo_ramanujan(unsigned long int digitos, mp_exp_t &exponente);
void imprimir_pi_aux(string pi, mp_exp_t exponente, int digitos);
int main(int argc, char **argv) {
unsigned long int digitos = strtol(argv[1], NULL, 10); //argv a int
mpf_set_default_prec(32 * 10 * (digitos / 100) * 1.11); //precision + 10%
long exponente;
clock_t start = clock();
string pi;
int metodo = 0;
int i = 1;
for (i = 0; i < argc; i++) {
if (argv[i][0] == '-') {
switch (argv[i][1]) {
case 'e':
metodo = 0;
break;
case 'r':
metodo = 1;
break;
}
}
}
switch (metodo) {
case 0:
cout << "imprimiendo por metodo Euler, " << digitos * 3 * 1.12 << " ciclos"<<endl;
pi = metodo_euler(digitos, exponente);
break;
case 1:
cout << "imprimiendo por metodo Ramanujan, " << (int) (digitos / 8 * 1.01) << " ciclos"<<endl;
pi = metodo_ramanujan(digitos, exponente);
break;
}
clock_t end = clock();
imprimir_pi_aux(pi, exponente, digitos);
cout << "\ntiempo total de ejecucion: " << (float) (end - start) / CLOCKS_PER_SEC << "\n";
cout << "tiempo total de impresion: " << (float) (clock() - end) / CLOCKS_PER_SEC << "\n\n";
return 0;
}
void imprimir_pi_aux(string pi, long exponente, int digitos) {
cout << "Pi: ";
stringstream aux;
unsigned long int i;
if (exponente <= 0) {
cout << "0.";
while (exponente < 0) {
cout << 0;
exponente++;
}
} else {
for (i = 0; i < exponente; i++) {
cout << pi[i];
}
cout << ".\n\n1:\t";
}
for (i = exponente; i < digitos + 1; i++) {
aux << pi[i];
if ((i - exponente + 1) % 10 == 0) aux << ' ';
if ((i - exponente + 1) % 500 == 0) aux << endl;
if ((i - exponente + 1) % 50 == 0 && i < digitos) aux << endl << i + 1 << ":\t";
}
aux << endl;
cout << aux.str();
}
string metodo_euler(unsigned long int digitos, long &exponente) {
digitos /= 100; //trabaja con lotes de 100
unsigned long int precision = digitos * 100 * 3 * 1.12;
unsigned long int x, i;
mpf_t factorial, sumatoria, buff_factorial; //variables GMP
mpf_init_set_ui(factorial, 1); //factorial=1
mpf_init_set_ui(sumatoria, 1); //sumatoria=1
mpf_init_set_ui(buff_factorial, 1); //buff_factorial=1
for (x = 1; x < precision; x++) {
i = 2 * x + 1;
mpf_set_ui(buff_factorial, x); //buff_factorial=x
mpf_div_ui(buff_factorial, buff_factorial, i); //buff_factorial*=i
mpf_mul(factorial, factorial, buff_factorial); //factorial*=buff_factorial
mpf_add(sumatoria, sumatoria, factorial); //sumatoria+=factorial
}
mpf_mul_ui(sumatoria, sumatoria, 2); //sumatoria*=2
return mpf_get_str(NULL, &exponente, 10, 0, sumatoria);
}
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);
}