Floating point IEEE 754中的向下取整运算结果

Floating point IEEE 754中的向下取整运算结果,floating-point,rounding,ieee-754,Floating Point,Rounding,Ieee 754,对于IEEE 754(浮点,32位)中使用单精度值的运算,当无法获得精确结果时,是否有方法以某种方式调整两个操作数以确保运算结果向下舍入?换言之,我如何才能强制将round转换为-Inf 例如: 典型结果(使用“四舍五入到最近值”):1.0f/3.0f=0.3333333 432674407958984375f 预期结果(使用“向下舍入”):1.0f/3.0f=0.3333333 13465118408203125f 作为补充信息,我将在C99中执行此操作,并且(不幸的是)无法配置FPU。C

对于IEEE 754(浮点,32位)中使用单精度值的运算,当无法获得精确结果时,是否有方法以某种方式调整两个操作数以确保运算结果向下舍入?换言之,我如何才能强制将round转换为-Inf

例如:

  • 典型结果(使用“四舍五入到最近值”):
    1.0f/3.0f=0.3333333 432674407958984375f
  • 预期结果(使用“向下舍入”):
    1.0f/3.0f=0.3333333 13465118408203125f

作为补充信息,我将在C99中执行此操作,并且(不幸的是)无法配置FPU。

C 1999和当前的C标准都指定了设置浮点舍入模式的工具。然而,并非所有的C实现都支持它们。在这样做的实现中,以下代码将保存以前的舍入模式,执行舍入到负无穷大的操作,并恢复以前的舍入模式:

//  Declare identifiers for accessing floating-point environment.
#include <fenv.h>


void foo(void *data)
{
    //  Inform compiler this code accesses the floating-point environment.
    #pragma STDC FENV_ACCESS ON

    //  Save caller's rounding mode.
    int PreviousRoundingMode = fegetround();

    //  Set desired rounding mode.
    if (fesetround(FE_DOWNWARD) != 0)
    {
        //  fesetround failed.  Handle error.
    }

    //  Insert here code to perform desired operations.

    //  Restore previous rounding mode.
    fesetround(PreviousRoundingMode);
}
}
//声明访问浮点环境的标识符。
#包括
void foo(void*数据)
{
//通知编译器此代码访问浮点环境。
#布拉格STDC FENV_通道
//保存呼叫方的舍入模式。
int-PreviousRoundingMode=fegetround();
//设置所需的舍入模式。
如果(FESETOUND(FE_向下)!=0)
{
//fesetround失败。处理错误。
}
//在此处插入代码以执行所需的操作。
//恢复以前的舍入模式。
fesetround(先前的roundingmode);
}
}
请注意,基本操作,如
+
*
-
/
,和
fma
可能符合舍入模式,但数学库函数,如
sin
log
可能不符合要求。

Re“在C99中,并且(不幸的是)无法配置FPU”你为什么这么说?C 1999在第7.6条中规定了这方面的设施,标题为