2010-10-07 17 views
39
में ऋणात्मक संख्याओं पर सापेक्ष आपरेशन

मैं ऋणात्मक संख्याओं के बारे में अजगर में कुछ अजीब व्यवहार मिल गया है:अजगर

>>> a = -5 
>>> a % 4 
3 

किसी को समझा सकते हैं क्या हो रहा है?

+14

मुझे सही लगता है – wheaties

+3

'..., -9, -5, -1, 3, 7, ...' – NullUserException

+0

[सी, पायथन - मॉड्यूलो (%) ऑपरेशन के विभिन्न व्यवहार के संभावित डुप्लिकेट] (http://stackoverflow.com/questions/1907565/c-python- अलग-अलग-of-the-modulo-operation) – nyuszika7h

उत्तर

68

सी या सी ++ के विपरीत, पायथन के मॉड्यूलो ऑपरेटर (%) हमेशा एक संख्या को 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 देखें।)

+1

यह नहीं होना चाहिए (-2 * 4 + 3)? – Vatine

+0

@ वैटिन: फिक्स्ड धन्यवाद। (5 ^^ के बारे में सोच रहा था) – kennytm

+0

सी/सी ++ में आप इस बहुत उपयोगी ऑपरेटर का अनुकरण कैसे करते हैं? –

22

यहाँ गुइडो van Rossum से व्याख्या दी गई है:

http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html

मूलतः, यह इतना है कि एक/b = शेष आर के साथ क्ष को बरकरार रखता है रिश्तों b * क्ष + r = एक और 0 < = r < ख है।

+3

सी ++ और जावा जैसी भाषाएं पहले संबंधों को भी संरक्षित करती हैं, लेकिन वे ऋणात्मक 'ए', सकारात्मक' बी 'के लिए छत, जबकि पायथन फर्श। यह हमेशा सच है कि 'abs (r)

2

Modulo, 4 के लिए तुल्यता कक्षाओं:

  • 0: 0, 4, 8, 12 ... और -4, -8, -12 ...
  • 1: 1, 5, 9, 13 ... और -3, -7, -11 ...
  • 2: 2, 6, 10 ... और -2, -6, -10 ...
  • 3: 3, 7, 11 ... और -1, -5, -9 ...

यहां modulo's behavior with negative numbers का एक लिंक है। (हाँ, मैंने इसे गुगल किया)

+0

@NullUserException - हाँ, यह था। तय की। धन्यवाद। – wheaties

7

पूर्ण संख्या वाले पूर्णांक विभाजन और मोड को संभालने का कोई भी सबसे अच्छा तरीका नहीं है। यह अच्छा होगा अगर a/b(-a)/b का समान आयाम और विपरीत संकेत था। यह अच्छा होगा अगर a % b वास्तव में एक मॉड्यूलो बी था। चूंकि हम वास्तव में a == (a/b)*b + a%b चाहते हैं, पहले दो असंगत हैं।

कौन सा रखना है एक कठिन सवाल है, और दोनों पक्षों के लिए तर्क हैं। सी और सी ++ दौर पूर्णांक विभाजन शून्य की ओर (इसलिए a/b == -((-a)/b)), और स्पष्ट रूप से पायथन नहीं करता है।

2

जैसा कि बताया गया है, पायथन मॉड्यूलो अन्य भाषाओं के सम्मेलनों के लिए 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 
+0

धन्यवाद आपका उदाहरण मुझे समझ में आया :) – Lamis

1

मैं भी सोचा था कि यह अजगर का एक अजीब व्यवहार था। यह पता चला है कि मैं विभाजन को अच्छी तरह से हल नहीं कर रहा था (कागज पर); मैं उद्धरण के लिए 0 का मूल्य और शेष के लिए -5 का मान दे रहा था। भयानक ... मैं पूर्णांक संख्याओं के ज्यामितीय प्रतिनिधित्व भूल गया। संख्या रेखा द्वारा दिए गए पूर्णांक की ज्यामिति को याद करके, किसी को भाग्य और शेष के लिए सही मान मिल सकते हैं, और जांचें कि पायथन का व्यवहार ठीक है। (हालांकि मुझे लगता है कि आप पहले से ही अपनी चिंता का समाधान कर चुके हैं)।

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

  • कोई संबंधित समस्या नहीं^_^