मैं ऋणात्मक संख्याओं के बारे में अजगर में कुछ अजीब व्यवहार मिल गया है:अजगर
>>> a = -5
>>> a % 4
3
किसी को समझा सकते हैं क्या हो रहा है?
मैं ऋणात्मक संख्याओं के बारे में अजगर में कुछ अजीब व्यवहार मिल गया है:अजगर
>>> a = -5
>>> a % 4
3
किसी को समझा सकते हैं क्या हो रहा है?
सी या सी ++ के विपरीत, पायथन के मॉड्यूलो ऑपरेटर (%
) हमेशा एक संख्या को denominator (divisor) के समान संकेत देते हैं। आपका अभिव्यक्ति की पैदावार 3 क्योंकि
(-5)% 4 = (-2 × 4 + 3)% 4 = 3.
यह सी व्यवहार पर चुना जाता है, क्योंकि एक गैर नकारात्मक परिणाम अक्सर है अधिक उपयोगी। एक उदाहरण सप्ताह के दिनों की गणना करना है। यदि आज मंगलवार (दिन # 2) है, तो सप्ताह का दिन एन दिन पहले क्या है? अजगर में हम
return (2 - N) % 7
साथ लेकिन सी में गणना कर सकता है अगर एन ≥ 3, हम एक नकारात्मक संख्या जो एक अमान्य संख्या है मिलता है, और हम स्वयं 7 जोड़कर इसे ठीक करने के लिए की जरूरत है:
int result = (2 - N) % 7;
return result < 0 ? result + 7 : result;
(कैसे परिणाम के हस्ताक्षर अलग-अलग भाषाओं के लिए निर्धारित किया जाता है के लिए http://en.wikipedia.org/wiki/Modulo_operator देखें।)
यहाँ गुइडो van Rossum से व्याख्या दी गई है:
http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html
मूलतः, यह इतना है कि एक/b = शेष आर के साथ क्ष को बरकरार रखता है रिश्तों b * क्ष + r = एक और 0 < = r < ख है।
सी ++ और जावा जैसी भाषाएं पहले संबंधों को भी संरक्षित करती हैं, लेकिन वे ऋणात्मक 'ए', सकारात्मक' बी 'के लिए छत, जबकि पायथन फर्श। यह हमेशा सच है कि 'abs (r)
Modulo, 4 के लिए तुल्यता कक्षाओं:
यहां modulo's behavior with negative numbers का एक लिंक है। (हाँ, मैंने इसे गुगल किया)
@NullUserException - हाँ, यह था। तय की। धन्यवाद। – wheaties
पूर्ण संख्या वाले पूर्णांक विभाजन और मोड को संभालने का कोई भी सबसे अच्छा तरीका नहीं है। यह अच्छा होगा अगर a/b
(-a)/b
का समान आयाम और विपरीत संकेत था। यह अच्छा होगा अगर a % b
वास्तव में एक मॉड्यूलो बी था। चूंकि हम वास्तव में a == (a/b)*b + a%b
चाहते हैं, पहले दो असंगत हैं।
कौन सा रखना है एक कठिन सवाल है, और दोनों पक्षों के लिए तर्क हैं। सी और सी ++ दौर पूर्णांक विभाजन शून्य की ओर (इसलिए a/b == -((-a)/b)
), और स्पष्ट रूप से पायथन नहीं करता है।
जैसा कि बताया गया है, पायथन मॉड्यूलो अन्य भाषाओं के सम्मेलनों के लिए well-reasoned अपवाद बनाता है। यह नकारात्मक संख्याओं को एक निर्बाध व्यवहार देता है, विशेष रूप से जब //
पूर्णांक-विभाजन ऑपरेटर के संयोजन में उपयोग किया जाता है, %
मॉड्यूल अक्सर होता है (गणित में।divmod):
for n in range(-8,8):
print n, n//4, n%4
का उत्पादन:
-8 -2 0
-7 -2 1
-6 -2 2
-5 -2 3
-4 -1 0
-3 -1 1
-2 -1 2
-1 -1 3
0 0 0
1 0 1
2 0 2
3 0 3
4 1 0
5 1 1
6 1 2
7 1 3
धन्यवाद आपका उदाहरण मुझे समझ में आया :) – Lamis
मैं भी सोचा था कि यह अजगर का एक अजीब व्यवहार था। यह पता चला है कि मैं विभाजन को अच्छी तरह से हल नहीं कर रहा था (कागज पर); मैं उद्धरण के लिए 0 का मूल्य और शेष के लिए -5 का मान दे रहा था। भयानक ... मैं पूर्णांक संख्याओं के ज्यामितीय प्रतिनिधित्व भूल गया। संख्या रेखा द्वारा दिए गए पूर्णांक की ज्यामिति को याद करके, किसी को भाग्य और शेष के लिए सही मान मिल सकते हैं, और जांचें कि पायथन का व्यवहार ठीक है। (हालांकि मुझे लगता है कि आप पहले से ही अपनी चिंता का समाधान कर चुके हैं)।
मुझे सही लगता है – wheaties
'..., -9, -5, -1, 3, 7, ...' – NullUserException
[सी, पायथन - मॉड्यूलो (%) ऑपरेशन के विभिन्न व्यवहार के संभावित डुप्लिकेट] (http://stackoverflow.com/questions/1907565/c-python- अलग-अलग-of-the-modulo-operation) – nyuszika7h