首页 文章

更改浮点舍入模式

提问于
浏览
38

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

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

2 回答

  • 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 指令)设置舍入 .

    Edit 您无需为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
    
  • -4

    this可能有所帮助 .

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

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

相关问题