C++에서는 부동소수점 값을 정수로 변환할 때 단순한 형 변환 외에도, 현재 설정된 반올림 모드를 따르는 전용 함수들을 제공합니다. 이번 글에서는 그중 lrint()와 llrint() 함수의 개념과 사용법을 예제와 함께 자세히 살펴보겠습니다.
lrint() 함수란?
lrint() 함수는 인자로 전달된 소수점 값을 현재 반올림 모드(current rounding mode)에 따라 정수 값으로 반올림합니다. 반올림 모드는 <cfenv> 헤더의 fesetround() 함수를 통해 설정할 수 있으며, FE_UPWARD(올림), FE_DOWNWARD(내림), FE_TONEAREST(가장 가까운 값), FE_TOWARDZERO(0 방향 절단) 등이 있습니다.
이 함수는 double, float 또는 정수 값을 입력 매개변수로 받으며, 소수 부분을 반올림한 결과를 long int 타입으로 반환합니다.
사용 예제
#include <cfenv>
#include <cmath>
#include <iostream>
using namespace std;
int main() {
double x = 40.0235;
long int res;
fesetround(FE_DOWNWARD); // 반올림 방향을 내림(downward)으로 설정
res = lrint(x);
cout << "Downward rounding of " << x << " is " << res << endl;
}
실행 결과
Downward rounding of 40.0235 is 40
llrint() 함수란?
llrint() 함수 역시 인자로 전달된 소수점 값을 현재 반올림 모드에 따라 정수 값으로 반올림하며, 반올림 모드는 마찬가지로 fesetround() 함수로 결정됩니다.
lrint()와의 차이점은 반환 타입입니다. llrint()는 결과를 long long int 타입으로 반환하기 때문에, 더 넓은 범위의 정숫값이 필요한 상황에 적합합니다.
사용 예제
#include <cfenv>
#include <cmath>
#include <iostream>
using namespace std;
int main() {
double a;
long long int res;
fesetround(FE_UPWARD); // 반올림 방향을 올림(upward)으로 설정
a = 40.3;
res = llrint(a);
cout << "Upward rounding of " << a << " is " << res << endl;
fesetround(FE_DOWNWARD); // 반올림 방향을 내림(downward)으로 설정
a = 40.88;
res = llrint(a);
cout << "Downward rounding of " << a << " is " << res << endl;
}
실행 결과
Upward rounding of 40.3 is 41 Downward rounding of 40.88 is 40
정리
lrint()와 llrint()는 일반적인 형 변환이나 round() 함수와 달리 현재 반올림 모드를 그대로 따른다는 점이 특징입니다. 두 함수 모두 <cmath>와 <cfenv> 헤더를 필요로 하며, 반환 타입만 long int와 long long int로 서로 다릅니다. 반올림 동작을 세밀하게 제어해야 하는 수치 계산 코드에서 유용하게 활용할 수 있습니다.