2010-10-19 13 views
18

Voglio usare il ciclo for per il mio problema, non mentre. È possibile fare quanto segue ?:for-loop, incremento per doppio

for(double i = 0; i < 10.0; i+0.25) 

Voglio aggiungere valori doppi.

+2

Tieni presente che a causa di errori di arrotondamento (un termine improprio lo so) molto probabilmente non finirai con un bel numero di round. – Blindy

+2

Accade quindi che tutti i valori presi da 'i' nel programma siano rappresentabili esattamente come valori' double', ma questa è una cattiva abitudine da prendere per scrivere loop con indici a virgola mobile in questo modo. Il punto fluttuante richiede più cura di questo se non vuoi vedere risultati strani. Vedi per esempio http://www.mc.edu/campus/users/travis/syllabi/381/patriot.htm –

+2

@Blindy Per questo programma preciso, sì lo farà. Per un programma leggermente diverso, non lo farebbe. –

risposta

46

per evitare di essere morso da artefatti di aritmetica in virgola mobile, si potrebbe desiderare di utilizzare una variabile di ciclo intero e ricavare il valore in virgola mobile è necessario all'interno del ciclo:

for (int n = 0; n <= 40; n++) { 
    double i = 0.25 * n; 
    // ... 
} 
25

È possibile utilizzare invece i += 0.25.

+0

è venuto in cerca di questo !! –

2
for(double i = 0; i < 10.0; i+=0.25) { 
//... 
} 

Il valore aggiunto = indica una scelta rapida per i = i + 0,25;

6

risposta di James catturato l'errore più evidente . Ma c'è un problema più sottile (e IMO più istruttivo), in quanto i valori in virgola mobile non dovrebbero essere confrontati per l'uguaglianza (non).

Questo loop è soggetto a problemi, utilizza solo un valore intero e calcola il doppio valore all'interno del ciclo; o, meno elegante, concediti qualche margine: for(double i = 0; i < 9.99; i+=0.25)

Modifica: il confronto originale funziona correttamente, perché 0.25 = 1/4 è una potenza di 2. In ogni altro caso, potrebbe non essere esattamente rappresentabile come numero in virgola mobile. Un esempio di (potenziale) problema:

for(double i = 0; i < 1.0; i += 0.1) 
    System.out.println(i); 

stampe 11 valori:

0.0 
0.1 
0.2 
0.30000000000000004 
0.4 
0.5 
0.6 
0.7 
0.7999999999999999 
0.8999999999999999 
0.9999999999999999 
+1

La domanda originale ha 'i <10.0'. Puoi spiegare ancora come si applica il discorso standard sull'uguaglianza in virgola mobile? (come nota, quando i calcoli in virgola mobile sono esatti è perfettamente sicuro usare l'uguaglianza). –

+0

"quando i calcoli in virgola mobile sono esatti" è una frase complicata.Perché devi essere sicuro che i tuoi numeri decimali ammettono un'esatta rappresentazione nel formato in virgola mobile di Java (0.25 capita di ammetterlo, 0.2 o 0.1 no) Ho aggiunto un esempio. – leonbloy

+0

Sto cercando di capire come l'aggiunta di 0.01 aiuti. Se i calcoli non sono esatti, è probabile che il risultato in virgola mobile sia inferiore al risultato reale come sopra, quindi la "correzione" potrebbe causare un'iterazione aggiuntiva in un ciclo che ha già troppe iterazioni rispetto all'intento del programmatore. –

2

In

for (double i = 0f; i < 10.0f; i +=0.25f) { 
System.out.println(i); 

f indica float

L'aggiunta = indica un collegamento per i = i + 0,25;

0

Per numero intero. Possiamo usare: for (int i = 0; i < a.length; i += 2)

for (int i = 0; i < a.length; i += 2) { 
      if (a[i] == a[i + 1]) { 
       continue; 
      } 
      num = a[i]; 
     } 

stesso modo possiamo fare per gli altri tipi di dati anche.