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