C/FORTRAN将双下溢设置为零
C/FORTRAN set double underflow to zero
我有一个遗留的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程序的执行。
相关文章:
- 自定义 std::fstream,std::filebuf 的溢出和下溢函数未为每个字符调用
- 带有剪裁下溢的夏亚减法
- 使用 size_t 初始化循环变量时的整数下溢
- 无锁队列实现中的虚假下溢C++
- 在减法期间将 C++ 转换为字节 (unit8_t) 不会像我预期的那样强制下溢;输出int16_t;为什么?
- C++长 int 溢出/下溢
- 上溢/下溢是执行时未定义的行为吗
- C++ 在将字符串提取到标量时处理溢出/下溢
- 在 c++ 中的区域语言设置下获取当前位置值
- C/FORTRAN将双下溢设置为零
- 在列表迭代器中设置下一个对象
- basic_streambuf炒锅的功能溢出和下溢如何
- 为什么C++下溢/溢出行为被视为未定义
- C++下溢和溢出
- 渐变下溢程序的表示
- 指针下溢或溢出时会发生什么情况
- 溢流/下溢问题
- 如何在C语言中检测浮点下溢
- 如何检测双精度浮点溢出和下溢
- 未签名的下溢机制