C++에서는 부동소수점 값을 반올림된 정수 형태로 변환할 때 사용할 수 있는 세 가지 함수가 제공됩니다. 바로 rint(), rintf(), rintl()입니다. 이 세 함수는 이름과 다루는 자료형만 다를 뿐 기본적인 동작 방식은 동일하며, <cmath> 헤더에 선언되어 있습니다.
rint() 함수
rint() 함수는 부동소수점 값을 정수로 반올림하는 데 사용됩니다. 이 함수는 현재 설정된 반올림 모드(current rounding mode)에 따라 결과가 결정되며, 별도로 설정하지 않으면 기본적으로 '가장 가까운 짝수로 반올림(round-to-nearest-even)' 방식이 적용됩니다.
만약 계산 결과가 반환 타입으로 표현 가능한 범위를 벗어나면 도메인 오류(domain error)가 발생할 수 있으며, 인자가 0이거나 무한대(infinity)인 경우에는 값이 변경되지 않고 그대로 반환됩니다.
함수 원형은 다음과 같습니다.
float rint(float argument)
double rint(double argument)
long double rint(long double argument)
예제 코드
#include <cmath>
#include <iostream>
using namespace std;
main() {
double a, b, x, y;
x = 53.26;
y = 53.86;
a = rint(x);
b = rint(y);
cout << "a의 값: " << a << endl;
cout << "b의 값: " << b;
}
실행 결과
a의 값: 53
b의 값: 54
rintf() 함수
rintf() 함수는 rint()와 동일하게 동작하지만, 매개변수와 반환 타입이 모두 float형이라는 점이 다릅니다. 단정밀도(single precision) 연산이 필요한 경우에 적합합니다.
다음 예제에서는 fesetround() 함수를 사용해 반올림 방식을 직접 지정하는 방법을 보여줍니다. FE_UPWARD는 항상 위쪽(큰 쪽)으로 올림하고, FE_DOWNWARD는 항상 아래쪽(작은 쪽)으로 내림합니다.
float rintf(float argument)
예제 코드
#include <cmath>
#include <fenv.h>
#include <iostream>
using namespace std;
main() {
double a, b, x, y;
x = 53.26;
y = 53.86;
fesetround(FE_UPWARD);
a = rintf(x);
fesetround(FE_DOWNWARD);
b = rintf(y);
cout << "a의 값: " << a << endl;
cout << "b의 값: " << b;
}
실행 결과
a의 값: 54
b의 값: 53
rintl() 함수
rintl() 함수 역시 rint()와 동일한 동작을 하지만, 매개변수와 반환 타입이 모두 long double형이라는 차이가 있습니다. 일반 double보다 정밀도가 높기 때문에 소수점 아래 자릿수가 많은 큰 숫자를 다룰 때 특히 유용합니다.
이 예제에서도 마찬가지로 fesetround()를 사용해 반올림 방향을 지정합니다.
long double rintl(long double argument)
예제 코드
#include <cmath>
#include <fenv.h>
#include <iostream>
using namespace std;
main() {
double a, b, x, y;
x = 53547.55555555555;
y = 53547.55555555523;
fesetround(FE_UPWARD);
a = rintl(x);
fesetround(FE_DOWNWARD);
b = rintl(y);
cout << "a의 값: " << a << endl;
cout << "b의 값: " << b;
}
실행 결과
a의 값: 53548
b의 값: 53547
세 함수 비교 요약
| 함수 | 매개변수 / 반환 타입 | 주요 용도 |
|---|---|---|
| rint() | float, double, long double 오버로딩 | 일반적인 부동소수점 반올림 |
| rintf() | float | 단정밀도(float) 반올림 |
| rintl() | long double | 배정밀도 이상의 고정밀 반올림 |
정리하면, rint() 계열 함수는 현재 반올림 모드를 따르며 fesetround()를 통해 반올림 방향을 자유롭게 제어할 수 있습니다. 상황에 맞는 자료형의 함수를 선택하면 정확하고 효율적인 반올림 처리가 가능합니다.