我正在将 Windows 程序移植到 linux 的过程中,并且被一段特定于 msvc 的代码难住了,这些代码似乎检查了是否给出了非正常或不精确结果的浮点操作。我非常不确定如何以稳健的方式实现它。我应该补充一点,当涉及到特定于 linux 的编程和像这样的非常低级的操作时,我相当缺乏经验。
具体来说,给我带来麻烦的部分如下:
if ( _statusfp() & ( _SW_INEXACT | _SW_DENORMAL) )
{
... portable stuff ...
}
_clearfp();
虽然 fenv.h 似乎提供了清除状态标志和检查不精确标志的能力,但它似乎没有在检查异常标志方面提供任何帮助。此外,我曾向我建议 gcc 可能会以不同的方式处理浮点运算,以至于可能无法简单地直接移植这段代码。我将不胜感激在这方面的任何帮助。
如果它是相关的,这将用于程序中非常重要的数字运算部分,其中性能很重要。
编辑:当根据http://en.cppreference.com/w/cpp/numeric/fenv/FE_exceptions生成非规范结果时, fenv.h 中名为 FE_UNDERFLOW 的标志似乎被引发,但已经看到其他几个来源表明只有当结果太小,即使是次正规的,它才会被提高。将运行测试以查看它是否也满足我的需求,如果是,请回答自己。