Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Các hàm rint(), rintf(), rintl() trong C++

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_TONEARESTLàm tròn đến gần nhất (mặc định)
FE_UPWARDLàm tròn lên (+∞)
FE_DOWNWARDLàm tròn xuống (-∞)
FE_TOWARDZEROLà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ùng fesetround()
  • rint có thể set cờ FE_INEXACT nếu kết quả không chính xác
  • Khác với round(): round luôn làm tròn nửa lên, không phụ thuộc chế độ