Non mi trovo con i calcoli

di il
14 risposte

Non mi trovo con i calcoli

La traccia è la seguente trovare il valore di pi greco a partire dalla serie infinita pigreco= 4 + 4/5 - 4/7 + 4/9 - 4/11...
visualizzate una tabella che mostri il valore di pigreco approssimato a 1 a 2 a 3...termini di questa serie.Quanti termini di questa serie dovete utilizzare prima di ottenere 3.14,3.141,3.1415,3.14159?
#include <stdio.h>
int main (void) {
    float pi_greco;
    int x;
    int den = 3;
    int counter;
    printf("Inserisci il numero di approssimazioni:");
    scanf(" %d", &x);
    
    for(counter=1; counter <=x ; counter++) {
          
           if (counter==1 || counter==3 || counter==5)  {
                                      pi_greco = 4.00 - 4.00/den;
                                      den = den + 2;
                                      }
                                      
          else {
                 pi_greco = 4.00 + 4.00/den;
                 den = den + 2;
                 }
                 
          }
          printf("Pi greco approssimato a %d cifre è %f", x, pi_greco);
          fflush(stdin);
          getchar();
          return 0;
          }
ho momentaneamente messo da parte il problema della tabella.
ho pensato di farlo così però mi esce se l'approssimazione =1, poi i valori sballano dalla calcolatrice. (tra l'altro con questa formula anche sulla calcolatrice ottengo valori diversi dal 3.14)

14 Risposte

  • Re: Non mi trovo con i calcoli

    Ciao zazi77,
    la serie che hai scritto è sbagliata, dovresti cambiare i segni e iniziare con 4 - 4/5 + 4/7 ...
    Poi non ho capito quel if (counter==1 || counter==3 || counter==5), la serie continua a cambiare di segno per sempre non solo per i primi tre valori.

    Ecco un esempio:
    
    int main (void) 
    {
    	printf("Inserisci il numero di approssimazioni:");
    	int x;
    	scanf(" %d", &x);
    
    	double pi_greco = 4;
    	int signum = -1;
    	int den = 3;
    
    	for(int counter = 1; counter <= x ; counter++) 
    	{
    		pi_greco = pi_greco + signum * 4.0 / den;
    		signum = -signum;
    		den += 2;
    	}
    
    	printf("Pi greco approssimato a %d cifre è %f", x, pi_greco);
    	fflush(stdin);
    	getchar();
    	return 0;
    }
    
    La serie converge molto lentamente, ci vogliono migliaia di iterazioni per avere un po' di decimali corretti.
  • Re: Non mi trovo con i calcoli

    Ho messo solo 3 valori perchè pensavo che per ottenere le cifre di approssimazione richieste bastassero, fighissima l'idea del signum,così va molto meglio ! grazie mille come al solito
  • Re: Non mi trovo con i calcoli

    Giusto per divertirci ancora un poco, volendo potresti mettere il signum a -4 così risparmi una moltiplicazione nel ciclo, e potresti non usare la variabile counter:
    
    	double pi_greco = 4;
    	int signum = -4;
    	double den = 3;
    
    	while (x-- > 0)
    	{
    		pi_greco += signum / den;
    		signum = -signum;
    		den += 2;
    	}
    
    	printf("Pi greco approssimato a %d cifre è %f", x, pi_greco);
    
    Anche se la soluzione di prima forse rimane più comprensibile.
  • Re: Non mi trovo con i calcoli

    Ahahah la prima soluzione a prima vista è più chiara xò anche la seconda è facilmente comprensibile
  • Re: Non mi trovo con i calcoli

    Visto che si scherza ti passo pure questa, giusto per giocherellare un po'
    
    	double pi_greco = 4;
    	int signum = 4;
    	double den = 1;
    
    	while (x-- > 0)
    		pi_greco += (signum = -signum) / (den += 2);
    
    	printf("Pi greco approssimato a %d cifre è %f", x, pi_greco);
    
    Qui la comprensibilità è andata a quel paese(però ha un suo fascino)
  • Re: Non mi trovo con i calcoli

    Ahahahahah sei un grande
  • Re: Non mi trovo con i calcoli

    Ciao barba59,

    vedo che ti piacciono molto i giochini. Bella iterazione!
    Togliendo il maggiore e cambiano while in for (nell'esempio sempre pi != 0) si può ottenere:
    
       for (;x-- && (pi_greco += (signum = -signum) / (den += 2));) ;
    
    edit:
    ritorno sulla while visto che ho usato solo la zona test
    
      while (x-- && (pi_greco += (signum = -signum) / (den += 2))) ;
    
  • Re: Non mi trovo con i calcoli

    Ciao ixamit,
    ti stavo aspettando.
    So che arrivi puntuale con delle splendide soluzioni.

    A questo punto mi rimane poco altro da fare, se non riscriverla in forma compatta per motivi estetici:
    
        printf("Inserisci il numero di approssimazioni:");
        int x;
        scanf(" %d", &x);
    
        double p = 4;
        double d = 1;
        int s = 4;
    	
        while (x--&&(p+=(s=-s)/(d+=2)));
    
        printf("Pi greco approssimato a %d cifre è %f", x, p);
    
    e togliere ancora una altro carattere:
    
        while (x--&&(p+=(s=-s)/++++d));
    
    Si, effettivamente mi diverto un sacco con questi giochini
  • Re: Non mi trovo con i calcoli

    Segnalo che il gcc (version 4.5.1 20101208 [gcc-4_5-branch revision 167585]) non compila. Non l'ho provato su versioni differenti.
    
    while (x--&&(p+=(s=-s)/++++d));
    error: lvalue required as increment operand
    
    nuova proposta:
    
    while ((p+=(s=-s)/(d+=2)),--x);
    
  • Re: Non mi trovo con i calcoli

    Nuova proposta di una riga sola.
    double p = 3.1415;
  • Re: Non mi trovo con i calcoli

    Ancora più velocemente:
    
    M_PI 
    
  • Re: Non mi trovo con i calcoli

    Ciao ixamit,

    ixamit ha scritto:


    while ((p+=(s=-s)/(d+=2)),--x);
    Complimenti!
    Riscrivo il codice completo (perché i valori iniziali devono essere diversi)
    
        printf("Inserisci il numero di approssimazioni:");
        int x;
        scanf(" %d", &x);
    
        double p = 0;
        double d = -1;
        int s = 4;
    	
        while (p+=(s=-s)/(d+=2),x--);
    
        printf("Pi greco approssimato a %d cifre è %f", x, p);
    
    
    Ti ho tolto due parentesi ma rimane punto tuo

    Per quanto riguarda la faccenda del ++++ ho provato con questi compilatori:
    VisualStudio 2010 (Windows)
    Eclipse 1.2.0 (Linux)
    Qnx Momentics 4.0.1 (Qnx)
    Xcode 4.3.2 (Mac)

    E su questi funziona, ovviamente questo non vuol dir nulla (non vince la maggioranza ma chi ha ragione )

    In linea di principio a me sembra corretto, in quanto l' operatore ++ quando è prefisso restituisce un l-value e quindi si puo applicare ancora il ++, mentre quando è postfisso restituisce un r-value (infatti n++++ è sicuramente sbagliato). Però non ci giurerei e volevo sentire il vostro parere.

    Provvisoriamente lo considererei valido per cui possiamo scrivere:
    
    while(p+=(s=-s)/++++d,x--);
    
    Si toglie ancora un carattere. Questo però non vale, è ancora punto di ixamit.

    Per fare punto io devo proporre una cosa diversa:
    
    for(;x--;p+=(s=-s)/++++d);
    
    Che toglie un altro carattere.
  • Re: Non mi trovo con i calcoli

    Bravo!
    Usando carta e penna mi sembra che p sia negativo.
    correggimi se sbaglio
  • Re: Non mi trovo con i calcoli

    Ops. 's' deve essere inizializzato con -4, riscrivo tutto:
    
        printf("Inserisci il numero di approssimazioni:");
        int x;
        scanf(" %d", &x);
    
        double p = 0;
        double d = -1;
        int s = -4;
    	
        for(;x--;p+=(s=-s)/++++d);
    
        printf("Pi greco approssimato a %d cifre è %f", x, p);
    
    Dopo mille iterazioni arriva a 3.140593
    Dopo 10000 a 3.141493
Devi accedere o registrarti per scrivere nel forum
14 risposte