Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ fesetround()와 fegetround() 함수로 부동소수점 반올림 방향 제어하기

이 글에서는 C++에서 사용할 수 있는 fesetround()fegetround() 함수에 대해 알아봅니다. 두 함수 모두 <cfenv> 헤더에 포함되어 있으며, 부동소수점 연산의 반올림 방향을 설정하거나 확인하는 데 사용됩니다.

fesetround() 함수란?

fesetround() 함수는 지정한 부동소수점 반올림 방향을 현재 반올림 방향으로 설정하는 역할을 합니다. 이 함수는 C++의 rint(), nearbyint() 등 다양한 반올림 함수들과 함께 사용되며, 반올림 동작을 세밀하게 제어할 수 있게 해줍니다.

함수의 기본 문법은 다음과 같습니다.

int fesetround(int round);

매개변수 round에는 FE_TONEAREST(가장 가까운 값으로 반올림), FE_DOWNWARD(내림), FE_UPWARD(올림), FE_TOWARDZERO(0 방향으로 반올림) 등의 매크로를 전달할 수 있습니다. 함수가 성공적으로 반올림 방향을 적용하면 0을 반환합니다.

fesetround() 사용 예제

#include <cfenv>
#include <cmath>
#include <iostream>
using namespace std;

int main() {
    double x = 4.7, ans;
    
    fesetround(FE_TONEAREST); // 가장 가까운 정수로 반올림
    ans = rint(x);
    cout << "가장 가까운 정수: " << ans << endl;
    
    fesetround(FE_TOWARDZERO); // 0 방향으로 반올림 (버림)
    ans = rint(x);
    cout << "0 방향 반올림 결과: " << ans << endl;
    
    fesetround(FE_DOWNWARD); // 아래 방향(내림)으로 반올림
    ans = rint(x);
    cout << "작은 쪽 정수: " << ans << endl;
    
    fesetround(FE_UPWARD); // 위 방향(올림)으로 반올림
    ans = rint(x);
    cout << "큰 쪽 정수: " << ans << endl;
    
    return 0;
}

실행 결과

가장 가까운 정수: 5
0 방향 반올림 결과: 4
작은 쪽 정수: 4
큰 쪽 정수: 5

위 예제에서 볼 수 있듯이, 같은 값 4.7이라도 설정한 반올림 방향에 따라 결과가 달라지는 것을 확인할 수 있습니다.

fegetround() 함수란?

fegetround() 함수는 현재 설정된 부동소수점 반올림 방향에 해당하는 매크로 값을 반환합니다. 이 함수 역시 rint(), nearbyint() 등의 반올림 함수들과 함께 활용됩니다.

함수의 기본 문법은 매우 간단합니다.

int fegetround();

반환값은 다음 네 가지 부동소수점 반올림 매크로 중 하나입니다.

  • FE_TONEAREST: 가장 가까운 값으로 반올림
  • FE_DOWNWARD: 음의 무한대 방향(내림)
  • FE_UPWARD: 양의 무한대 방향(올림)
  • FE_TOWARDZERO: 0 방향으로 반올림

fegetround() 사용 예제

#include <cfenv>
#include <cmath>
#include <iostream>
using namespace std;

void float_direction() {
    switch (fegetround()) {
        case FE_TONEAREST:
            cout << "현재 매크로: FE_TONEAREST";
            break;
        case FE_DOWNWARD:
            cout << "현재 매크로: FE_DOWNWARD";
            break;
        case FE_UPWARD:
            cout << "현재 매크로: FE_UPWARD";
            break;
        case FE_TOWARDZERO:
            cout << "현재 매크로: FE_TOWARDZERO";
            break;
        default:
            cout << "알 수 없음";
    };
    cout << endl;
}

int main() {
    double x = 4.7, ans;
    
    fesetround(FE_TONEAREST); // 가장 가까운 정수로 반올림
    ans = rint(x);
    cout << "가장 가까운 정수: " << ans << endl;
    float_direction();
    
    fesetround(FE_TOWARDZERO); // 0 방향으로 반올림
    ans = rint(x);
    cout << "0 방향 반올림 결과: " << ans << endl;
    float_direction();
    
    fesetround(FE_DOWNWARD); // 내림
    ans = rint(x);
    cout << "작은 쪽 정수: " << ans << endl;
    float_direction();
    
    fesetround(FE_UPWARD); // 올림
    ans = rint(x);
    cout << "큰 쪽 정수: " << ans << endl;
    float_direction();
    
    return 0;
}

실행 결과

가장 가까운 정수: 5
현재 매크로: FE_TONEAREST
0 방향 반올림 결과: 4
현재 매크로: FE_TOWARDZERO
작은 쪽 정수: 4
현재 매크로: FE_DOWNWARD
큰 쪽 정수: 5
현재 매크로: FE_UPWARD

정리

fesetround()는 반올림 방향을 설정하는 함수이고, fegetround()는 현재 설정된 반올림 방향을 조회하는 함수입니다. 이 두 함수를 조합하면 프로그램 실행 중에도 부동소수점 반올림 동작을 유연하게 제어하고 검증할 수 있습니다. 금융 계산, 과학 시뮬레이션처럼 반올림 오차에 민감한 애플리케이션에서 특히 유용하게 활용됩니다.