更改浮点舍入模式
什么是改变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