2012-07-30 15 views
115

एक सी कार्यक्रम में मैं नीचे संचालन कोशिश कर रहा था के साथ Modulo आपरेशन (बस व्यवहार की जांच करने के)ऋणात्मक संख्याओं

x = 5 % (-3); 
y = (-5) % (3); 
z = (-5) % (-3); 

printf("%d ,%d ,%d", x, y, z); 

जीसीसी में (2, -2 , -2) के रूप में मेरे उत्पादन दे दी है। मैं हर बार सकारात्मक परिणाम की उम्मीद कर रहा था। क्या एक मॉड्यूलस नकारात्मक हो सकता है? क्या कोई इस व्यवहार को समझा सकता है?

+0

http://stackoverflow.com/questions/4003232/how-to-code-a-modulo-operator-in-cc-obj-c-that-handles-negative-numbers – james

+1

संभावित डुप्लिकेट का संभावित डुप्लिकेट [ मॉड्यूलो ऑपरेटर नकारात्मक मानों के साथ] (http://stackoverflow.com/questions/7594508/modulo-operator-with-negative-values) – sugavaneshb

उत्तर

3

Modulo आपरेशन के परिणाम अंश के हस्ताक्षर पर निर्भर करता है, और इस तरह आपको मिलने वाला -2 y और z

यहाँ के लिए संदर्भ

http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_14.html

है इंटीजर डिवीजन

यह खंड पूर्णांक विभाजन करने के लिए कार्यों का वर्णन करता है। ये कार्य जीएनयू सी लाइब्रेरी में अनावश्यक हैं, क्योंकि जीएनयू सी में '/' ऑपरेटर हमेशा शून्य की तरफ जाता है। लेकिन अन्य सी कार्यान्वयन में, '/' नकारात्मक तर्कों के साथ अलग-अलग दौर में हो सकता है। div और ldiv उपयोगी हैं क्योंकि वे को प्रतिबिंबित करने के लिए निर्दिष्ट करते हैं: शून्य की ओर। शेष के पास संख्याकर्ता के समान चिह्न है।

+4

आप एएनएसआई सी के बारे में एक पाठ का जिक्र कर रहे हैं। यह सी का काफी पुराना मानदंड नहीं है। सुनिश्चित करें कि पाठ एएनएसआई सी के संबंध में सही है, लेकिन निश्चित रूप से सी 99 के संबंध में नहीं है। सी 99 §6.5.5 पूर्णांक विभाजन में हमेशा शून्य की ओर छेड़छाड़ करने के लिए परिभाषित किया जाता है। – Palec

+0

और एक लिंक: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf –

102

C99 की आवश्यकता है कि जब a/b प्रदर्शनीय है:

(a/b) * b+a%b बराबर होगा a

यह समझ में आता है, तार्किक रूप से। सही?

देखते हैं कि यह क्या ले जाता है:


उदाहरण ए 5/(-3)-1

है =>(-1) * (-3)+5%(-3) = 5

ऐसा तभी हो सकता है, अगर 5%(-3) है 2.


उदाहरण बी।(-5)/3-1

=>(-1) * 3+(-5)%3 = -5

ऐसा तभी हो सकता है, अगर (-5)%3-2

+1

क्या संकलक पर्याप्त स्मार्ट होना चाहिए और यह पता लगाना चाहिए कि एक हस्ताक्षरित मॉड्यूलो अन्य हस्ताक्षरित हमेशा सकारात्मक है? वर्तमान में (अच्छी तरह से, जीसीसी 5.2) संकलक ऐसा लगता है कि "%" इस मामले में "हस्ताक्षर" करता है, बजाय "हस्ताक्षरित" के बजाय, जब दोनों ऑपरेटरों uint32_t या बड़े होते हैं। –

+0

@FrederickNord क्या आपके पास [उस व्यवहार] दिखाने के लिए एक उदाहरण है (http://stackoverflow.com/questions/11720656/modulo-operation-with-negative-numbers#comment66655578_11720841)? – chux

85

सी में % ऑपरेटर सापेक्ष ऑपरेटर नहीं है लेकिन शेष है ऑपरेटर।

मॉड्यूलो और शेष ऑपरेटर नकारात्मक मूल्यों के संबंध में भिन्न हैं।

शेष ऑपरेटर के साथ, परिणाम का संकेत लाभांश के संकेत के समान होता है जबकि मॉड्यूलो ऑपरेटर के साथ परिणाम का संकेत divisor जैसा ही होता है।

a == (a/b * b) + a % b 
/ साथ

0 की ओर काट-छांट के साथ पूर्णांक विभाजन:

सी के रूप में a % b के लिए % आपरेशन को परिभाषित करता है। यह छेड़छाड़ है जो 0 (और नकारात्मक इनफिनिटी की ओर नहीं) की ओर की जाती है जो % को मॉड्यूल ऑपरेटर की बजाय शेष ऑपरेटर के रूप में परिभाषित करती है।

+4

[परिभाषा मॉड्यूल ऑपरेशन का परिणाम है] (https://en.wikipedia.org/wiki/Remainder) परिभाषा के अनुसार। शेष ऑपरेटर जैसी कोई चीज़ नहीं होनी चाहिए क्योंकि शेष ऑपरेशन जैसी कोई चीज नहीं है, इसे मॉड्यूल कहा जाता है। सीएस में – gronostaj

+21

@gronostaj नहीं। हास्केल या स्कीम जैसी उच्च स्तरीय भाषाओं को देखें जो दोनों अलग-अलग ऑपरेटरों को परिभाषित करते हैं (योजना में 'शेष' और 'मॉड्यूलो', 'रीम' और 'हास्केल में' मोड ')। इन ऑपरेटरों के विनिर्देशों को इस भाषा पर विभाजन कैसे किया जाता है इस पर भिन्न होता है: 0 की ओर छेड़छाड़ या नकारात्मक अनंतता की ओर। जिस तरह से सी मानक कभी '%' * मॉड्यूल ऑपरेटर * को कॉल नहीं करता है, वे बस इसे *% ऑपरेटर * नाम देते हैं। – ouah

+0

सी में 'शेष' _function_ के साथ भ्रमित नहीं होना चाहिए, जो – Eric

44

C99 विशिष्टता के आधार पर: a = (a/b) * b + a % b

हम (a % b) = a - (a/b) * b गणना करने के लिए एक समारोह लिख सकते हैं!

int remainder(int a, int b) 
{ 
    return a - (a/b) * b; 
} 

सापेक्ष आपरेशन के लिए, हम निम्नलिखित समारोह (यह मानते हुए b> 0)

int mod(int a, int b) 
{ 
    int r = a % b; 
    return r < 0 ? r + b : r; 
} 

मेरा निष्कर्ष यह है (एक% ख) सी में एक शेष के ऑपरेटर है और ऑपरेटर सापेक्ष नहीं हो सकता है।

+1

में विभाजन के निकट आईईईई शेष को लागू करता है, यह 'बी' नकारात्मक होने पर सकारात्मक परिणाम नहीं देता है (और वास्तव में' आर 'के लिए और 'बी 'नकारात्मक दोनों यह' -b' से कम परिणाम देता है)। सभी इनपुट के लिए सकारात्मक परिणाम सुनिश्चित करने के लिए आप 'आर + एबी (बी)' का उपयोग कर सकते हैं या 'बी के चिह्न से मेल खाने के लिए आप स्थिति को 'आर * बी <0'' में बदल सकते हैं। –

4

अन्य उत्तर C99 में समझा दिया है या बाद में, नकारात्मक ऑपरेंड शामिल पूर्णांकों के विभाजन हमेशा शून्य की ओर काटना।

ध्यान दें कि C89, चाहे परिणाम ऊपर या नीचे की ओर कार्यान्वयन-परिभाषित है। क्योंकि (a/b) * b + a%b सभी मानकों में a के बराबर है, % का परिणाम नकारात्मक संचालन शामिल है जो C89 में कार्यान्वयन-परिभाषित भी है।

23

मुझे नहीं लगता कि यह जांचने की कोई आवश्यकता है कि संख्या ऋणात्मक है या नहीं। सकारात्मक मॉड्यूलो खोजने के लिए सबसे सरल सामान्य कार्य यह होगा - यह एक्स के सकारात्मक और नकारात्मक दोनों मानों पर काम करेगा।

int modulo(int x,int N){ 
    return (x % N + N) %N; 
} 
+0

यह मेरे लिए काम किया। धन्यवाद!!! –

3

गणित, जहां इन सम्मेलनों से स्टेम में, वहाँ कोई दावा है कि सापेक्ष अंकगणित एक सकारात्मक परिणाम उपज चाहिए।

उदा।

1 mod 5 = 1, लेकिन यह बराबर -4 भी हो सकता है।यही है, 1/5 5 से 0 या 4 से शेष 1 उत्पन्न करता है (5 के दोनों कारक)

इसी प्रकार, -1 मॉड 5 = -1, लेकिन यह 4 के बराबर भी हो सकता है। 1/5 -5 से 0 या 4 से शेष -1 उत्पन्न करता है। (5 के दोनों कारक)

आगे पढ़ने के लिए गणित में equivalence classes देखें।

0

मॉड्यूल ऑपरेटर मॉडर ऑपरेटर की तरह है जब संख्या सकारात्मक है, लेकिन यदि संख्या ऋणात्मक है तो अलग है।

समस्याओं में कई बार हमें जवाब मॉड्यूल 10^9 + 7 देने के लिए कहा जाता है।

उत्तर दें (मॉड्यूलो का उपयोग करने से पहले) को 'ए' द्वारा दर्शाया जाना चाहिए।

सरल, सीधा Rule-

अगर एक सकारात्मक तो एक सापेक्ष 10^9 + 7 = एक% (10^9 + 7)

है, अगर एक नकारात्मक है, तो एक सापेक्ष 10^9 + 7 = (एक% (10^9 + 7)) + (10^9 + 7)

हैं, तो सफलता में एच समस्याएं, हम पाते हैं कि लूप का कोई भी चरण पूर्णांक सीमा से बाहर होने वाले मान की गणना कर सकता है (यदि हम पूर्णांक का उपयोग कर रहे हैं), तो हम उस चरण में मॉड्यूलो ऑपरेटर का उपयोग कर सकते हैं। अंतिम जवाब यह होगा कि हमने केवल एक बार मॉड्यूल ऑपरेटर का उपयोग किया है।

ऐसा इसलिए है क्योंकि- (ए * बी)% सी = ((एक% सी) (बी% सी))% सी समान और घटाव के लिए जाता है।

1

मॉड्यूलस ऑपरेटर शेष देता है। ग में मापांक ऑपरेटर आमतौर पर अंश

  1. एक्स = 5% (-3) के हस्ताक्षर लेता है - यहां अंश सकारात्मक है इसलिए यह में 2
  2. y परिणाम = (-5)% (3) - यहाँ अंश नकारात्मक है इसलिए यह परिणाम -2
  3. z = (-5)% (-3) - यहां अंश नकारात्मक है इसलिए यह परिणाम -2

इसके अलावा मापांक (शेष) ऑपरेटर के साथ ही इस्तेमाल किया जा सकता पूर्णांक प्रकार और फ्लोटिंग बिंदु के साथ उपयोग नहीं किया जा सकता है।

+0

यदि आप बाहरी संसाधनों के लिंक के साथ इसे वापस ले सकते हैं तो यह अच्छा होगा। –

+0

https://archive.org/details/letusc_201605 – Kavya

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