para el bucle, el incremento por doble

Quiero usar el bucle for para mi problema, no el tiempo. Es posible hacer lo siguiente?:

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

Quiero añadir dos valores.

  • Sólo ten en cuenta que debido a errores de redondeo (nombre inapropiado sé) lo más probable es que no va a terminar en un bonito número redondo.
  • Lo que ocurre es que todos los valores tomados por i en su programa son representables exactamente como double valores, pero esta es una mala costumbre de estar tomando para escribir bucles con punto flotante índices de esta manera. De punto flotante necesita más atención de la que este si no quieren ver resultados extraños. Véase, por ejemplo, mc.edu/campus/users/travis/syllabi/381/patriot.htm
  • Para este programa, sí que lo hará. Para algo un poco diferente programa, que no lo haría.
  • Quiero calcular el área y el contorno de un círculo, el diámetro es el parámetro, se empieza con 1 y termina con 10, debería ser incrementado en 0,25
  • No se comprende la naturaleza de la de punto flotante problema.
InformationsquelleAutor Upvote | 2010-10-19

6 Kommentare

  1. 52

    Para evitar ser picado por los artefactos de la aritmética de punto flotante, usted podría querer usar un entero variable de bucle y derivar el valor de punto flotante que usted necesita dentro de su bucle:

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

    James respuesta llamó la mayoría de error evidente. Pero hay una forma más sutil (y de la OMI más instructivo) emitir, en el que los valores de punto flotante no debe ser comparados para la (des)igualdad.

    De ese bucle es propenso a los problemas, utilice sólo un valor entero y calcular el doble de valor en el interior del bucle; o, menos elegante, dar un poco de margen: for(double i = 0; i < 9.99; i+=0.25)

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

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

    imprime 11 valores:

    0.0
    0.1
    0.2
    0.30000000000000004
    0.4
    0.5
    0.6
    0.7
    0.7999999999999999
    0.8999999999999999
    0.9999999999999999
    • A la pregunta original,i < 10.0. Puede usted explicar de nuevo cómo el discurso estándar acerca de punto flotante de igualdad se aplica aquí? (como una nota, cuando su punto flotante cálculos son exactos es perfectamente seguro para el uso de la igualdad).
    • ‘cuando su punto flotante cálculos son exactos’ es un truco de la frase. Porque usted debe estar seguro de que tus números decimales admitir una representación exacta en Java flotante de formato de número (0.25 sucede a admitirlo, de 0,2 o 0,1 no) he añadido un ejemplo.
    • Estoy tratando de entender cómo la adición de 0.01 ayuda. Si los cálculos no son exactos, el resultado de punto flotante es probable que estar por debajo del resultado real como en el anterior, por lo que su «revisión» puede causar una iteración de un bucle que ya tiene demasiadas iteraciones en comparación con la intención del programador.
    • estás en lo cierto! Yo había corregido, aunque. De todos modos, esa es una mala práctica también.
    • Excelente, funcionó para mí
  3. 2
    for(double i = 0; i < 10.0; i+=0.25) {
    //...
    }

    El agregado = indica un acceso directo para i = i + 0.25;

  4. 2

    En

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

    f indica float

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

  5. 0

    Por entero.
    Podemos usar : 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];
            }

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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea