[C] Calcolo pi greco

Shebang
Salve a tutti, ho voluto pubblicare qui un semplicissimo programma scritto in C che sfrutta una sommatoria molto potente che, con poche iterazioni, da una buonissima espansione decimale di pi greco.
Lo pubblico perchè in rete si trova gran poco di autorevole, il resto sono solo codici scritti male o poco efficienti.
Ma non è l'unico motivo; dato che non ho mai approfondito molto il linguaggio, non saprei come impostare il programma per avere una precisione arbitraria nell'espansione delle cifre decimali, per il limite di memoria delle variabili double.
Vorrei poter printare un numero arbitrario di cifre decimali senza limiti di memoria, come posso aggirare l'ostacolo?
Io pensavo a degli array gestiti da un realloc dove ogni elemento i-esimo è un valore decimale, ma non saprei...

Ecco qui il codice:
/* Compilare con -lm.
Piccolo programma di esempio sull'uso delle sommatorie, cicli e condizioni per il calcolo ottimizzato di pi greco
*/

#include <math.h>
#include <stdio.h>

int main() {

long long int i;
double k;
double sum;
sum = 0;


printf("\nCoded by Shebang");
printf("\nFirenze 2015\n");


   printf("\nQuesto programma approssima il valore di Pi greco con una rapida espansione decimale grazie ad una sommatoria\nche converge al valore di pi greco molto velocemente denominata Bailey-Borwein-Plouffe, scoperta nel 1995.\n");
   printf("\nInserisci il numero di iterazioni (ì) per approssimare Pi greco con la sommatoria BBP: ");
   scanf("%lld", &i);

   if(i<=0){
   printf("Devi inserire un numero di iterazioni maggiori di 0. \n\n");
      }
   else{

      for(k=0; k<i; k++){
      sum = sum + ((4/(8*k+1))-(2/(8*k+4))-(1/(8*k+5))-(1/(8*k+6)))*(1/(pow(16,k)));
      }

      printf("\nIl valore di Pi greco calcolato per il numero di iterazioni specificato nella sommatoria è:\n %0.100lf \n\n", sum);

      }
return 0;
}

Risposte
Shebang
Sono riuscito ad ottimizzare il codice di 65 byte non implementando la libreria math.h con un amico, posto il codice:
#include <stdio.h>

int main() {

long long int i;
double k;
double sum;
long long int z;
double var;
var = 16;
sum = 0;

printf("\nCoded by Shebang");
printf("\nFirenze 2015");
printf("\n(versione ottimizzata)\n");

    printf("\nQuesto programma approssima il valore di Pi greco con una rapida espansione decimale grazie ad una sommatoria\nche converge al valore di pi greco molto velocemente denominata Bailey-Borwein-Plouffe, scoperta nel 1995.\nIn più non è stata implementata la libreria math.h ottimizzando di 65 byte l'eseguibile\nma rendendo il numero di iterazioni possibili inferiori per le limitazioni di memoria.\n");
    printf("\nInserisci il numero di iterazioni (ì) per approssimare Pi greco con la sommatoria BBP: ");
    scanf("%lld", &i);

    if(i<=0){
    printf("Devi inserire un numero di iterazioni maggiori di 0. \n\n");
        }
    else{

       
/* Adesso un for per inizializzare la sommatoria e salvare il valore di pi greco */

        var = 1; // 16^0
        for(k=0; k<i; k++){
            sum = sum + ((4/(8*k+1))-(2/(8*k+4))-(1/(8*k+5))-(1/(8*k+6)))*(1./var);
            var *= 16; // Calcolo il valore di var da usare nell'iterazione successiva; sostituisce il pow(16, k) che aveva bisogno di math.h
        }

        printf("\nIl valore di Pi greco calcolato per il numero di iterazioni specificato nella sommatoria è:\n %0.100lf \n\n", sum);

        }
return 0;
}

apatriarca
Le librerie standard del C sono decisamente limitate e per poter lavorare con un numero con precisione arbitraria è necessario usare una libreria esterna (come GNU MPFR) oppure implementare tali funzionalità nel proprio codice. L'idea è ovviamente quella di avere un array di valori che rappresentano le diverse cifre in qualche tipo di rappresentazione (puoi usare cifre decimali ma sono più comuni altre rappresentazioni).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.