2016-09-06 5 views
1

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?

+2

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

+1

Sind Sie interessiert Warum wird die Ausnahme durch Ihren Code ausgelöst oder nur warum die Diagnose gedruckt wird? –

+0

Vladimir, beide ... – profilin

Antwort

1

Es scheint hier zwei Fragen zu geben. Versuchen wir, jeden einzelnen zu beantworten.

1. Warum hat die neue Version gfortran Druck eine solche Nachricht

Seit der Fortran 2008 Standard, dass die Ausführung der STOP-Anweisungen STOP-und ERROR erfordert gibt eine Liste der aktuell Signalisierung FP Ausnahmen (wenn eine solche Sache wird vom System unterstützt), folgt GFortran ab GFortran Version 4.9. Siehe https://gcc.gnu.org/ml/fortran/2013-06/msg00072.html.

2. Warum kommt die Code-Trigger diese Ausnahme, und warum ist es nur mit der neuen Version gfortran

Sehr wahrscheinlich passieren, die Ausnahme signalisiert wurde vor als gut, aber da war es nicht gedruckt auf die STOP-Anweisung, die Sie nicht wussten. Da das von Ihnen gezeigte Beispiel nicht eigenständig ist (ich kann es nicht kompilieren und testen), kann ich Ihnen nur empfehlen, die üblichen Debugging-Befehlszeilenoptionen wie "-fcheck = all, -ffpe-trap = ungültig, Null, Überlauf -g -Wall -Wextra -Werror -pedantic ", überprüfen Sie das Ausführen Ihres Programms unter Valgrind etc.

Verwandte Themen