Approssimazione di pi greco di “grado n”

di Anonimizzato26985 il
8 risposte
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

  • Questo

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

    in c non significa quello che pensi.

    Utilizza la funzione abs
  • 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
  • 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
  • Innanzitutto bisogna cambiare il segno di quella disequazione!

    P.S.
    Perchè inizializzi pi a 4 e j a 1?
  • 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)
  • 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?
  • 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.?
  • 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