2010-11-21 30 views
23

Estoy construyendo un programa para la pregunta 3 de los proyectos de Euler, y aunque eso realmente podría no importar como resultado, estoy tratando de hacer que este código tome un número y pruebe si es primo o no. Ahora, antes de llegar a solucionar la función, me da el error de "excepción de coma flotante" justo después de ingresar el número. Aquí está el código:Excepción de punto flotante C++ ¿Por qué y qué es?

int main() 
{ 
    int input; 
    cout << "Enter number: " << endl; 
    cin>> input; 
    int i = input/2; 
    int c; 
    for (i>0; i--;) { 
     c= input%i; 
     if (c==0 || i == 1) 
      cout << "not prime" << endl; 
     else 
      cout << "prime" << endl; 
    } 
    return 0; 
} 

así que esencialmente ¿por qué me está dando una excepción de coma flotante y qué significa eso?

+6

Algo está mal con su bucle for. – Lazer

+0

la excepción de punto flotante tiene muchas razones pero, según tu código, estoy de acuerdo con Pete y creo que c = input% i; es la causa del problema y espero que mi respuesta te ayude ... – TopDeveloper

Respuesta

24

A "floating point number" es como las computadoras generalmente representan números que no son enteros, básicamente, un número con un punto decimal. En C++, los declaras con float en lugar de int. Una excepción de punto flotante es un error que ocurre cuando intenta hacer algo imposible con un número de punto flotante, como dividir por cero.

+0

Bien, bien, déjame asegurarme de que entiendo mi propio código antes de tratar de solucionarlo. El for lop solo se ejecutará si i> 0 ¿verdad? Entonces, el único momento en que se dividirá más tarde es c = input% i ¿Entonces nunca debería dividirse por 0? – samuraiseoul

+0

Si observa detenidamente su ciclo, verá que hay una forma de que su cuerpo pueda ejecutarse una vez con i == 0. – Crashworks

+0

si i == 1? Entonces, ¿el incremento/decremento de un ciclo for sale al final del ciclo aunque lo escriba en la parte superior? – samuraiseoul

9

Muchas razones para una excepción de coma flotante. Mirando su código su bucle for parece ser un poco "incorrecto". Parece una posible división por cero.

for (i>0; i--;){ 
c= input%i; 

Esa es la división por cero en algún momento ya que está disminuyendo i.

+0

por lo que el ciclo for disminuye automáticamente i la primera vez? – samuraiseoul

+0

Creo que necesita hacer un uso de los puntos de interrupción y tratar de pensar un poco más en la solución. No quieres que te demos una respuesta que funcione, ¿verdad? – Pete

28
for (i>0; i--;) 

es probablemente incorrecta y debería ser

for (; i>0; i--) 

lugar. Tenga en cuenta dónde pongo el punto y coma. La condición va en el medio, no al principio.

+0

Sí, pero esa no es la razón para la excepción de coma flotante – Anonymous

+1

@Anonymous Indirectamente, lo es. El extravío de los puntos y comas permitió que 'i' fuera' 0' (que la condición 'i> 0' no hubiera permitido). – Ontonator

0

problema está en el bucle en el fragmento de código:
para (i> 0; yo--;)

Aquí, su intención parece ser entrar en el bucle si (i> 0) y disminuyen el valor de i por uno después de completar el ciclo for.

¿Funciona así? veamos.

mirada a la sintaxis del bucle for():

**for (initialization; condition check; increment/decrement) { 
    statements; 
}** 

inicialización se ejecuta sólo una vez al principio del bucle. Preste mucha atención a ";" en su fragmento de código y asignarlo con sintaxis de bucle.

Inicialización: i> 0: se ejecuta solo una vez. No tiene ningún impacto en tu código.

Verificación de la condición: i -: post decrement.

   Here, i is used for condition check and then it is decremented. 
       Decremented value will be used in statements within for loop. 
       This condition check is working as increment/decrement too in your code. 

Vamos a detenernos aquí y ver la excepción de coma flotante.

¿de qué se trata? Un ejemplo fácil es Divide por 0. Lo mismo está sucediendo con su código.

Cuando alcanzo el 1 en la verificación de condición, la verificación de condición valida para ser verdadera.
Debido a la disminución posterior, seré 0 cuando ingrese para el ciclo.

Modulo operation at line #9 results in divide by zero operation. 

Con este fondo, debería poder solucionar el problema en el ciclo.

Cuestiones relacionadas