मुझे यह सवाल इतना पसंद आया कि मैंने इसे 4 जून 2013 को अपने ब्लॉग का विषय बना लिया । महान प्रश्न के लिए धन्यवाद!
बड़े मामलों के आने से आसानी होती है। उदाहरण के लिए:
a = 1073741823;
b = 134217727;
c = 134217727;
b * cएक नकारात्मक संख्या के लिए overflows क्योंकि ।
मैं तथ्य यह है कि में है कि बढ़ेगी अंकगणित की जाँच की , के बीच का अंतर a / (b * c)और (a / b) / cएक कार्यक्रम के बीच का अंतर हो सकता है कि काम करता है और एक प्रोग्राम है जो दुर्घटनाओं। के उत्पाद हैं bऔर cएक पूर्णांक की सीमा से overflows तो पूर्व एक जाँच संदर्भ में दुर्घटना होगा।
छोटे धनात्मक पूर्णांक के लिए, कहते हैं, छोटे से छोटे को फिट करने के लिए, पहचान को बनाए रखा जाना चाहिए।
टिमोथी शील्ड्स ने सिर्फ एक सबूत पोस्ट किया; मैं यहां एक वैकल्पिक प्रमाण प्रस्तुत करता हूं। मान लें कि सभी संख्याएँ गैर-नकारात्मक पूर्णांक हैं और कोई भी कार्य अतिप्रवाह नहीं है।
पूर्णांक विभाजन x / yमान का पता लगाता है qजैसे q * y + r == x, जहां 0 <= r < y।
तो विभाजन इस तरह a / (b * c)का मान पाता q1है
q1 * b * c + r1 == a
कहाँ पे 0 <= r1 < b * c
विभाजन ( a / b ) / cपहले मान को qtऐसे पाता है
qt * b + r3 == a
और फिर q2इस तरह के मूल्य पाता है
q2 * c + r2 == qt
इतना विकल्प है कि में qtऔर हम प्राप्त:
q2 * b * c + b * r2 + r3 == a
जहां 0 <= r2 < cऔर 0 <= r3 < b।
समान के बराबर दो चीजें एक दूसरे के बराबर हैं, इसलिए हमारे पास है
q1 * b * c + r1 == q2 * b * c + b * r2 + r3
q1 == q2 + xकुछ पूर्णांक के लिए मान लीजिए x। इसके लिए और इसमें हल करें x:
q2 * b * c + x * b * c + r1 = q2 * b * c + b * r2 + r3
x = (b * r2 + r3 - r1) / (b * c)
कहाँ पे
0 <= r1 < b * c
0 <= r2 < c
0 <= r3 < b
कर सकते हैं xशून्य से अधिक होना? हमारे पास असमानताएं हैं:
b * r2 + r3 - r1 <= b * r2 + r3 <= b * (c - 1) + r3 < b * (c - 1) + b == b * c
तो उस अंश का अंश हमेशा से छोटा होता है b * c, इसलिए xशून्य से अधिक नहीं हो सकता है।
कर सकते हैं xशून्य से भी कम हो? नहीं, इसी तरह के तर्क से, पाठक पर छोड़ दिया।
इसलिए पूर्णांक xशून्य है, और इसलिए q1 == q2।