我正在将一个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的标志,但是已经看到其他几个来源声明只有在结果太小时它才会被引发对于一个次正规。将运行测试以查看它是否也能满足我的需求,并且如果是这样的话,自己回答。
答案 0 :(得分:1)
C ++ 11是您的选择吗?如果是这样,也许您可以在结果上调用std::isnormal
,例如, http://en.cppreference.com/w/cpp/numeric/math/isnormal。
答案 1 :(得分:0)
正如在问题中所说,似乎fenv.h有一个标志FE_UNDERFLOW,在某些架构上至少表示一个低于正常/非正常的结果。我自己的测试表明,在我的测试x86架构中似乎就是这种情况,所以我将继续使用它,除非提供更好的解决方案。