gpt4 book ai didi

python - 在共享库中设置 NaN 陷阱

转载 作者:太空宇宙 更新时间:2023-11-04 05:18:06 25 4
gpt4 key购买 nike

我在使用 ctypes 和共享库时遇到了 NaN 陷阱的小问题。该库是用 Fortran 编写的,由具有“除以零”行的子例程组成:

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_()

它毫无异常(exception)地给我输出:

          NaN   0.00000000       0.00000000   

怎么了?是 ctypes 还是编译器选项问题?顺便说一句,当我直接执行使用相同编译器选项构建的“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 异常?有什么建议吗?

最佳答案

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 和库之间的接口(interface)是否保留了它们。

关于python - 在共享库中设置 NaN 陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41200386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com