İşte bu Microsoft Araştırma makalesine göre eski bir soruya yeni bir cevap ve buradaki referanslara .
C11 ve C ++ 11 itibaren, bir anlambilim o Not div
olmuştur sıfıra doğru kesme (bakınız [expr.mul]/4
). Üstelik, D
bölü d
, C ++ 11 teminat bölüm ile ilgili aşağıdaki qT
ve geri kalanı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));
signum
argümanı olup olmadığına bağlı olarak, 0, -1 +1 haritalar <==,> 0 (bakınız daha bu soru-cevap kaynak kodu).
Kesik bölme ile, kalanın işareti temettü işaretine eşittirD
, yani -1 % 8 == -1
. C ++ 11 ayrıca std::div
üyelerle quot
ve rem
kesilmiş bölüme göre bir yapı döndüren bir işlev sağlar .
Mümkün olan başka tanımlar da vardır, örneğin, sözde tabana bölünmüş bölme , yerleşik kesik bölme açısından tanımlanabilir
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));
Tabana bölünmüş bölme ile, geri kalanın işareti bölenin işaretine eşittird
. Haskell ve Oberon gibi dillerde, katlanmış bölme için yerleşik operatörler vardır. C ++ 'da, yukarıdaki tanımları kullanarak bir işlev yazmanız gerekir.
Yine başka bir yol, yerleşik kesik bölünme açısından da tanımlanabilen Öklid bölünmesidir
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);
Öklid bölünmesi ile, geri kalanın işareti her zaman pozitiftir .