Namespaces
Variants

fegetround, fesetround

From cppreference.net
< c ‎ | numeric ‎ | fenv
定义于头文件 <fenv.h>
int fesetround ( int round ) ;
(1) (C99 起)
int fegetround ( ) ;
(2) (C99 起)

1) 尝试将浮点舍入方向设置为参数 round 的值,该参数应为某个 浮点舍入宏

2) 返回与当前舍入方向对应的 浮点数舍入宏 的值。

目录

参数

round - 舍入方向,为 浮点舍入宏 之一

返回值

1) 0 表示成功,非零值表示失败。

2) 描述当前舍入方向的 浮点舍入宏 ,若无法确定方向则返回负值。

注释

当前的舍入模式,反映了最近一次 fesetround 的效果,也可以通过 FLT_ROUNDS 进行查询。

示例

#include <fenv.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON
void show_fe_current_rounding_direction(void)
{
    printf("current rounding direction:  ");
    switch (fegetround())
    {
           case FE_TONEAREST:  printf ("FE_TONEAREST");  break;
           case FE_DOWNWARD:   printf ("FE_DOWNWARD");   break;
           case FE_UPWARD:     printf ("FE_UPWARD");     break;
           case FE_TOWARDZERO: printf ("FE_TOWARDZERO"); break;
           default:            printf ("unknown");
    };
    printf("\n");
}
int main(void)
{
    /* 默认舍入方向 */
    show_fe_current_rounding_direction();
    printf("+11.5 -> %+4.1f\n", rint(+11.5)); /* 两个整数的中间值 */
    printf("+12.5 -> %+4.1f\n", rint(+12.5)); /* 两个整数的中间值 */
    /* 保存当前舍入方向 */
    int curr_direction = fegetround();
    /* 临时更改当前舍入方向 */
    fesetround(FE_DOWNWARD);
    show_fe_current_rounding_direction();
    printf("+11.5 -> %+4.1f\n", rint(+11.5));
    printf("+12.5 -> %+4.1f\n", rint(+12.5));
    /* 恢复默认舍入方向 */
    fesetround(curr_direction);
    show_fe_current_rounding_direction();
    return 0;
}

可能的输出:

current rounding direction:  FE_TONEAREST
+11.5 -> +12.0
+12.5 -> +12.0
current rounding direction:  FE_DOWNWARD
+11.5 -> +11.0
+12.5 -> +12.0
current rounding direction:  FE_TONEAREST

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 7.6.3.1 fegetround 函数 (p: TBD)
  • 7.6.3.2 fesetround 函数 (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 7.6.3.1 fegetround 函数 (p: TBD)
  • 7.6.3.2 fesetround 函数 (p: TBD)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.6.3.1 fegetround 函数 (p: 212)
  • 7.6.3.2 fesetround 函数 (p: 212-213)
  • C99标准(ISO/IEC 9899:1999):
  • 7.6.3.1 fegetround函数(页码:193)
  • 7.6.3.2 fesetround函数(页码:193-194)

参见

使用当前舍入模式舍入到整数
(函数)
(C99) (C99) (C99) (C99) (C99) (C99) (C99) (C99) (C99)
使用当前舍入模式舍入到整数,若结果不同则产生异常
(函数)
C++ 文档 关于 fegetround , fesetround