繁体   English   中英

更改浮点舍入模式

[英]Change floating point rounding mode

更改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的汇编。 您可以使用(完全非标准的) _controlfp( )

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

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

而且,仅出于完整性考虑,用于舍入模式的宏名称的解码器环:

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位微处理器,而不是2-32位,64位计算很容易。 我不知道您到底想实现什么。 我知道性能取决于您的标准。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM