इस Microsoft शोध पत्र पर आधारित एक पुराने प्रश्न का नया उत्तर यहां दिया जा रहा है और उसमें दिए गए संदर्भों के है।
ध्यान दें कि C11 और C ++ 11 के बाद, का शब्दार्थ शून्य (देखें ) की ओर छोटाdiv
हो गया है । इसके अलावा, C ++ 11 से विभाजित के लिए , भागफल और शेष के बारे में निम्नलिखित की गारंटी देता है[expr.mul]/4
D
d
qT
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
मैप -1, 0, +1 पर निर्भर करता है कि इसका तर्क <, ==,> 0 से अधिक है ( इस प्रश्नोत्तर देखें) कोड कोड के लिए)।
काटे गए विभाजन के साथ, शेष का चिह्न लाभांश के संकेत के बराबर हैD
, अर्थात -1 % 8 == -1
। C ++ 11 एक std::div
फ़ंक्शन भी प्रदान करता है जो सदस्यों के साथ एक संरचना लौटाता है quot
औरrem
काटे गए विभाजन के अनुसार ।
कुछ अन्य परिभाषाओं, तथाकथित जैसे हैं फर्श विभाजन निर्मित छोटा कर दिया विभाजन के संदर्भ में परिभाषित किया जा सकता है
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));
फ्लोर्ड विभाजन के साथ, शेष का चिह्न भाजक के संकेत के बराबर होता हैd
। हास्केल और ओबेरॉन जैसी भाषाओं में, फ़्लोरवर्ड डिवीज़न के लिए बिलिन ऑपरेटर हैं। C ++ में, आपको उपरोक्त परिभाषाओं का उपयोग करके एक फ़ंक्शन लिखना होगा।
फिर भी एक और तरीका यूक्लिडियन डिवीजन है , जिसे बिलिन ट्रंकेटेड डिवीजन के संदर्भ में भी परिभाषित किया जा सकता है
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);
यूक्लिडियन विभाजन के साथ, शेष का संकेत हमेशा सकारात्मक होता है ।