Approssimazione di pi greco di “grado n”

di il
8 risposte

Approssimazione di pi greco di “grado n”

Buonasera,

ho un problema con il secondo punto di questo esercizio:
Un approssimazione di pi greco di “grado ??” può essere calcolata tramite la somma
??n = ? ((-1)^??) *(4/(2?? +1)) con la sommatoria che va da j=0 a j=n.
2. Sviluppare una seconda versione che prenda un double, ??, e calcoli un approssimazione di ?? di “grado ??” tale che |???? - ??(??-1)| < ??.

Ho provato a farlo in questo modo ma non torna... dove sbaglio?
#include <iostream>
#include <cmath>

using namespace std;

int main ()

{
double pi, e;
int n,j;

cout << "Scrivere il valore di epsilon:\n";
cin >> e;

pi=4;
j=1;
while (-e < (4/(2*j+1))< e){
	
pi=pi+((pow(-1,j))*4/(2*j+1));
j++;
}
cout << pi;

  return 0; 
}
// end function main
Grazie

8 Risposte

  • Re: Approssimazione di pi greco di “grado n”

    Questo

    -e < (4/(2*j+1))< e

    in c non significa quello che pensi.

    Utilizza la funzione abs
  • Re: Approssimazione di pi greco di “grado n”

    Secondo me per un esercizio del genere non vale affatto la pena scomodare la libreria cmath...

    In ogni caso riguardo la suddetta condizione basta fare
    4/(2*j+1) < e
  • Re: Approssimazione di pi greco di “grado n”

    Ho provato a sostituire la condizione con while ( abs(4/(2*j+1))< e){ ....
    ma continua a non andare...
    ed ora ho provato anche senza la funzione abs come dici tu Nippolo ma niente
  • Re: Approssimazione di pi greco di “grado n”

    Innanzitutto bisogna cambiare il segno di quella disequazione!

    P.S.
    Perchè inizializzi pi a 4 e j a 1?
  • Re: Approssimazione di pi greco di “grado n”

    Il segno mi sembra corretto, come conseguenza della domanda...
    Inizializzo pi a 4 poichè considero il caso j=0 come punto di partenza (che corrisponde a pi=4)
  • Re: Approssimazione di pi greco di “grado n”

    Il segno mi sembra corretto, come conseguenza della domanda...
    Non sono sicuro di aver capito quello che intendi... a quale domanda ti riferisci?
    In ogni caso se non sei convinto al riguardo ti faccio un esempio. Considera il seguente semplice programmino:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int a = 10;
        while(???)
        {
            --a;
        }
        cout << a;
    }
    Ipotizza di dover diminuire il valore di a affinché sia verificata la seguente diseguaglianza:
    a < 1
    che in pratica significa avere come output il valore 0.
    Cosa scriverai come condizione del while?
    Inizializzo pi a 4 poichè considero il caso j=0 come punto di partenza (che corrisponde a pi=4)
    Lo avevo intuito, volevo semplicemente farti notare che non ce n'è bisogno.

    Considera inoltre la seguente istruzione:
    double a = 5 / 2;
    a quanto è uguale a?
  • Re: Approssimazione di pi greco di “grado n”

    Ok ho capito cosa vuoi dire, la condizione modulo ( pi greco (n) meno pi greco (n meno1) )< epsilon, deve essere verificata a ciclo concluso e quindi nel ciclo cambio segno per andare ad agire quando questa condizione non è soddisfatta.

    Double 5/2 mi da 2.5 giusto? Oppure doveva essere 5./2.?
  • Re: Approssimazione di pi greco di “grado n”

    Double 5/2 mi da 2.5 giusto? Oppure doveva essere 5./2.?
    Affinché non venga calcolata solo la parte intera del quoziente, almeno uno dei due operandi deve essere un valore in virgola mobile.

    In ogni caso io farei qualcosa del genere:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        double pi = 0;
        double e = 1.0E-6;
        double d;
        unsigned int j = 0;
        do
        {
            d = (double)4 / (2 * j + 1);
            if(j++ % 2)
            {
                pi -= d;
            }
            else
            {
                pi += d;
            }
        }
        while(d >= e);
        cout << pi << "(" << j << ")";
    }
    o equivalentemente
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        double pi = 0;
        double e = 0.1E-6;
        double d;
        int j = 0;
        do
        {
            d = (double)4 / (2 * j + 1);
            pi += (1 - j++ % 2 * 2) * d;
        }
        while(d >= e);
        cout << pi << "(" << j << ")";
    }
Devi accedere o registrarti per scrivere nel forum
8 risposte