현재 내 상사가 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이 현재 불평하고 있습니까?
참조 http://stackoverflow.com/questions/35992992/gfortran-ieee-exception-inexact –
관심이 있습니까? 예외가 귀하의 코드에 의해 유발되는 이유 또는 진단이 인쇄되는 이유는 무엇입니까? –
블라디미르, 둘 다 ... – profilin