更改浮点舍入模式

什么是改变IEEE 754浮点数舍入模式的最有效方法? 可移植的C函数会很好,但使用x86汇编的解决方案也可以。

*我指的是朝向最近的,趋近于零的,以及朝向正/负无穷的标准舍入模式


这是标准的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的程序集。 你可以使用(完全非标准的) _control_fp( )来代替:

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

您可以在MSDN上阅读有关_control_fp()的更多信息。

而且,为了完整起见,舍入模式的宏名称的解码器环:

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

这可能有帮助。

编辑:我会说你会需要你自己的功能。 你可以在C中使用程序集。

但是,如果您注册的大小是64位,将其舍入到32位将使您的计算速度更快。 它实际上会让它变慢。 还记得64位微处理器的64位计算是容易的,而不是2-32位。 我不知道你想达到什么目的。 我知道表现符合你的标准。

链接地址: http://www.djcxy.com/p/85627.html

上一篇: Change floating point rounding mode

下一篇: Floating point relative error bounds, clarification needed