2012-02-17 5 views
7

नीचे some code in C++ है। आप अजगर में -2%5 की तरह कुछ का प्रयास करें परिणाम 3, जबकि तरह C++ सी # (code) और फ्लैश कई अन्य भाषाओं देना -2मॉड्यूलस कैसे काम करता है और अधिकांश भाषाओं की तुलना में पाइथन में यह अलग क्यों है?

क्यों वे देते सकारात्मक है -2 और अन्य की तुलना में एक संस्करण अधिक सही है?

#include <cstdio> 
int main(){ 
printf("%d\n", 2%5); 
printf("%d\n", -2%5); 
printf("%d\n", -2%77); 
printf("%d\n", 2%-77); 
printf("%d\n", -2%-77); 
} 

आउटपुट:

2 
-2 
-2 
2 
-2 

उत्तर

-1

मुझे लगता है कि आप नीचे दिए गए पर गौर करना चाहिए। थोड़ा अलग एल्गोरिदम का उपयोग करने के अलावा, ऑपरेटर प्राथमिकता मायने रखती है। ब्रैकेट के साथ यह प्रयास करें:

In [170]: 2%5 
Out[170]: 2 

In [171]: -2%5 
Out[171]: 3 

In [172]: (-2)%5 
Out[172]: 3 

In [173]: -(2%5) 
Out[173]: -2 
2

सी ++ documentation के अनुसार:

ऋणात्मक मानों के लिए, परिणाम पुस्तकालय क्रियान्वयन के आधार पर भिन्न हो सकते हैं।

जो विषम लगता है। पायथन documentation केवल यह कहता है:

मॉड्यूलो ऑपरेटर हमेशा दूसरे ऑपरेंड (या शून्य) के समान संकेत के साथ परिणाम उत्पन्न करता है; परिणाम का पूर्ण मूल्य दूसरे ऑपरेंड के पूर्ण मूल्य से सख्ती से छोटा है।

यह मेरे लिए लगता है कि अजगर रास्ता अधिक तार्किक है, लेकिन यह सिर्फ एक आंत महसूस है।

+1

यह सी ++ 98 (और सी 90) में परिभाषित कार्यान्वयन है। यह सी ++ 11 (और सी-99) में अच्छी तरह परिभाषित है: मॉड्यूलस ऑपरेटर के परिणाम का संकेत लाभांश के संकेत के समान है। पायथन में, परिणाम का एक ही संकेत होता है जैसे divisor करता है। चीजों की व्याख्या करने का एक तरीका सिक्का टॉस का थोड़ा सा है।मेरे लिए सबसे अधिक समझ में आने वाली भाषाएं ऐसी भाषाएं हैं जो दोनों कार्यान्वयन प्रदान करती हैं, इसलिए मैं प्रोग्रामर को चुन सकता हूं जो किसी विशेष संदर्भ में अधिक समझ में आता है। –

7

यदि r = a % n, तो a = n * q + r कुछ q के लिए a = n * q + r। इसका अर्थ यह है कि r के मान के लिए आपके पास कई विकल्प हैं, जो q के मान के आधार पर चुने गए हैं।

मैं http://en.wikipedia.org/wiki/Modulo_operation पढ़ने का कहना है कि जो कि सबसे प्रोग्रामिंग भाषाओं -n < r < n साथ r चुनें सलाह देते हैं। इसका मतलब है कि, जब तक r शून्य नहीं है, तो आपके पास r के मान के लिए दो विकल्प हैं - एक सकारात्मक, एक नकारात्मक। विभिन्न प्रोग्रामिंग भाषा सकारात्मक या नकारात्मक लेने के बारे में अलग-अलग निर्णय लेती हैं।

  • अजगर n रूप में एक ही संकेत के साथ r चुनता है (है जो आप ऊपर देखें): आप उस पृष्ठ का सार देता है कि क्या विभिन्न भाषाओं पर उस तालिका दिखाई देगी।
  • सी ++ 2011 r को a (और 2011 मानक से पहले, यह कार्यान्वयन परिभाषित किया गया है) के समान चिह्न के साथ चुनता है।

आप यकीन है कि तुम अजगर में सकारात्मक एक मिल होना चाहते हैं, इस का उपयोग करें:

r = a % n 
if r < 0: 
    r += n 
संबंधित मुद्दे