2010-03-16 111 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){ return nodes [from] .distance(nodes [to]); } – livio8495

+0

您無法獲得SIGFPE返回的數字。 – bmargulies

回答

5

"Floating point exception" (SIGFPE)實際上是一個用詞不當。任何種類的算術異常都會觸發SIGFPE。這包括零除。

您應該檢查nodesedges是否爲空。

+0

是的,邊緣是空的。我的錯。謝謝!!! – livio8495

4

您可以做的最快的事情是使用調試器來捕獲引發異常的確切位置。如果使用的是G ++,你可以用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。在第一次迭代中,f將是元件的索引[0],並且t將是元素索引[1]。沒關係。 在下一次迭代中,f將是元素[1]的索引,而t將是元素[2]的索引,它不存在。

所以作爲一個猜測,這就是錯誤進入的地方......你正在做一個end()迭代器的getIndex()。

+0

如果'freePathNode.size()'返回2,那麼該循環只會經過一次迭代。雖然如果它返回0,它將遍歷整個'int'範圍,當它不應該循環時。 – dave4420

+0

啊是的。我的錯 :) – icabod