आपके पास पहले से ही स्मार्ट जवाब है: अहस्ताक्षरित अंकगणित modulo अंकगणित है और इसलिए परिणाम पकड़ लेंगे, आप इसे गणितीय रूप से साबित कर सकते हैं ...
कंप्यूटर के बारे में एक अच्छी बात यह है कि कंप्यूटर तेज हैं। वास्तव में, वे इतने तेज़ होते हैं कि 32 बिट्स के सभी वैध संयोजनों की गणना उचित मात्रा में संभव है (64 बिट्स के साथ प्रयास न करें)।
इसलिए, आपके मामले में, मैं व्यक्तिगत रूप से इसे कंप्यूटर पर फेंकना चाहता हूं; मुझे खुद को यह समझाने में कम समय लगता है कि गणितीय प्रमाण सही होने की तुलना में यह कार्यक्रम अपने आप को समझाने के लिए सही है और यह कि मैंने विनिर्देश 1 में एक विवरण की देखरेख नहीं की है :
#include <iostream>
#include <limits>
int main() {
std::uint64_t const MAX = std::uint64_t(1) << 32;
for (std::uint64_t i = 0; i < MAX; ++i) {
for (std::uint64_t j = 0; j < MAX; ++j) {
std::uint32_t const a = static_cast<std::uint32_t>(i);
std::uint32_t const b = static_cast<std::uint32_t>(j);
auto const champion = (a + (b & 255)) & 255;
auto const challenger = (a + b) & 255;
if (champion == challenger) { continue; }
std::cout << "a: " << a << ", b: " << b << ", champion: " << champion << ", challenger: " << challenger << "\n";
return 1;
}
}
std::cout << "Equality holds\n";
return 0;
}
के सभी संभव मूल्यों के माध्यम से यह विश्लेषण करता है a
और b
और 32-बिट अंतरिक्ष में चेक समानता रखती है, या नहीं। यदि ऐसा नहीं होता है, तो यह उस मामले को प्रिंट करता है जो काम नहीं करता था, जिसे आप एक स्वच्छता जांच के रूप में उपयोग कर सकते हैं।
और, क्लैंग के अनुसार : समानता रखती है ।
इसके अलावा, यह देखते हुए कि अंकगणित के नियम बिट-चौड़ाई के अज्ञेयवादी ( int
बिट-चौड़ाई से ऊपर ) हैं, यह समानता 64 बिट्स और 128 बिट्स सहित 32 बिट्स या अधिक के किसी भी अहस्ताक्षरित पूर्णांक प्रकार के लिए धारण करेगी।
नोट: कंपाइलर उचित समय सीमा में सभी 64-बिट पैटर्न को कैसे समाहित कर सकता है? यह नहीं कर सकते। छोरों को बाहर अनुकूलित किया गया था। अन्यथा निष्पादन समाप्त होने से पहले हम सभी की मृत्यु हो जाती।
मैंने शुरुआत में इसे केवल 16-बिट्स अहस्ताक्षरित पूर्णांक के लिए सिद्ध किया था; दुर्भाग्यवश C ++ एक पागल भाषा है, जहाँ छोटे पूर्णांक (छोटे बिटवेट से int
) पहले परिवर्तित हो जाते हैं int
।
#include <iostream>
int main() {
unsigned const MAX = 65536;
for (unsigned i = 0; i < MAX; ++i) {
for (unsigned j = 0; j < MAX; ++j) {
std::uint16_t const a = static_cast<std::uint16_t>(i);
std::uint16_t const b = static_cast<std::uint16_t>(j);
auto const champion = (a + (b & 255)) & 255;
auto const challenger = (a + b) & 255;
if (champion == challenger) { continue; }
std::cout << "a: " << a << ", b: " << b << ", champion: "
<< champion << ", challenger: " << challenger << "\n";
return 1;
}
}
std::cout << "Equality holds\n";
return 0;
}
और एक बार फिर, क्लैंग के अनुसार : समानता रखती है ।
अच्छा, वहाँ तुम जाओ :)
1 बेशक, अगर कोई कार्यक्रम अनजाने में व्यवहार को अनजाने में ट्रिगर करता है, तो यह ज्यादा साबित नहीं होगा।
Math.random()
पूर्णांक या एक डबल पर [0,1) लौटाता है? मुझे नहीं लगता कि आपकी स्क्रिप्ट (सबसे अच्छी जो मैं बता सकता हूं) उस समस्या को दर्शाती है जिसे आपने बिल्कुल भी प्रस्तुत किया है।