C/FORTRAN将双下溢设置为零

C/FORTRAN set double underflow to zero

本文关键字:设置 下溢 FORTRAN      更新时间:2023-10-16

我有一个遗留的FORTRAN项目,有一些非常密集的计算。我希望这个数学代码能被C/C++代码访问,所以我构建了一个FORTRAN dll,将其导入C/C++,并开始从我的FORTRAN dll接收浮点下溢。

同时,如果我从FORTRAN应用程序调用它,那么FORTRAN dll代码执行良好。

最后,我发现我使用的编译器(它是集成到VS2013中的FTN 95)有一个选项(/ANDERFLOW)。如果未指定此标志,则默认情况下,所有下溢都将转换为零。这种情况发生在FORTRAN应用程序中。当我使用C代码从这个dll执行方法时,我会收到下溢。

所以,问题是:有什么方法可以强制VC++编译器将下溢转换为零吗?

附言:是的,我知道依赖一个总是抛出浮点异常的代码是愚蠢的。然而,这段代码是旧的,在这一点上,不可能使用最新的技术完全重写它。

所以,问题出在FTN95编译器上。上面提到的标志(/ANDERFLOW)似乎只有在构建应用程序时才有用。当目标输出为DLL时,会忽略此标志的影响。相反,我发现了一个编译器指令,它是通过调用MASK_UNDERFLOW@()子例程来访问的。在FORTRAN函数中插入对该子例程的显式调用后,抛出下溢并重新编译DLL,我成功地启动了一个C程序,并使用FORTRAN DLL中的函数执行了必要的计算。此外,还使用了fp:/except-VC++编译器标志来确保没有其他下溢会影响C程序的执行。