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

Hàm remainder() trong C++ - Phần dư dấu chấm động


remainder(x, y) tính phần dư của phép chia dấu chấm động theo chuẩn IEEE 754: x - n*y với n là số nguyên gần nhất với x/y (làm tròn đến chẵn - round to even).

Khác với fmod()

HàmCông thứcDấu kết quả
fmod(x,y)x - trunc(x/y)*yCùng dấu x
remainder(x,y)x - round(x/y)*yCó thể âm/dương bất kể x

Ví dụ mã nguồn

#include <iostream>
#include <cmath>
#include <cfenv>
#pragma STDC FENV_ACCESS on
using namespace std;

int main() {
    cout << fixed << setprecision(2);
    
    double x = 14.5, y = 4.1;
    cout << "remainder(" << x << ", " << y << ") = " << remainder(x, y) << '\n';
    // 14.5/4.1 ≈ 3.536 -> round = 4 -> 14.5 - 4*4.1 = -1.9
    
    cout << "fmod(" << x << ", " << y << ") = " << fmod(x, y) << '\n';
    // trunc(3.536) = 3 -> 14.5 - 3*4.1 = 2.2
    
    // Số âm
    cout << "remainder(-34.5, 4) = " << remainder(-34.5, 4) << '\n'; // 1.5
    cout << "remainder(65.23, 0) = " << remainder(65.23, 0) << '\n'; // NaN, FE_INVALID
    
    return 0;
}

Đầu ra

remainder(14.50, 4.10) = -1.90
fmod(14.50, 4.10) = 2.20
remainder(-34.50, 4.00) = 1.50
remainder(65.23, 0.00) = nan

Các hàm liên quan

  • remquo(x, y, &quo): Trả về phần dư và lưu thương số gần nhất vào quo.
  • fmod: Phần dư cắt bỏ (trunc), dấu cùng x.
  • div, ldiv, lldiv: Cho số nguyên.