Problema do while

di il
12 risposte

Problema do while

Ciao amici sto facendo un semplice problema in java e mi sta mandando al manicomio, se è possibile vorrei il vostro aiuto, la traccia è questa:

Calcolate il valore di pigreco utilizzando la serie infinita

4 - 4/3 + 4/5 - 4/7 +4/9.....

Quanti termini dovete includere nel calcolo prima di arrivare a 3.14 ??

il mio codice è il seguente:
public class PiGreco {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		
		// dichiara e inizializza le variabili
		String prova;
		String variabile;
		String piGreco = "3.14";
		double num = 4;
		double den = 3;
		double risultato = num;
		int i = 1;
		int contatore = 1;	// variabile che conta quanti termini della serie bisogna includere
						// per arrivare al risultato
		
		
		// realizzo la serie (4 - 4/3 + 4/5 - 4/7 + 4/9......)
		do
		{
			if(i % 2 == 0)					// se i e' pari
				risultato += (num/den);
			else							// altrimenti se e' dispari
				risultato -= (num/den);
			
			i++;							// incremento i per ottenere l'operazione
											// di somma e sottrazione
			contatore++;					// incremento il contatore della serie
			
			den +=2;						// incremento il denominatore di 3
			
			variabile = Double.toString(risultato);		// converto il risultato in stringa
    		 prova = variabile.substring(0, 4);
	
		}while(prova != piGreco);		// finquando il risultato non e' 3,14, continua il ciclo
		
		System.out.printf("Il risultato ottenuto e': %s", variabile);
		System.out.printf("\nSono stati inclusi %d termini della serie.", contatore);
	}

}
Una volta avviata l'esecuzione del programma, non termina più... ho controllato con il debugging erutti i calcoli vengono fatti alla perfezione, anche la conversione è corretta, approssimando la cifra a 2 valori dopo la virgola. Il problema secondo me sta nel while, continua all'infinito il ciclo, non capisce quando i due valori sono uguali.

Qualche suggerimento?

Grazie in anticipo.

12 Risposte

  • Re: Problema do while

    Piccola nota erutti i calcoli?

    Boorp ... piccolo eruttino

    Certo che non lo capisce!

    Confrontare due floating point per uguaglianza e' sembre sbagliato.

    Due numeri x e y in floating point sono uguali se

    abs(x-y) < eps

    dove eps e' la precisione che decidi.

    Ma non solo: eps non puo' essere arbitrariamente piccolo: entra in gioco la teoria degli errori che, come ingegnere, dovresti conoscere
  • Re: Problema do while

    migliorabile ha scritto:


    Piccola nota erutti i calcoli?

    Boorp ... piccolo eruttino

    Certo che non lo capisce!

    Confrontare due floating point per uguaglianza e' sembre sbagliato.

    Due numeri x e y in floating point sono uguali se

    abs(x-y) < eps

    dove eps e' la precisione che decidi.

    Ma non solo: eps non puo' essere arbitrariamente piccolo: entra in gioco la teoria degli errori che, come ingegnere, dovresti conoscere
    perdonami la franchezza ma non c'entra una mazza quello che dici.

    semplicemente non funziona perche` lui sta usando l'operatore
          }while(prova != piGreco);      // finquando il risultato non e' 3,14, continua il ciclo
    
    e quei due sono stringhe.

    il discorso che hai fatto tu matematicamente non sono abbastanza lucido per leggerlo (trasloco fino alle 2 e a lavoro alle 8:30), ma programmativamente l'errore e` li`.

    le stringhe, essendo oggetti, si confrontano tramite un apposito metodo, l'equals
  • Re: Problema do while

    Opps, ho guardato solo il confronto per disuguaglianza, poiche' quello e' il classico errore.

    In effetti, il contronto tra stringhe, fatto cosi', NON POTRA' MAI essere vero (e questo perche'?).

    Ma anche usando l'equals NON POTRA' (quasi) MAI funzionare, perche' comunque si ritorna al discoroso della teoria degli errori, di come un numero in floating point viene rappresentato, ecc, ecc, e quindi non capitera' mai che come risultato esca ESATTAMENTE la stringa "3.14".

    Quindi,il mio discroso continua mazzamente a centrare
  • Re: Problema do while

    Vero quello che dice migliorabile.
    Dovresti convertire le stringhe in double o float e magari scriverti un metodino closingEnough(double a, double b, double eps) che restituisce true se a differisce da b per meno di eps;

    Magari ti crei una classe dove metti questi medodi utili che potrai poi richiamare quando vuoi
  • Re: Problema do while

    E perche se faccio un semplice programma del tipo:
    
    String a = "3.14";
    String b = "3.14";
    
    if(a != b)
       System.out.print("Sono diversi");
    else
       System.out.print("Sono uguali");
    funziona??
    non è la stessa cosa?
  • Re: Problema do while

    No!

    Ad esempio:
    
    package test;
    
    public class Main {
    
        public static void main(String[] args) {
            String a = "3.14";
            String b = "3.14";
            String c, d, e;
    
            System.out.println(a == b);
    
            c = "3" + ".14";
            System.out.println(c);
            System.out.println(a == c);
    
            d = Integer.toString(3) + ".14";
            System.out.println(d);
            System.out.println(a == d);
            System.out.println(c == d);
    
            e = Double.toString(3.14);
            System.out.println(e);
            System.out.println(a == e);
            System.out.println(c == e);
            System.out.println(d == e);
        }
    }
    
    La domanda che ti pongo e': perche' ha il comportamento che vedi?

    Eppure b,c,d,e sono sempre la stringa "3.14" !
  • Re: Problema do while

    PS: la classe String contiene il metodo "equals".
    se esiste c'è un motivo...
  • Re: Problema do while

    @xneo e migliorabile

    dato che i double e i float hanno precisione molto limitata, si potrebbe estendere la classe String con i metodi equals, add, mul, sott, pow, ecc.. per poi usarla come "numero"
  • Re: Problema do while

    MacGigi ha scritto:


    E perche se faccio un semplice programma del tipo:
    
    String a = "3.14";
    String b = "3.14";
    
    if(a != b)
       System.out.print("Sono diversi");
    else
       System.out.print("Sono uguali");
    funziona??
    non è la stessa cosa?
    Ci sono probabilità che funzioni poiché la classe String è immutabile, e quindi potrebbe succedere, per motivi di convenienza, che le stringhe uguali puntino semplicemente allo stesso oggetto.

    Inviato dal mio Nexus 5 utilizzando Tapatalk
  • Re: Problema do while

    ale99 ha scritto:


    @xneo e migliorabile

    dato che i double e i float hanno precisione molto limitata, si potrebbe estendere la classe String con i metodi equals, add, mul, sott, pow, ecc.. per poi usarla come "numero"
    Non ha nessun senso.

    Invece, quello che ti server, sono i BigInteger e i BigDecimal.

    O piu' in generale, tu vuoi usare una libreria per utilizzare dei numeri in precisione arbitratia.

  • Re: Problema do while

    Ragazzi grazie per l'aiuto , ho risolto ieri notte ed ho utilizzato i BigDecimal. Appena torno a casa vi posto il codice che ho utilizzato. GraZie
  • Re: Problema do while

    @ale99

    Non puoi estendere la classe String perchè è una classe final.
Devi accedere o registrarti per scrivere nel forum
12 risposte