2016-09-06 4 views
1

현재 내 상사가 90 년대에 작성한 일부 소프트웨어의 서브 루틴을 디버깅하기 위해 노력하고 있습니다.부동 소수점 예외가 새로운 gfortran 버전의 신호입니다.

16 irad=1,incmax 
    rr1=rr2 
    rr2=rr2+rdiv 
     if(rr1.gt.rlimit) goto 16 
     if(pts(irad).gt.0.0) then 
     discrm=(rmsden(mt,irad)/pts(irad)) 
    1   -((average(mt,irad)**2)/(pts(irad)**2)) 
     else 
     discrm=0.0 
     endif 
     if(discrm.ge.0.0) then 
     rmsden(mt,irad)=sqrt(discrm) 
     else 
     rmsden(mt,irad)=0.0 
     endif 

     average(mt,irad)=average(mt,irad)/pts(irad) 
     average(mt,irad)=(average(mt,irad)*100.0)/bigmost(mt) 
     rmsden(mt,irad)=(rmsden(mt,irad)*100.0)/bigmost(mt) 
     denbot(mt,irad)=(denbot(mt,irad)*100.0)/bigmost(mt) 
     dentop(mt,irad)=(dentop(mt,irad)*100.0)/bigmost(mt) 
     iradmax(mt)=irad 


17 if(iverbose0.ge.1) then 
     ipts=pts(irad) 
     iptszero=ptszero(irad) 
     if(ipts.eq.0) then 
      average(mt,irad)=0.0 
      rmsden(mt,irad)=0.0 
      denbot(mt,irad)=0.0 
      dentop(mt,irad)=0.0 
     endif 
     write(6,99) rr1,rr2,ipts,iptszero,average(mt,irad), 
    1    rmsden(mt,irad),denbot(mt,irad),dentop(mt,irad) 
99  format(1x,2f9.2,2i8,2f8.1,2f8.1) 
     endif 
16 continue 
     stop 'PIPPA' 

If I put the stop 'PIPPA' statement before "16 continue", the there are no errors. However, if the stop statement goes after the "16 continue", I get: 
Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG 
STOP PIPPA 

이는 GCC 컴파일러/라이브러리를 업그레이드하기 전에 일어나지 않았다 : 특정 서브 루틴의 DO 루프에서 발생하는 부동 소수점 예외가 될 것 같다. 나는 인터넷 검색을 통해 많은 자원을 찾았다는 것을 인정하지만 여전히 이것을 디버깅 할 수는 없다. 또한 컴파일 할 때 --fpe-trap 플래그를 시도했지만 아무 것도 출력하지 않습니다.

왜 gfortran이 현재 불평하고 있습니까?

+2

참조 http://stackoverflow.com/questions/35992992/gfortran-ieee-exception-inexact –

+1

관심이 있습니까? 예외가 귀하의 코드에 의해 유발되는 이유 또는 진단이 인쇄되는 이유는 무엇입니까? –

+0

블라디미르, 둘 다 ... – profilin

답변

1

여기에는 두 가지 질문이있는 것으로 보입니다. 각각에 대답하려고 노력하십시오. 그런 일 경우 포트란 2008 표준 이후 새로운 GFortran 버전 인쇄 이러한 메시지

은 정지하고 ERROR STOP 문의 실행을 필요로 않습니다 왜

1. (현재 신호 FP 예외의 목록을 출력 시스템에서 지원됩니다.) GFortran은 GFortran 버전 4.9에서이 기능을 수행합니다. https://gcc.gnu.org/ml/fortran/2013-06/msg00072.html을 참조하십시오.

2. 왜 내 코드 트리거이 예외를하지, 왜 그것은 단지, 예외가 이전뿐만 아니라 신호 된 새로운 GFortran 버전

매우 가능성이 일어날 않지만, 이후로는에 인쇄되지 않았습니다 그걸 몰랐던 STOP 문. 보여준 예제는 자체 포함이 아니기 때문에 (컴파일 할 수없고 테스트 할 수 없음) "-fcheck = all, -ffpe-trap = invalid,"와 같은 일반적인 디버깅 명령 줄 옵션을 사용하는 것이 좋습니다. 제로, 오버 플로우 -g -Wall -Wextra -Werror -pedantic ", valgrind 등에서 프로그램 실행 확인.