Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    36

    serie infinita pi greco

    Ciao a tutti, devo cacolare il valore di pi greco tramite la serie infinita.Usando la forumula pi=4-4/3+4/5..............
    e devo calcolare quanti termini della sorie dovrei prendere per approssimare pi greco a 3.14 a 3.141, 3.1415 e 3.1459
    Ho scritto questo codice:
    codice:
    #include <iostream>
    int main(){
    
    using namespace std;
    double nume=4.0,den=3.0; 
    int cont1=0,cont2=3;
    
    for(double pi=4.0;pi!=3.14;den+=2.0){
    	if(cont2%2==0){
    	pi=pi+(nume/den);
    	cout<<pi<<endl;}
    			else{
    		pi=pi-(nume/den);
    		cout<<pi<<endl;}
    		
    	if(pi==3.14){
    	cout<<"pi="<<pi<<endl;
    	cout<<"contatore="<<cont1<<endl;
    	break;}
    ++cont2;
    ++cont1;
    }
    return 0;
    }
    Ho deciso di provare prima con 3,14.Il problema è che quando vado ad eseguire arriva a 3.14159 e si blocca.Dov'è che sbaglio?

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Non ho controllato la correttezza dell'algoritmo, l'indentazione "a caso" rende il tutto abbastanza illeggibile.

    Ad ogni verificare l'uguaglianza tra due double con == non è corretto. Se proprio confronta 3.14 con un intorno molto piccolo del numero calcolato perché difficilmente arriverai ad avere 3.14.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    36
    Originariamente inviato da Alex'87
    Non ho controllato la correttezza dell'algoritmo, l'indentazione "a caso" rende il tutto abbastanza illeggibile.

    Ad ogni verificare l'uguaglianza tra due double con == non è corretto. Se proprio confronta 3.14 con un intorno molto piccolo del numero calcolato perché difficilmente arriverai ad avere 3.14.
    Anche se provo con 3.14159, arriva ad un certo punto ed è come se si bloccasse l'esecuzione.
    Comunque, dov'è che ho utilizzato l'indentazione a caso?grazie mille.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da aleye
    Anche se provo con 3.14159, arriva ad un certo punto ed è come se si bloccasse l'esecuzione.
    Non ti è stato detto di cambiare valore (dato che il problema è il medesimo) ma di gestire un intorno abbastanza piccolo.

    Comunque, dov'è che ho utilizzato l'indentazione a caso?grazie mille.
    Un po' ovunque ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da aleye
    Comunque, dov'è che ho utilizzato l'indentazione a caso?grazie mille.
    codice:
    #include <iostream>
    using namespace std;
    
    int main() {
    	double nume=4.0;
    	double den=3.0; 
    	int cont1=0;
    	int cont2=3;
    
    	for (double pi=4.0; pi != 3.14; den += 2.0) {
    		if(cont2 % 2 == 0) {
    			pi = pi + (nume / den);
    			cout << pi << endl;
    		} else {
    			pi = pi - (nume / den);
    			cout << pi << endl;
    		}
    
    		if (pi == 3.14) {
    			cout << "pi=" << pi << endl;
    			cout << "contatore=" << cont1 <<endl;
    			break;
    		}
    		
    		++cont2;
    		++cont1;
    	}
    
    	return 0;
    }
    Non è già più leggibile?

    Alcuni suggerimenti:
    Sostituisci il for con un ciclo while, concettualmente è più indicato.
    L'if-else in cui verifichi se cont2 è pari o dispari può essere riscritto molto (ma molto) meglio, evitando tutto il codice duplicato.
    L'if finale mi sembra inutile (oltre ad essere sbagliato) visto che la condizione è già nel for.



    Originariamente inviato da Alex'87
    Ad ogni modo verificare l'uguaglianza tra due double con == non è corretto.
    fix, avevo dimenticato una parola ^^'
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    36
    grazie mille, ma non son riuscito a risolvere il problema, per gestire un intorno, come posso fare?
    si tratta di qualcosa del genere?
    codice:
    double left  = // something
    double right = // something
    const FloatingPoint<double> lhs(left), rhs(right);
    
    if (lhs.AlmostEquals(rhs)) {
      //they're equal!
    }
    Ho trovato questo algoritmo in giro, ma ci ho capito poco, e non capisco a quali librerie devo far riferimento.

  7. #7
    Originariamente inviato da aleye
    grazie mille, ma non son riuscito a risolvere il problema, per gestire un intorno, come posso fare?
    Penso ti possa bastare qualcosa del genere:

    if (fabs(pi - 3.14) < 0.0..1)

    Invece per quanto riguarda la precisione del risultato non penso tu possa andare molto oltre 3.14159 per via della precisione stessa del double.

  8. #8
    Originariamente inviato da ESSE-EFFE
    Invece per quanto riguarda la precisione del risultato non penso tu possa andare molto oltre 3.14159 per via della precisione stessa del double.
    Oddio, i double hanno una mantissa di 53 bit, per cui la precisione è attorno alle 16 cifre decimali...
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Originariamente inviato da MItaly
    Oddio, i double hanno una mantissa di 53 bit, per cui la precisione è attorno alle 16 cifre decimali...
    Giusto. Stavo usando la rappresentazione di default dei floating (6 cifre decimali).

    Per la visualizzazione, quindi, suggerisco all'OP di usare qualcosa tipo:

    cout << setprecision(16) << pi << endl;

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    36
    grazie mille , sono riuscito a risolvere.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.