Spec-Zone.ru › C++

std::fegetround, std::fesetround

Определён в заголовочном файле <cfenv>
int fesetround( int round )
(1) (начиная с C++11)
int fegetround()
(2) (начиная с C++11)

Управляет направлением округления чисел с плавающей точкой.

1) Пытается установить направление округления чисел с плавающей точкой в значение аргумента round, которое должно быть одной из макрокоманд округления чисел с плавающей точкой.
2) Возвращает значение макрокоманды округления чисел с плавающей точкой, соответствующее текущему направлению округления.

Параметры

round - направление округления, одна из макрокоманд округления чисел с плавающей точкой

Возвращаемое значение

1) 0 в случае успеха, иначе ненулевое значение.

2) Макрокоманда округления чисел с плавающей точкой, описывающая текущее направление округления, или отрицательное значение, если направление не удаётся определить.

Примечания

Текущий режим округления, отражающий результаты последнего вызова fesetround, также можно получить с помощью FLT_ROUNDS.

Сведения о влиянии округления см. в разделе макрокоманды округления чисел с плавающей точкой.

Пример

#include <cfenv>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <utility>
// #pragma STDC FENV_ACCESS ON

int main()
{
    static constexpr std::pair<const char*, const double> samples[]
    {
        {" 12.0", 12.0},  {" 12.1", 12.1}, {"-12.1", -12.1}, {" 12.5", 12.5},
        {"-12.5", -12.5}, {" 12.9", 12.9}, {"-12.9", -12.9}, {" 13.0", 13.0}
    };

    std::cout <<
        "│ sample │  FE_DOWNWARD  │   FE_UPWARD   │ FE_TONEAREST  │ FE_TOWARDZERO │\n";

    for (const auto& [str, fp] : samples)
    {
        std::cout << "│ " << std::setw(6) << str << " │  ";
        for (const int dir : {FE_DOWNWARD, FE_UPWARD, FE_TONEAREST, FE_TOWARDZERO})
        {
            std::fesetround(dir);
            std::cout << std::setw(10) << std::fixed << std::nearbyint(fp) << "   │  ";
        }
        std::cout << '\n';
    }
}

Вывод:

│ sample │  FE_DOWNWARD  │   FE_UPWARD   │ FE_TONEAREST  │ FE_TOWARDZERO │
│   12.0 │   12.000000   │   12.000000   │   12.000000   │   12.000000   │
│   12.1 │   12.000000   │   13.000000   │   12.000000   │   12.000000   │
│  -12.1 │  -13.000000   │  -12.000000   │  -12.000000   │  -12.000000   │
│   12.5 │   12.000000   │   13.000000   │   12.000000   │   12.000000   │
│  -12.5 │  -13.000000   │  -12.000000   │  -12.000000   │  -12.000000   │
│   12.9 │   12.000000   │   13.000000   │   13.000000   │   12.000000   │
│  -12.9 │  -13.000000   │  -12.000000   │  -13.000000   │  -12.000000   │
│   13.0 │   13.000000   │   13.000000   │   13.000000   │   13.000000   │

См. также

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

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

Spec-Zone.ru

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