2011-09-17 11 views
5

मैं परिभाषा के बारे में नहीं पूछ रहा हूं बल्कि भाषा रचनाकारों ने सी ++ में विषम व्यवहार के साथ मॉड्यूलस को परिभाषित करने का विकल्प क्यों चुना। (मुझे लगता है कि जावा भी)मॉड्यूलस प्रोग्रामिंग भाषाओं में जिस तरह से परिभाषित किया गया है

मान लीजिए कि मैं कम से कम संख्या के बराबर या उसके बराबर संख्या को खोजना चाहता हूं जो f द्वारा विभाजित है।

यदि n सकारात्मक है, तो मुझे क्या करना:

if(n % f) 
    ans = n + f - n % f; 

यदि n नकारात्मक है:

ans = n - n % f; 

जाहिर है, इस परिभाषा सबसे समीचीन जब नकारात्मक और सकारात्मक संख्या के साथ काम नहीं है। तो इसे इस तरह क्यों परिभाषित किया गया था? किस मामले में यह दक्षता पैदा करता है?

+0

क्या आप पूछ रहे हैं कि मॉड्यूलो के पास नकारात्मक ऑपरेटरों के लिए निश्चित परिभाषा क्यों नहीं है? –

+0

http://en.wikipedia.org/wiki/Modulo_operation – starblue

+0

स्पष्टीकरण के लिए: मैं पूछ रहा हूं कि पहली ऑपरेंड की समानता के संबंध में परिभाषा असमान है। –

उत्तर

1

क्योंकि यह "मॉड्यूलो 2 अंकगणितीय" का उपयोग कर रहा है, जहां प्रत्येक बाइनरी अंक का स्वतंत्र रूप से दूसरे से इलाज किया जाता है। "विभाजन" here

+0

लेकिन यह नहीं है। मॉड्यूलो -2 अंकगणित का उपयोग सीआरसी की गणना करते समय किया जाता है, न कि मॉड्यूलस ऑपरेटर। – EJP

1

पर उदाहरण देखें, आप गलत हैं। जब n नकारात्मक है, तो सी ++ के लिए किसी भी a और b, अभिव्यक्ति (a/b)*b + a%b हमेशा a निकलेगा, मापांक ऑपरेटर का परिणाम या तो नकारात्मक या लंबे समय के रूप % और / से परिणाम संगत कर रहे हैं के रूप में सकारात्मक हो सकते हैं। सी 99 की आवश्यकता है कि a % b का परिणाम a जैसा ही होगा। कुछ अन्य भाषाओं (उदाहरण के लिए, पायथन) की आवश्यकता है कि a % b का संकेत b जैसा ही संकेत है।

इसका मतलब है कि आपने नकारात्मक n के लिए दी गई अभिव्यक्ति को वास्तव में C++ में काम करने की आवश्यकता नहीं है। जब/n%f एक सकारात्मक संख्या उत्पन्न करता है (भले ही n नकारात्मक है), यह ans देगा जो n से कम है।

+0

'(ए/बी) * बी + ए% बी 'हमेशा' ए' उत्पन्न करता है सिवाय इसके कि यदि 'बी' शून्य है, तो व्यवहार अपरिभाषित है। – JohnPS

+1

* "जब एन नकारात्मक है, ... *" बेहतर कहा गया है, परिणाम सी ++ 03 में परिभाषित कार्यान्वयन है यदि लाभांश या विभाजक नकारात्मक है। हालांकि, अधिकांश सी ++ कंपाइलर सी 99 सम्मेलन का पालन करते हैं; यह विक्रेता को सी और सी ++ कोड के लिए एक ही मशीनरी का उपयोग करने देता है। सी ++ 11 सी 99 सम्मेलन का पालन करता है। यह अब कार्यान्वयन परिभाषित नहीं है। –

+0

@ डेविड: मैंने यह इंगित किया कि * या तो * ऑपरेंड नकारात्मक होने के कारण कार्यान्वयन परिभाषित परिणामों का नेतृत्व करता है - लेकिन चूंकि वह विशेष रूप से 'n' नकारात्मक होने के बारे में बात करता था, उसने फैसला किया कि यह केवल बेहतर चर्चा करेगा। जहां तक ​​समानता जाती है, सी 99 नेता की तुलना में अधिक अनुयायी है - यानी, उन्होंने इसे मानकीकृत किया क्योंकि अनिवार्य रूप से सभी आधुनिक हार्डवेयर इस तरह से काम करते हैं। माइक्रोसॉफ्ट, एक उदाहरण के लिए, x86 'div' निर्देश उत्पन्न करता है, और सी 99 अनुरूपता में कोई स्पष्ट रुचि नहीं दिखाता है। –

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

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