2010-03-16 6 views
0

J'ai une exception de virgule flottante, et je ne sais pas pourquoi.pourquoi Exception de virgule flottante?

le code est le suivant:

void calcola_fitness(){ 
    vector<double> fitness; 
    int n=nodes.size(); 
    int e=edges.size(); 
    int dim=feasibility.size(); 
    int feas=(feasibility[dim-1])*100; 
    int narchi=numarchicoll[dim-1]/e; 
    int numero_nodi=freePathNode.size()/n; 
    double dist_start_goal=node_dist(0,1); 
    int i,f,t; 
    double pathlenght=0; 
    int siize=freePathNode.size(); 
    for(i=0;i!=siize-1; i++){ 
     f=freePathNode[i].getIndex(); 
     i++; 
     t=freePathNode[i].getIndex(); 
     i--; 
     pathlenght=pathlenght+node_dist(f,t); 
    }   
    double pathlenghtnorm=pathlenght/10*dist_start_goal; 
    double fit=((double)numero_nodi+pathlenghtnorm+(double)narchi)*((double)feas); 
    fitness.push_back(fit); 
} 

Quelqu'un pourrait me aider? Quel est le problème? Je pourrais résoudre ce problème? merci beaucoup

+0

Sur quelle ligne obtenez-vous l'erreur? Quelle est la valeur de 'dist_start_goal'? –

+0

Il compile, mais en exécution quand je demande cette méthode, j'ai cette erreur. la méthode node_dist est la suivante: double node_dist (int de, int à) { renvoyer des noeuds [from] .distance (noeuds [à]); } – livio8495

+0

Vous ne pouvez pas obtenir un SIGFPE pour renvoyer un nombre. – bmargulies

Répondre

5

"Floating point exception" (SIGFPE) est en fait un abus de langage. Tout type d'exception arithmétique déclenchera SIGFPE. Cela comprend la division par zéro. Vous devez vérifier si nodes et edges sont vides.

+0

oui, les bords étaient vides. Mon erreur. Je vous remercie!!! – livio8495

4

Le plus rapide que vous pouvez faire est d'utiliser un débogueur pour capturer l'endroit exact où l'exception est levée. Si vous utilisez g ++ vous pouvez utiliser gdb et faire cesser au lancer:

shell$ gdb binary 
(gdb) catch throw 
(gdb) run 

Il y a des chances que l'un des diviseurs dans le code est 0 et qui déclenche l'exception, mais en utilisant un débogueur vous dira la ligne exacte et vous pouvez vérifier les valeurs des variables.

0

Dans votre code, vous avez les éléments suivants:

int siize=freePathNode.size(); 
for(i=0;i!=siize-1; i++){ 
    f=freePathNode[i].getIndex(); 
    i++; 
    t=freePathNode[i].getIndex(); 
    i--; 
    pathlenght=pathlenght+node_dist(f,t); 
} 

laisse supposer retourne freePathNode.size() 2. Dans la première itération, f sera l'indice de l'élément [0], et t sera l'indice de l'élément [1]. C'est très bien. A l'itération suivante, f sera l'indice de l'élément [1], et t sera l'indice de l'élément [2], qui n'existe pas. Donc, en guise de supposition, c'est là que l'erreur arrive ... vous faites un getIndex() de l'itérateur end().

+0

Si 'freePathNode.size()' renvoie 2 alors cette boucle ne passera qu'une seule itération. Bien que s'il retourne 0, il passera en boucle sur toute la plage de 'int', alors qu'il ne devrait pas boucler du tout. – dave4420

+0

Ah oui. Mon erreur :) – icabod

Questions connexes