更改浮点舍入模式

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

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

这是标准的C解决scheme:

#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()的更多信息。

而且,为了完整性,舍入模式的macros名称的解码器环:

 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 

这可能有帮助。

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

但是,如果你注册的大小是64位的,将其舍入到32位会使你的计算速度更快。 这实际上会让它变慢。 记住,对于64位微处理器,64位计算很容易,而不是2-32位。 我不知道你想达到什么目的。 我知道性能是在你的标准。