5

我正在将 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 的标志似乎被引发,但已经看到其他几个来源表明只有当结果太小,即使是次正规的,它才会被提高。将运行测试以查看它是否也满足我的需求,如果是,请回答自己。

4

2 回答 2

1

C++11 适合你吗?如果是这样,也许您可​​以调用std::isnormal结果,例如http://en.cppreference.com/w/cpp/numeric/math/isnormal

于 2013-06-24T22:31:29.533 回答
0

正如问题中所说,似乎 fenv.h 有一个标志 FE_UNDERFLOW ,在某些架构上至少表明一个低于正常/非正常的结果。我自己的测试表明在我的测试 x86 架构上似乎就是这种情况,所以我将继续使用它,除非提供更好的解决方案。

于 2013-06-27T08:06:14.420 回答