[C]Calcolo del valore del pi greco

goron1
Sto creando un programma che mi calcoli il valore del pi greco utilizzando la serie sotto riportata ed i comandi base del C (IL PROGRAMMA E' INCOMPLETO):
/*Calcolo del valore del pi greco*/
#include <stdio.h>
#include <stdlib.h>

main ()
{
   int cifre, i, pari, segno;
   float pigreco, pigrecotot = 0;
   /*Purtroppo non c'è il simbolo ASCII relativo al PI greco, serve l'UNICODE*/
   printf ("Il valore del PI greco e' dato dalla seguente serie numerica: \n\n");
   printf ("[PI] = 4 - 4/3 + 4/5 -4/7 + 4/9 - 4/11 + ... \n\n");
   printf ("Inserire un numero naturale che indica fino a che cifra si ");
   printf ("approssima [PI] (1 indica il 4) \n");
   scanf ("%d", &cifre);
   /*Questo "for" fa variare i denominatori*/
   for (i = 0 ; i <= (cifre - 1) ; i ++) {
      pigreco = (float) 4 * (1 / 2 * i + 1);
      pigrecotot += pigreco;
      printf ("Passaggio intermedio: %f \n", pigrecotot);
   }
   printf ("Il valore del PI greco e':\n%f \n", pigrecotot);
   system("pause");
   return 0;
}


Ne ho riportato un pezzo (quando l'avrò finito lo presenterò per intero).
Purtroppo ho dei problemi con l'iterazione for: i valori assunti dalla variabile "pigreco" risultano essere multipli di 4, mentre mi aspetterei di trovare dei decimali, è come se il paramentro "i" non venisse iterato.
Ho provato le più disparate combinazioni ma non riesco a risolvere, chi sa aiutare? Grazie in anticipo.

Risposte
goron1
Ho capito il problema, avrei dovuto dichiarare la i non di tipo int, ma di tipo float.

Per quanto riguarda il programma, ho calcolato il pi greco come somma di due serie, una costituita dei soli termini negativi ed una da quelli positivi. Ho utilizzato due volte il "for":

/*Calcolo del valore del pi greco*/
#include <stdio.h>
#include <stdlib.h>

main ()
{
   int cifre;
   float i, j, positivi, negativi, positivitot = 0, negativitot = 0, pigreco;

   printf ("Il valore del PI greco e' dato dalla seguente serie numerica: \n\n");
   printf ("[PI] = 4 - 4/3 + 4/5 -4/7 + 4/9 - 4/11 + ... \n\n");
   printf ("Inserire un numero naturale che indica fino a che cifra si ");
   printf ("approssima [PI] (1 indica il 4) \n");
   scanf ("%d", &cifre);
   /*Si trova il PI greco come somma di una serie positiva ed una negativa*/
   for (i = 0 ; i <= (cifre - 1) ; i += 2) {

      positivi = (float) 4 / (2 * i + 1); /*i deve essere di tipo float!*/
      positivitot += positivi;
   }
   
   for (j = 1 ; j <= (cifre - 1) ; j += 2) {

      negativi = (float) -4 / (2 * j + 1); /*i deve essere di tipo float!*/
      negativitot += negativi;
   }
   
   pigreco = positivitot + negativitot;
   
   printf ("Il valore del PI greco e':\n%f \n", pigreco);
   system("pause");
   return 0;
}

archaon5931
in realtà non serve che converti i in float, basta il casting lo metti davanti alla i dentro la parentesi invece che davanti al 4, perché altrimenti calcola prima il valore all'interno della parentesi e poi fa il calcolo 4/ con il casting corretto

.....

un'altra cosa: non ti servono due variabili pigrecotot e pigreco o nel secondo programma positivitot e positivi, basta che prima del ciclo inizializzi a 0 la variabili e poi nel ciclo metti il +=

vict85
Non mi sembra un metodo efficiente per trovare i decimali di $\pi$... Gli errori di arrotondamenti in questo tipo di calcoli sono troppi per essere ignorati...

mottola.giovanni
Quel che è peggio, la serie di Leibniz è terribilmente lenta a convergere, come qualche tentativo dimostra facilmente... è proprio necessario farne uso?

archaon5931
a proposito di arrotondamente c'è un modo per diminuire gli errori?

ho fatto un codice simile per calcolare e (n. Nepero) con la serie 1/N!, però controllando su wikipedia già dalla sedicesima cifra decimale i risultati sono diversi....

vict85
"archaon593":
a proposito di arrotondamente c'è un modo per diminuire gli errori?

ho fatto un codice simile per calcolare e (n. Nepero) con la serie 1/N!, però controllando su wikipedia già dalla sedicesima cifra decimale i risultati sono diversi....


Tieni presente che ogni volta che trasformi una frazione in float hai un errore e che con la serie gli sommi una all'altra. Quindi più la serie converge lentamente più ci sono errori.

L'unico modo che mi viene in mente per ridurre gli errori, a parte usare serie che convergono più velocemente o altri metodi, è raggruppare a mano le frazioni in modo da ridurre le frazioni.

Incognita X
Non sò se devi calcolare per forza il pi greco in quella maniera, ma io lo calcolo semplicemente utilizzando la biblioteca math.h e la trigonometria, invece di scervellarmi con le serie e il risultato è preciso (con un processore a 32 bit puoi tenere al massimo 6 cifre decimali, con uno a 64 bit puoi tenere 12 cifre, ma col metodo trigonometrico, le cifre sono comunque precise). Per decidere il numero di cifre a piacere credo che ci voglia anche un elaboratore apposito, strutturato in modo tale da tenerle.

Ad esempio:


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

main()
{
   double pi;
   pi = 4*atan(1);
   
   printf("%lf", pi);
}

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