Ich arbeite gerade daran, eine Subroutine einiger Software zu debuggen, die mein Chef in den 90er Jahren geschrieben hat. Es scheint eine Floating-Point-Ausnahme zu sein, die in einer do-Schleife einer bestimmten Unterprogramm auftritt:Floating-Point-Ausnahmen signalisieren in der neuen gfortran-Version
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
Dies ist nicht vor der Aktualisierung der GCC Compiler/Bibliotheken der Fall war. Ich gebe zu, dass ich durch Googeln viele Ressourcen gefunden habe, aber ich bin immer noch nicht in der Lage, dies zu debuggen. Ich habe auch versucht, die --fpe-trap
Flags bei der Kompilierung, aber sie geben nichts aus.
Warum klagen gfortran jetzt?
Siehe http://stackoverflow.com/questions/35992992/gfortran-ieee-exception-inexact –
Sind Sie interessiert Warum wird die Ausnahme durch Ihren Code ausgelöst oder nur warum die Diagnose gedruckt wird? –
Vladimir, beide ... – profilin