2013-07-04 7 views
19

पहले कक्षाओं में, मैं सिखाया गया था n % d = r और n = d*q + r, जहां d भाजक है के रूप में इसके बारे में लगता है कि, q भागफल है, और r शेष (यह देखते हुए कि शेष कभी नहीं नकारात्मक हो सकता है)।सी में मॉड्यूलर अंकगणितीय के लिए नियम क्या हैं?

तो उदाहरण के लिए, -111 mod 1110 है, क्योंकि -111 = -11*-11 + 10 (के रूप में करने का विरोध किया -111 = -11*10 -1, के रूप में कैसे है कि हम एक नकारात्मक शेष देना होगा देखकर)।

हालांकि, -111 % 11 के परिणाम छपाई करते समय, -1 परिणाम है और 10 नहीं है। क्यूं कर? क्या यह तकनीकी रूप से गलत नहीं है?

+1

आह, पुराने नकारात्मक-संकार्य मापांक :-) मैं अजगर सभी विशेष मामलों में (गणितीय अर्थ में) सही यह हो रही याद। – Cameron

+0

यदि आप सी के '%' ऑपरेटर को एक मॉड्यूलस में मजबूर करना चाहते हैं जो आपके द्वारा अपेक्षित तरीके से काम करता है, तो बस यह करें: '((%%) + b)% b' – paddy

+2

विकिपीडिया पृष्ठ पर एक बहुत अच्छी तालिका है मॉडुलो ऑपरेशन जो दिखाता है कि प्रत्येक भाषा का अपना मॉड्यूलो कार्यान्वयन कैसे होता है: http://en.wikipedia.org/wiki/Modulo_operation –

उत्तर

6

मॉड्यूलस के लिए, -1 एक गलत जवाब होगा।

सी % ऑपरेटर एक शेष ऑपरेटर है जो मॉड्यूलस ऑपरेटर नहीं है - और शेष के लिए, या तो 10 या -1 स्वीकार्य है।

+0

कृपया परिभाषित करें कि मॉड्यूलस के साथ आपका क्या मतलब है।संदर्भ के आधार पर, विभिन्न परिभाषाएं प्रतीत होती हैं, और उनमें से कुछ के लिए, आईएसटीएम -1 -1 सही होगा। –

+0

@RudyVelthuis: "मॉड्यूलस" आमतौर पर [मॉड्यूलर अंकगणित] (http://mathworld.wolfram.com/ModularArithmetic.html) से जुड़ा होता है। कम से कम मॉड्यूलर अंकगणितीय को सामान्य रूप से परिभाषित किया जाता है, केवल गैर-ऋणात्मक संख्याओं की अनुमति है। –

+0

जैसा कि मैंने कहा, यह संदर्भ पर निर्भर करता है। यदि आप यूक्लिडियन डिवीजन पर संकेत दे रहे हैं, तो वास्तव में, शेष हमेशा सकारात्मक होता है। लेकिन अन्य संदर्भों में, यह आवश्यक नहीं है। खासकर जब से यह एक प्रोग्रामिंग मंच है, यह ज्ञात होना चाहिए कि "मॉड्यूलस" का अर्थ भाषा से भाषा में भिन्न हो सकता है। –

4

% ऑपरेटर लागू किया गया है कि a == b * (a/b) + (a % b) सत्य है, जहां हम पूर्णांक विभाजन का उपयोग करते हैं।

इस मामले में -111/11-10 है, इसलिए -111 == 11 * -10 + xx == -1 से संतुष्ट है।

+0

आईओओ, 'ए% बी = ए - (ए/बी) * बी'। चूंकि '-111/11' के परिणाम' -10' में हैं, परिणाम '-111 - (-10 * 11)', यानी '-1' है। –

19

लघु उत्तर:

मानक गारंटी नहीं है कि (a/b)*b + a%ba के बराबर है।

सी 99 में, विभाजन / का परिणाम शून्य की ओर छोटा कर दिया जाएगा। % ऑपरेटर का परिणाम निश्चित होगा, इस मामले में, -1

सी 8 9 में, विभाजन / का परिणाम नकारात्मक संचालन के लिए किसी भी तरह से छोटा किया जा सकता है। तो % ऑपरेटर का परिणाम मशीन-निर्भर भी है।

लांग उत्तर:

C99 6.5.5

5/ऑपरेटर के परिणाम से दूसरे से पहले संकार्य के विभाजन से भागफल है; % ऑपरेटर का परिणाम शेष है। दोनों परिचालनों में, यदि का मान दूसरा ऑपरेंड शून्य है, तो व्यवहार अपरिभाषित है।

6 जब पूर्णांक विभाजित होते हैं, तो/ऑपरेटर का परिणाम किसी भी विभाजित भाग के साथ बीजगणितीय भाग्य होता है। यदि भाग्य ए/बी प्रतिनिधित्व योग्य है, तो अभिव्यक्ति (ए/बी) * बी + एक% बी बराबर होगी; अन्यथा, ए/बी और% बी दोनों का व्यवहार अपरिभाषित है।

और एक ही पृष्ठ पर फुटनोट व्याख्या करने के लिए कैसे / काम करता है, यह कहते हैं:

इस बार '' शून्य की ओर काट-छांट '' कहा जाता है।

इस नियम के अनुसार, -111/11 केवल -10 हो सकता है, नहीं 1. (a/b)*b + a%b के बाद से a के बराबर होना चाहिए, हम -111 % 11-1 है। ,

के लिए काट-छांट की दिशा/और% के लिए परिणाम के हस्ताक्षर मशीन निर्भर नकारात्मक ऑपरेंड के लिए कर रहे हैं के रूप में कार्रवाई पर ले लिया है:

हालांकि, कश्मीर & आर अध्याय 2.5 एक अलग जवाब देता है अतिप्रवाह या अंडरफ्लो।

इसके अनुसार, -1 या 10 एक कानूनी परिणाम हो सकता है।

कारण C89 3.3.5 में है:

पूर्णांक विभाजित हैं और विभाजन अयथार्थ है, अगर दोनों ऑपरेंड सकारात्मक रहे हैं/ऑपरेटर का परिणाम जब है सबसे बड़ा पूर्णांक बीजीय भागफल से भी कम समय और % ऑपरेटर का परिणाम सकारात्मक है। यदि ऑपरेंड नकारात्मक है, तो क्या/ऑपरेटर का परिणाम बीजगणितीय भाग से कम सबसे बड़ा पूर्णांक है या बीजगणितीय भाग से अधिक छोटा पूर्णांक कार्यान्वयन-परिभाषित है, जैसा कि% ऑपरेटर के परिणाम का संकेत है। यदि भाग्य ए/बी प्रतिनिधित्व योग्य है, अभिव्यक्ति (ए/बी) * बी + एक% बी बराबर होगी।

यह C89 से C99 में परिवर्तन के रूप में दिखाई देता है।

C99 दलील 6.5.5 कुछ ऐतिहासिक कारणों से प्रदान करता है:

C89 में, नकारात्मक ऑपरेंड एक कार्यान्वयन से परिभाषित तरीके में ऊपर या नीचे की ओर दौर सकता शामिल पूर्णांकों का विभाजन; विशेष मामलों की जांच करने और विशिष्ट व्यवहार को लागू करने के लिए रन-टाइम कोड में ओवरहेड से बचने का इरादा था। फोर्ट्रान में, परिणाम हमेशा शून्य की तरफ झुकाएगा, और उपरांत संख्यात्मक प्रोग्रामिंग समुदाय को स्वीकार्य लगता है। इसलिए, सी 99 को अब समान व्यवहार की आवश्यकता है, जो कि फोरट्रान से सी तक कोड को पोर्ट करने में सुविधा प्रदान करनी चाहिए। इस दस्तावेज़ के §7.20.6.2 में तालिका आवश्यक अर्थशास्त्र को दर्शाती है।

और यहाँ §7.20.6.2 में तालिका है:

numer denom quot rem 
7  3 2 1 
–7  3 –2 –1 
7  –3 –2 1 
–7  –3 2 –1 
+1

मुझे लगता है कि केवल -1 स्वीकार्य-फुटनोट 90 (सी 99 मानक के संस्करण एन 1256 में) कहता है, पाठ के संदर्भ में "[...] बीजगणितीय भाग को किसी भी आंशिक भाग के साथ छोड़ दिया गया", "इसे अक्सर छिड़काव कहा जाता है" 0 की तरफ "। तो मैं इसका मतलब यह मानता हूं कि '-111/11' केवल -10 हो सकता है, और इसलिए '-111% 11' केवल आवश्यकता के कारण -1 हो सकता है' (ए/बी) * बी + ए% बी' 'ए' के बराबर होना चाहिए। –

+0

इसके अतिरिक्त, बिटवाई ऑपरेटर अलग-अलग काम करते हैं! भले ही '&' और '>> 'की तुलना आमतौर पर मॉड्यूलो और विभाजन की तुलना में 2 की शक्तियों से की जाती है,' ''' शून्य की ओर छंटनी नहीं होती ", इसलिए' -5 >> 1 == -3', और '- 11 और 3 == 1' (जबकि '-11% 4 == -3') –

+1

हां, यह सी 99 में बदल दिया गया था। सी 8 9 कंपाइलर या तो कर सकते हैं, और आम तौर पर जो भी हार्डवेयर के लिए सबसे सुविधाजनक है। – torek

संबंधित मुद्दे