2010-11-21 24 views
23

Sto costruendo un programma per la domanda 3 dei progetti di Eulero, e anche se questo potrebbe non essere un problema, sto cercando di fare in modo che questo codice prenda un numero e verifichi se è primo o meno. Ora, prima di risolvere la funzione, mi viene restituito l'errore "eccezione in virgola mobile" subito dopo l'immissione del numero. Ecco il codice:C++ in virgola mobile C++ Perché e che cos'è?

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; 
} 

quindi essenzialmente perché mi sta dando un'eccezione a virgola mobile e cosa significa?

+6

C'è qualcosa di sbagliato nel ciclo for. – Lazer

+0

l'eccezione in virgola mobile ha molte ragioni ma, a seconda del codice, sono d'accordo con Pete e penso che c = input% i; è la causa del problema e spero che la mia risposta ti aiuti .. – TopDeveloper

risposta

24

Un "floating point number" è il modo in cui i computer di solito rappresentano numeri che non sono numeri interi, in pratica un numero con un punto decimale. In C++ dichiarali con float invece di int. Un'eccezione a virgola mobile è un errore che si verifica quando si tenta di fare qualcosa di impossibile con un numero in virgola mobile, ad esempio una divisione per zero.

+0

Okay, beh, assicurami di aver compreso il mio codice prima di provare a risolverlo. Il comando for lop verrà eseguito solo se i> 0 è corretto? Quindi l'unica volta che si dividerà dopo è c = input% i Quindi non dovrebbe mai dividere per 0? – samuraiseoul

+0

Se osservi attentamente il tuo ciclo, vedrai che c'è un modo in cui il suo corpo può essere eseguito una volta con i == 0. – Crashworks

+0

if == 1? Quindi un incremento/decremento del ciclo for avviene alla fine del ciclo anche se lo scrivi in ​​alto? – samuraiseoul

9

Un sacco di motivi per un'eccezione a virgola mobile. Osservando il tuo codice, il tuo ciclo for sembra essere un po '"errato". Sembra una possibile divisione per zero.

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

Questa è la divisione per zero ad un certo punto poiché si sta decrementando i.

+0

quindi il ciclo for si decrementa automaticamente per la prima volta? – samuraiseoul

+0

Penso che sia necessario fare qualche uso dei punti di interruzione e cercare di riflettere sulla soluzione un po 'di più. Non vuoi che ti diamo una risposta che funzionerà, vero? – Pete

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

è probabilmente sbagliato e dovrebbe essere

for (; i>0; i--) 

invece. Nota dove ho messo il punto e virgola. La condizione va nel mezzo, non all'inizio.

+0

Sì, ma non è questo il motivo dell'eccezione di virgola mobile – Anonymous

+1

@Anonimo Indirettamente, lo è. Lo smarrimento del punto e virgola consentiva che 'i' fosse' 0' (che la condizione 'i> 0' non avrebbe consentito). – Ontonator

0

Il problema è che nel ciclo for nel frammento di codice:
per (i> 0; i--;)

Qui, la vostra intenzione sembra essere entrare nel ciclo se (i> 0) e decrementa il valore di i di uno dopo il completamento del ciclo for.

Funziona così? vediamo.

Guarda la sintassi del ciclo for():

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

inizializzazione viene eseguito solo una volta all'inizio del ciclo. Presta molta attenzione a ";" nello snippet di codice e mappalo con la sintassi del ciclo.

Inizializzazione: i> 0: viene eseguito una sola volta. Non ha alcun impatto sul tuo codice.

Controllo stato: i -: post decremento.

   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. 

Consente di fermarsi qui e visualizzare l'eccezione a virgola mobile.

cos'è? Un semplice esempio è Divide per 0. Lo stesso sta accadendo con il tuo codice.

Quando si raggiunge 1 in condizione di controllo, la verifica della condizione è valida.
A causa del decremento del post sarò 0 quando entra nel ciclo.

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

Con questo sfondo si dovrebbe essere in grado di risolvere il problema in ciclo for.

Problemi correlati