Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    49

    Ancora Deitel...il piGreco !!!

    Questi esercizi mi stanno facendo impazzire...cerco di risolverli prima di chiedere un parere. Per quanto riguarda questo, dato che:

    PiGreco = 4 -4/3 +4/5 -4/7 +4/9 -4/11....

    Mi si chiede di mostrare il valore di PiGreco approssimato al primo termine della serie, poi al secondo e così via...e poi calcolare quanti termini mi servono per arrivare a 3.14, 3.141, 3.1415, 3.14159.
    Ora io penso di averlo risolto...ma la mia soluzione...mi sa di codice penale...voi come avete fatto (o lo fareste?).
    Alex
    codice:
    //Esercizio 5.20
    
    public class CalcoloPiGreco {
    	public static void main(String[] args) {
    		double i=1;
    		int n=2;
    		int a=0,b=0,c=0,d=0;
    		double PiGreco= 4;
    		double PiGreco2=0;
    		for (i=1;PiGreco2 != 3.14159;i +=2){
    			if (n%2 == 0){
    			        PiGreco -= (4 /(i+2));
    			        PiGreco2 = ((int)(PiGreco*100000))/100000.0;
    			}
    			else{
    				
    				PiGreco += (4 /(i+2));
    				PiGreco2 = ((int)(PiGreco*100000))/100000.0;
    				
    			}
    			n++;
    			if (a == 0)
    				if (( PiGreco2*100 >=314) && (PiGreco2*100<=315)){
    					a = n;
    				}
    			if (b==0)
    				if (( PiGreco2*1000 >=3141) && (PiGreco2*1000<=3142)){
    					b = n;
    				}
    			if (c==0)
    				if (( PiGreco2*10000 >=31415) && (PiGreco2*10000<=31416)){
    					c = n;
    				}
    			if (d==0)
    				if (( PiGreco2*100000 >=314159) && (PiGreco2*100000<=314160)){
    					d = n;
    				}
    			System.out.printf("%.5f\n", PiGreco2);
    
    			
    			
    			
    		}
    		
    		System.out.printf("\n\n%d\t%d\t%d\t%d\t", a,b,c,d);
    		
    	}
    
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Qualcosa del genere?
    codice:
    public class PIApprox {
    
        // Scegli la precisione
        static double approx = 10E-5;
    
        public static void main (String[] args) {
            double previous = 4;
            double current = 0;        
            int i = 1;
            while (Math.abs(previous-current) / 2 > approx) {
                current = previous + (4d/(2*i+1))*(i % 2 == 0 ? 1 : -1);            
                i++;
                previous = current;
                current = previous + (4d/(2*i+1))*(i % 2 == 0 ? 1 : -1);
                //System.out.println(previous+"\t\t"+current);
            }
            //System.out.println("\n\n***************************************\n\n");
            System.out.println("Iterazioni: "+i+"\tValore: "+(current+previous)/2);
        }
    }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    49
    Originariamente inviato da Andrea1979
    Qualcosa del genere?
    codice:
    public class PIApprox {
    
        // Scegli la precisione
        static double approx = 10E-5;
    
        public static void main (String[] args) {
            double previous = 4;
            double current = 0;        
            int i = 1;
            while (Math.abs(previous-current) / 2 > approx) {
                current = previous + (4d/(2*i+1))*(i % 2 == 0 ? 1 : -1);            
    SNIP
    Ho provato a far girare il tuo codice...diciamo che alcune cose non le capisco anche perchè non le ho ancora studiate..
    Cmq il tuo codice non fa quello che propriamente si richiedeva nell'esercizio...semplicemente trova 3.14159.... dopo tot cicli....IL FATTO è che, facendolo girare, mi è tornato 10000 cicli per trovare PiGreco...mentre nel mio ce ne mette molti meno:
    codice:
    2,66666
    3,46666
    2,89523
    3,33968
    2,97604
    3,28373
    3,01707
    3,25236
    3,04183
    ..........
    ...........
    ...........
    ...........
    3,14158
    3,14160
    3,14158
    3,14160
    3,14158
    3,14159
    
    
    120	1689	10795	57650
    Gli ultimi numeri sono esattamente le iterazioni per trovare rispettivamente 3.14, 3.141, 3.1415 e 3.14159
    Alex

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    veramente il codice che ho postato trova un'approssimazione di PI decisamente migliore:

    con 1/10000 (ovvero approssimazione 10E-4)

    codice:
    Iterazioni: 1000        Valore: 3.14159215408966
    che è già più precisa di quella da te fornita con 57650 iterazioni.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    49
    Originariamente inviato da Andrea1979
    veramente il codice che ho postato trova un'approssimazione di PI decisamente migliore:

    con 1/10000 (ovvero approssimazione 10E-4)

    codice:
    Iterazioni: 1000        Valore: 3.14159215408966
    che è già più precisa di quella da te fornita con 57650 iterazioni.
    A me facendo girare il tuo codice lo trova in '10000' iterazioni....ieri non me ne ero accorto....ma ci sono lo stesso meno iterazioni....il fatto è che non capisco proprio come faccia....me lo tengo e me lo guardo con calma !

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    te l'ho snellito ulteriormente:
    codice:
    public class PIApprox {
    
        // Scegli la precisione
        static double approx = 10E-4;
    
        public static void main (String[] args) {
            double previous = 0;
            double current = 0;        
            int i = 0;
            
            do {
                previous = current;
                current = previous + (4d/(2*i+1))*(i % 2 == 0 ? 1 : -1);
                i++;
            }
            while (Math.abs(previous-current) / 2 > approx);        
            System.out.println("Iterazioni: "+i+"\tValore: "+(current+previous)/2);
        }
    }
    il ciclo si ripete finché la semi-differenza tra due successivi valori della serie è minore della precisione richiesta (il chè non è proprio la specifica del tuo esercizio)

    Quello che avviene nel ciclo stesso è:
    - assegno alla variabile che rappresenta il valore "precedente" (previous) nella serie il valore corrente (current) della serie stessa
    - calcolo il valore corrente: la roba nella seconda parentesi vuol semplicemente dire che se il resto della divisione i / 2 è 0 (ovvero i è pari) allora il segno sarà positivo, altrimenti negativo. Ed è semplicemente la traduzione della successione di segni nella serie che definisce pigreco. La prima parentesi invece calcola i vari valori (4, 4/3, 4/5, 4/7 ....)
    - aumento il contatore delle iterazioni.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    49
    Ok...grazie per la spiegazione..ora è più chiaro !


    Alex

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.