0

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

同时,如果我从 FORTRAN 应用程序调用 FORTRAN dll 代码,它的执行效果很好。

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

所以,问题是:有没有办法强制 VC++ 编译器将下溢转换为零?

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

4

1 回答 1

0

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

于 2015-04-13T11:55:07.273 回答