Spec-Zone.ru › C

fegetround, fesetround

Defined in header <fenv.h>
int fesetround( int round );
(1) (since C99)
int fegetround();
(2) (since 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)
{
    /* Default rounding direction */
    show_fe_current_rounding_direction();
    printf("+11.5 -> %+4.1f\n", rint(+11.5)); /* midway between two integers */
    printf("+12.5 -> %+4.1f\n", rint(+12.5)); /* midway between two integers */
 
    /* Save current rounding direction. */
    int curr_direction = fegetround();
 
    /* Temporarily change current rounding direction. */
    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));
 
    /* Restore default rounding direction. */
    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:2023):
    • 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 (p: 193)
    • 7.6.3.2 Функция fesetround (p: 193-194)

См. также

nearbyintnearbyintfnearbyintl
(C99)(C99)(C99)
округляет к целому числу, используя текущий режим округления
(функция)
rintrintfrintllrintlrintflrintlllrintllrintfllrintl
(C99)(C99)(C99)(C99)(C99)(C99)(C99)(C99)(C99)
округляет к целому числу, используя текущий режим округления,
с исключением, если результат отличается
(функция)
C++ документация для fegetround, fesetround

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/numeric/fenv/feround

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API