2010-03-16 108 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