2010-10-19 22 views
18

Quiero usar el ciclo for para mi problema, no mientras. ¿Es posible hacer lo siguiente ?:for-loop, incremento en doble

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

Quiero agregar valores dobles.

+2

Solo tenga en cuenta que debido a errores de redondeo (mal nombre que conozco) lo más probable es que no termine en un buen número redondo. – Blindy

+2

Ocurre que todos los valores tomados por 'i' en su programa son representables exactamente como valores' dobles', pero es un mal hábito tomar para escribir bucles con índices de coma flotante de esta manera. El punto flotante necesita más cuidado que esto si no quieres ver resultados extraños. Véase, por ejemplo, http://www.mc.edu/campus/users/travis/syllabi/381/patriot.htm –

+2

@Blindy. Para este programa preciso, sí lo hará. Para un programa ligeramente diferente, no lo haría. –

Respuesta

46

Para evitar ser mordido por los artefactos de la aritmética de punto flotante, es posible que desee utilizar una variable de bucle entero y derivar el valor de coma flotante que necesita dentro de su bucle:

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

En su lugar, puede usar i += 0.25.

+0

vino buscando esto !! –

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

El agregado = indica un atajo para i = i + 0.25;

6

respuesta de James captó el error más evidente . Pero hay un problema más sutil (e IMO más instructivo), en el sentido de que los valores de punto flotante no deben compararse para la (des) igualdad.

Ese bucle es propenso a problemas, use solo un valor entero y calcule el valor doble dentro del bucle; o, menos elegante, date un margen: for(double i = 0; i < 9.99; i+=0.25)

Edición: la comparación original funciona bien, porque 0.25 = 1/4 es una potencia de 2. En cualquier otro caso, puede que no sea exactamente representable como número de punto flotante. Un ejemplo del problema (potencial):

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

grabados 11 valores:

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

La pregunta original tiene 'i <10.0'. ¿Puede explicar de nuevo cómo se aplica aquí el discurso estándar sobre la igualdad de punto flotante? (como nota, cuando sus cálculos de punto flotante son exactos, es perfectamente seguro usar igualdad). –

+0

'cuando sus cálculos de coma flotante son exactos' es una oración complicada.Como debe estar seguro de que sus números decimales admiten una representación exacta en el formato de número flotante de Java (0.25 pasa a admitirlo, 0.2 o 0.1 no), agregué un ejemplo. – leonbloy

+0

Estoy tratando de entender cómo ayuda agregar 0.01. Si los cálculos no son exactos, es probable que el resultado en coma flotante sea inferior al resultado real que el anterior, por lo que su "corrección" puede causar una iteración adicional en un ciclo que ya tiene demasiadas iteraciones en comparación con la intención del programador. –

2

En

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

f indica float

El añadió = indica un acceso directo para i = i + 0.25;

0

Para entero. Podemos utilizar: 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]; 
     } 

La misma manera que podemos hacer por otros tipos de datos también.