C / FORTRAN将双下溢设置为零

时间:2015-04-13 08:46:15

标签: c++ c dll fortran floating-point-exceptions

我有一个遗留的FORTRAN项目,有一些非常激烈的计算。我想通过C / C ++代码访问这个数学代码,所以我构建了一个FORTRAN dll,用C / C ++导入它并开始从我的FORTRAN dll接收浮点下溢。

同时,如果我从FORTRAN应用程序调用它,FORTRAN DLL代码执行正常。

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

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

P.S。:是的,我理解依赖于一直抛出浮点异常的代码是愚蠢的。但是,这段代码很旧,而且目前无法使用最新技术完全重写它。

1 个答案:

答案 0 :(得分:0)

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