更改浮点舍入模式

时间:2011-07-29 01:26:12

标签: c++ c floating-point x86

更改IEEE 754浮点数的舍入模式*的最有效方法是什么?便携式C函数会很好,但使用x86程序集的解决方案也可以。

*我指的是朝向最近,朝零和朝向正/负无穷大的标准舍入模式

2 个答案:

答案 0 :(得分:37)

这是标准的C解决方案:

#include <fenv.h>
#pragma STDC FENV_ACCESS ON

// store the original rounding mode
const int originalRounding = fegetround( );
// establish the desired rounding mode
fesetround(FE_TOWARDZERO);
// do whatever you need to do ...

// ... and restore the original mode afterwards
fesetround(originalRounding);

在缺乏C99支持的后台平台上,您可能需要求助于组装。在这种情况下,您可能需要为x87单元(通过fldcw指令)和SSE(通过ldmxcsr指令)设置舍入。

修改 您无需为MSVC求助。您可以使用(完全非标准的)_controlfp( )代替:

unsigned int originalRounding = _controlfp(0, 0);
_controlfp(_RC_CHOP, _MCW_RC);
// do something ...
_controlfp(originalRounding, _MCW_RC);

您可以阅读有关_controlfp()on MSDN的更多信息。

而且,为了完整性,还有用于舍入模式的宏名称的解码器环:

rounding mode    C name         MSVC name
-----------------------------------------
to nearest       FE_TONEAREST   _RC_NEAR
toward zero      FE_TOWARDZERO  _RC_CHOP
to +infinity     FE_UPWARD      _RC_UP
to -infinity     FE_DOWNWARD    _RC_DOWN

答案 1 :(得分:-4)

this可能会有所帮助。

编辑:我会说你需要自己的功能。你可以在C里面使用汇编。

但是如果你的寄存器大小为64位,那么将其四舍五入会使你的计算速度更快。它实际上会让它变慢。请记住,对于64位微处理器而不是2-32位,64位计算很容易。我不知道你想要达到什么目标。我知道表现符合您的标准。