Ba hàm rint(), rintf(), rintl() dùng để làm tròn số thực về số nguyên gần nhất, tuân theo chế độ làm tròn hiện tại (rounding mode). Chúng khác với round() ở chỗ: rint có thể gây ra ngoại lệ floating-point (FE_INEXACT) khi kết quả không chính xác.
1. Hàm rint() - double
float rint(float arg);
double rint(double arg);
long double rint(long double arg);
Ví dụ cơ bản
#include <cmath>
#include <iostream>
using namespace std;
int main() {
double x = 53.26;
double y = 53.86;
double a = rint(x); // 53
double b = rint(y); // 54
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
Kết quả
a = 53 b = 54
2. Hàm rintf() - float
Chỉ hoạt động với kiểu float. Thường dùng kèm fesetround() để thiết lập chế độ làm tròn.
float rintf(float arg);
Ví dụ với fesetround()
#include <cmath>
#include <fenv.h>
#include <iostream>
using namespace std;
int main() {
double x = 53.26;
double y = 53.86;
fesetround(FE_UPWARD); // Làm tròn lên (+∞)
double a = rintf(x); // 54
fesetround(FE_DOWNWARD); // Làm tròn xuống (-∞)
double b = rintf(y); // 53
cout << "a (UPWARD) = " << a << endl;
cout << "b (DOWNWARD) = " << b << endl;
}
Kết quả
a (UPWARD) = 54 b (DOWNWARD) = 53
3. Hàm rintl() - long double
Phiên bản cho long double, độ chính xác cao hơn.
long double rintl(long double arg);
Ví dụ
#include <cmath>
#include <fenv.h>
#include <iostream>
using namespace std;
int main() {
long double x = 53547.55555555555L;
long double y = 53547.55555555523L;
fesetround(FE_UPWARD);
long double a = rintl(x); // 53548
fesetround(FE_DOWNWARD);
long double b = rintl(y); // 53547
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
Kết quả
a = 53548 b = 53547
Các chế độ làm tròn (Rounding Modes)
| Hằng số | Hành vi |
|---|---|
FE_TONEAREST | Làm tròn đến gần nhất (mặc định) |
FE_UPWARD | Làm tròn lên (+∞) |
FE_DOWNWARD | Làm tròn xuống (-∞) |
FE_TOWARDZERO | Làm tròn về 0 (cắt phần thập phân) |
Lưu ý quan trọng
- Cần include
<fenv.h>hoặc<cfenv>để dùngfesetround() rintcó thể set cờFE_INEXACTnếu kết quả không chính xác- Khác với
round():roundluôn làm tròn nửa lên, không phụ thuộc chế độ