2010-03-16 6 views
0

У меня есть исключение с плавающей запятой, и я не знаю почему.Почему исключение с плавающей запятой?

код это:

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

Может кто-нибудь мне помочь? В чем проблема? Я могу это решить? большое спасибо

+0

На какой строке вы получаете сообщение об ошибке? Какова ценность 'dist_start_goal'? –

+0

Он компилируется, но в процессе выполнения, когда я прошу этот метод, у меня есть эта ошибка. метод node_dist: double node_dist (int from, int to) { возвратные узлы [from] .distance (узлы [to]); } – livio8495

+0

Вы не можете получить SIGFPE от возврата номера. – bmargulies

ответ

5

"Floating point exception" (SIGFPE) на самом деле является неправильным. Любое исключение из арифметики вызовет SIGFPE. Это включает в себя разделение на ноль.

Вы должны проверить, нет ли nodes и edges.

+0

Да, края были пусты. Виноват. Спасибо!!! – livio8495

4

Самая быстрая вещь, которую вы можете сделать, это использовать отладчик, чтобы зафиксировать точное место, где выбрасывается исключение. Если вы используете г ++ вы можете использовать GDB и сделать его остановить в броске:

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

вероятность того, что любой из делителей в код 0, и что запуская исключение, но используя отладчик покажет вам точную строку, и вы можете проверить значения переменных.

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

Давайте предположим, что freePathNode.size() возвращает 2. На первой итерации, е будет индекс элемента [0], и т будет индекс элемента [1]. Хорошо. На следующей итерации f будет индексом элемента [1], а t будет индексом элемента [2], которого не существует.

Так что, предположим, именно здесь происходит ошибка ... вы делаете getIndex() итератора end().

+0

Если 'freePathNode.size()' возвращает 2, то этот цикл будет проходить только через одну итерацию. Хотя, если он возвращает 0, он будет проходить через весь диапазон 'int', когда он не должен полностью зацикливаться. – dave4420

+0

Ах да. Виноват :) – icabod

Смежные вопросы