2016-12-17 2 views
2

У меня есть небольшая проблема с ловушками NaN, когда я использую ctypes и общую библиотеку. Библиотека была написана на языке Фортран и состоит из подпрограммы, которая имеет «деление на ноль» линии:Настройка ловушек NaN в общей библиотеке

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 

Я сделал общую библиотеку из него с помощью опции:

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

Тогда я загружаю это библиотека прямо из скрипта Python:

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

и это дает мне выход без каких-либо исключений:

  NaN 0.00000000  0.00000000 

Что не так? Это проблемы с типами или компиляторами? Кстати, когда я выполнил непосредственное выполнение программы «nantest» построен с теми же опциями компилятора, которые я получил то, что хотел:

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 

Итак, как я могу получить NaN-исключение в общей библиотеке случае? Любые рекомендации?

ответ

1

Время выполнения Python устанавливает собственный режим FPE. Вы можете попробовать процедуры Fortran 2003 для установки исключений FPE в нужном месте. Они находятся в внутреннем модуле IEEE_EXCEPTIONS, например, процедуре ieee_get_halting_mode(). См. Также GFortran equivalent of ieee_exceptions

-ffpe-trap=invalid,zero,overflow полезен при компиляции программы Fortran.

Или используйте функции Python (https://docs.python.org/2/library/fpectl.html), чтобы выяснить, сигнализируют ли какие-либо ошибки с плавающей запятой, но я не знаю, сохраняет ли интерфейс между Python и библиотекой.

Смежные вопросы