मुझे यह सवाल इतना पसंद आया कि मैंने इसे 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
।