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àm | Công thức | Dấu kết quả |
|---|---|---|
fmod(x,y) | x - trunc(x/y)*y | Cùng dấu x |
remainder(x,y) | x - round(x/y)*y | Có 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àoquo.fmod: Phần dư cắt bỏ (trunc), dấu cùng x.div,ldiv,lldiv: Cho số nguyên.