C++ C/FORTRAN将双下溢设置为零

C++ C/FORTRAN将双下溢设置为零,c++,c,dll,fortran,floating-point-exceptions,C++,C,Dll,Fortran,Floating Point Exceptions,我有一个传统的FORTRAN项目,有一些非常密集的计算。我希望C/C++代码能够访问此数学代码,因此我构建了一个FORTRAN dll,将其导入C/C++并开始从我的FORTRAN dll接收浮点下溢 同时,如果我从FORTRAN应用程序调用它,FORTRAN dll代码执行良好 最后,我发现我使用的编译器(它是集成到VS2013中的FTN95)有一个选项(/UNDERFLOW)。如果未指定此标志,默认情况下,所有底流都将转换为零。这发生在FORTRAN应用程序中。当我使用C代码从这个dll执行

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

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

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

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


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

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

收到浮点下溢是什么意思?你得到一个异常,或者一个非规范值或者什么?此外,太小的数字并不意味着什么坏事,它只是一个小数值,但它可以是数学上正确的结果。C++项目使用哪些编译器选项?是调试模式还是发布模式?当我使用导入的FORTRAN dll运行我的C代码时,在某个时候应用程序崩溃,内置的VS调试器通知我dll中发生了未处理的异常;描述说这是浮点下溢。还提供了错误函数的地址。具有标志(/UNDERFLOW)的FORTRAN应用程序也会发生同样的情况。我想告诉编译器,我希望所有的下溢都被视为零,没有断点/异常。FORTRAN编译器有这样的选项,而VC++似乎没有。好的,你看过手册了吗?我从来没有使用过VC++,但我的Google显示这是第一次使用TLDR:try
/fp:except-
是的,我已经阅读了文档并尝试了几种方法,但仍然一无所获。我知道这是由我疯狂的FORT/C互操作性造成的,但现在我很好奇。我不确定fp控件是如何影响double的,因为我的代码使用double,并且异常本质上是双精度下溢。是的,但我意外地找到了解决方案。问题不在C代码中,而是在FORTRAN编译器选项中生成.dll和.exe之间的差异。我会把答案贴在下面。无论如何,感谢您提供有关浮点厨房的有用链接和见解。