Đây là câu trả lời mới cho một câu hỏi cũ, dựa trên bài báo Nghiên cứu của Microsoft này và các tài liệu tham khảo trong đó.
Lưu ý rằng từ C11 và C ++ 11 trở đi, ngữ nghĩa của div
đã bị cắt bớt về phía không (xem [expr.mul]/4
). Hơn nữa, đối với phép D
chia cho d
, C ++ 11 đảm bảo những điều sau về thương qT
và phần dưrT
auto const qT = D / d;
auto const rT = D % d;
assert(D == d * qT + rT);
assert(abs(rT) < abs(d));
assert(signum(rT) == signum(D));
trong đó signum
ánh xạ tới -1, 0, +1, tùy thuộc vào việc đối số của nó có <, ==,> hơn 0 hay không (xem phần Hỏi & Đáp này để biết mã nguồn).
Với phép chia cắt ngắn, dấu của phần dư bằng dấu của số bị chiaD
, tức là -1 % 8 == -1
. C ++ 11 cũng cung cấp một std::div
hàm trả về một cấu trúc với các thành viên quot
vàrem
theo phép chia cắt ngắn.
Có thể có các định nghĩa khác, ví dụ: cái gọi là phép phân chia có cấu trúc phân lớp có thể được định nghĩa theo cách phân chia được cắt bớt nội dung
auto const I = signum(rT) == -signum(d) ? 1 : 0;
auto const qF = qT - I;
auto const rF = rT + I * d;
assert(D == d * qF + rF);
assert(abs(rF) < abs(d));
assert(signum(rF) == signum(d));
Với phép chia có lớp, dấu của phần dư bằng dấu của số chiad
. Trong các ngôn ngữ như Haskell và Oberon, có các toán tử nội trang cho phép phân chia tầng. Trong C ++, bạn cần viết một hàm bằng các định nghĩa trên.
Tuy nhiên, một cách khác là phép phân chia Euclide , cũng có thể được định nghĩa theo cách phân chia cắt ngắn nội tại
auto const I = rT >= 0 ? 0 : (d > 0 ? 1 : -1);
auto const qE = qT - I;
auto const rE = rT + I * d;
assert(D == d * qE + rE);
assert(abs(rE) < abs(d));
assert(signum(rE) != -1);
Với phép chia Euclide, dấu của phần dư luôn là số dương .