2010-03-16 7 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 (nodes [to]); } – livio8495

+0

숫자를 반환하는 SIGFPE를 가져올 수 없습니다. – bmargulies

답변

5

"Floating point exception" (SIGFPE)은 실제로 잘못된 이름입니다. 모든 종류의 산술 연산 예외가 SIGFPE를 트리거합니다. 여기에는 0으로 나누기가 포함됩니다.

nodesedges이 비어 있는지 확인해야합니다. 코드에서

+0

예, 가장자리가 비어 있습니다. 내 실수. 고맙습니다!!! – livio8495

4

디버거를 사용하여 예외가 던져지는 정확한 위치를 캡처하는 것이 가장 빠릅니다. 당신은 g을 사용하는 경우 ++ 당신은 GDB를 사용하고 그것을 던져에 중지 할 수 있습니다 :

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

기회가 코드의 약수 중 하나가 0이고 그것이 당신을 말할 것이다 디버거를 사용하여 예외를 유발하지만되어 있습니다 정확한 라인과 변수 값을 확인할 수 있습니다.

0

, 다음과 같은 한 : [0], t는 것

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

가 첫 번째 반복에 2를 반환) freePathNode.size을 (가정하자, F는 요소의 인덱스를 할 것이다 요소 [1]의 인덱스 괜찮아. 다음 반복에서 f는 요소 [1]의 색인이되고 t는 존재하지 않는 요소 [2]의 색인이됩니다.

그래서 추측하여 오류가 발생하는 곳입니다. end() 반복기의 getIndex()를 수행하고 있습니다.

+0

'freePathNode.size()'가 2를 반환하면 그 루프는 하나의 반복만을 거치게됩니다. 비록 그것이 0을 반환한다면 그것은 'int'의 전체 범위를 통해 루프 할 것입니다, 그것이 전혀 반복되지 않아야합니다. – dave4420

+0

아 맞습니다. 내 실수 :) – icabod