2016-12-17 6 views
2

Ich habe ein kleines Problem mit NaN-Traps, während ich Ctypes und gemeinsame Bibliothek verwenden. Die Bibliothek wurde in Fortran geschrieben und besteht aus dem Unterprogramm, das die Zeile ‚Division durch Null‘ hat:Setup NaN-Traps in der gemeinsam genutzten Bibliothek

nantest.f90 

subroutine nantest 
    real :: a, b, c 
    a = 0. 
    b = 0. 
    c = a/b 
    print *, c,a,b 
end subroutine nantest 

program main 
    call nantest 
end program main 

Ich habe eine gemeinsame Bibliothek von ihm die Optionen:

gfortran -o nantest.os -c -g -fbacktrace -ffpe-trap=invalid,zero,overflow -fPIC nantest.f90 
gfortran -o libnantest.so -shared nantest.os 

Dann ist dieses Ich lade Bibliothek direkt aus dem Python-Skript:

from ctypes import * 
lib = CDLL('./libnantest.so') 
lib.nantest_() 

und es gibt mir die Ausgabe ohne Ausnahme:

  NaN 0.00000000  0.00000000 

Was ist los? Ist es Ctypes oder Compileroptionen Problem? BTW, wenn ich die direkte Ausführung von ‚nantest‘ Programm durchgeführt mit den gleichen Compiler-Optionen gebaut Ich habe, was ich wollte:

Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation. 
Backtrace for this error: 
#0 0x7F4D08B6FE08 
#1 0x7F4D08B6EF90 
#2 0x7F4D087C04AF 
#3 0x40080D in nantest_ at nantest.f90:7 
#4 0x4008B9 in MAIN__ at nantest.f90:14 
Floating point exception 

Also, wie kann ich die NaN-Ausnahme in dem gemeinsamen genutzten Bibliothek Fall bekommen? Irgendwelche Empfehlungen?

Antwort

1

Die Python-Laufzeitumgebung legt einen eigenen FPE-Modus fest. Sie können versuchen, die Fortran 2003-Prozeduren zu verwenden, um FPE-Ausnahmen genau an der Stelle festzulegen, die Sie benötigen. Sie sind in dem Eigenmodul IEEE_EXCEPTIONS, zum Beispiel Verfahren ieee_get_halting_mode(). Siehe auch GFortran equivalent of ieee_exceptions

Die -ffpe-trap=invalid,zero,overflow ist nur nützlich beim Kompilieren eines Fortran-Programms.

Oder verwenden Sie die Python-Features (https://docs.python.org/2/library/fpectl.html), um herauszufinden, ob irgendwelche Gleitkommaausnahmen signalisieren, aber ich weiß nicht, ob die Schnittstelle zwischen Python und der Bibliothek sie erhält.

Verwandte Themen