2010-08-30 31 views
135

उदाहरण के लिए,पूर्णांक विभाजन का व्यवहार क्या है?

int result; 

result = 125/100; 

या

result = 43/100; 

हमेशा परिणाम होगा विभाजन की मंजिल हो सकता है? परिभाषित व्यवहार क्या है?

+0

सारांश: *** हस्ताक्षरित * पूर्णांक विभाजन शून्य की ओर truncates **। गैर-ऋणात्मक परिणामों के लिए, यह मंजिल (राउंड की ओर-अनंत) के समान है। (सावधान रहें कि सी 8 9 इसकी गारंटी नहीं देता है, जवाब देखें।) –

उत्तर

135

परिणाम हमेशा विभाजन का तल होगा? परिभाषित व्यवहार क्या है?

हां, दो ऑपरेटरों का पूर्णांक भाग्य।

6.5.5 Multiplicative ऑपरेटरों

जब पूर्णांक विभाजित हैं,/ऑपरेटर का परिणाम किसी भी आंशिक खारिज कर भाग के साथ बीजीय भागफल है। 88) यदि भाग्य ए/बी प्रतिनिधित्व योग्य है, तो अभिव्यक्ति (ए/बी) * बी + एक% बी बराबर होगी।

और इसी फुटनोट:

88) इस बार '' शून्य की ओर काट-छांट '' कहा जाता है।

बेशक दो अंक दिये गये हैं:

सामान्य गणित रूपांतरण ऑपरेंड पर प्रदर्शन कर रहे हैं।

और:

/ऑपरेटर का परिणाम दूसरे से पहले संकार्य के विभाजन से भागफल है; % ऑपरेटर का परिणाम शेष है। दोनों परिचालनों में, यदि दूसरे ऑपरेंड का मान शून्य है, व्यवहार अपरिभाषित है।

[नोट: जोर मेरा]

+11

... बेशक, आप एक सकारात्मक संख्या (या v.v.) द्वारा ऋणात्मक संख्या को विभाजित कर रहे हैं, इस स्थिति में यह छत होगी। –

+53

यह न तो फर्श और न ही छत है, यह आंशिक भाग का छिड़काव है, यह अवधारणात्मक रूप से अलग है! – Wizard79

+25

@ विल ए: नहीं। इसे शून्य की ओर छंटनी के रूप में परिभाषित किया गया है। इसे और कुछ कहकर भ्रम में जोड़ दिया जाएगा, इसलिए कृपया ऐसा करने से बचें। –

11

हां, परिणाम हमेशा शून्य की ओर छोटा हो जाता है। यह सबसे छोटे पूर्ण मूल्य की ओर घूम जाएगा।

-5/2 = -2 
5/2 = 2 

अहस्ताक्षरित और गैर नकारात्मक हस्ताक्षर किए मूल्यों के लिए, इस मंजिल (-Infinity की ओर गोलाई) के समान है।

+38

छंटनी, * नहीं * मंजिल। – dan04

+7

@ dan04: yep floor केवल सकारात्मक पूर्णांक के लिए मान्य होगा :) – Leonid

15

कहाँ परिणाम नकारात्मक है, सी बल्कि फर्श से 0 की ओर ट्रंकेटस - मैं इस कारण है कि अजगर पूर्णांक विभाजन के बारे में पढ़ हमेशा यहाँ फर्श सीखा: Why Python's Integer Division Floors

+2

मैं इस टिप्पणी से सहमत हूं कि क्या (नकारात्मक% pos) नकारात्मक हो रहा है या नहीं? संबंधित नोट पर, मुझे आश्चर्य है कि "unsignedvar> signvar" के कुछ मामलों में आवश्यक अंकगणितीय-गलत व्यवहार हमेशा उपयोगी होता है? मैं तर्क को समझ सकता हूं कि हमेशा सही व्यवहार की आवश्यकता नहीं है; मुझे गलत व्यवहार की आवश्यकता के लिए कोई तर्क नहीं दिखता है। – supercat

+6

+1 उत्कृष्ट संदर्भ के लिए +1 क्यों फर्श पूर्णांक विभाजन के लिए सही व्यवहार है (सी की परिभाषा के विपरीत, जो टूटा हुआ है और लगभग कभी उपयोगी नहीं है)। –

+0

सही और सटीक। +1। –

33

Dirkgently सी 99 में पूर्णांक विभाजन के an excellent description देता है, लेकिन आपको यह भी पता होना चाहिए कि एक नकारात्मक ऑपरेटिंग के साथ सी 8 9 पूर्णांक विभाजन में कार्यान्वयन-परिभाषित दिशा है।

एएनएसआई सी मसौदा (3.3.5) से:

या तो संकार्य नकारात्मक है, चाहे/ऑपरेटर का परिणाम सबसे बड़ा पूर्णांक बीजीय भागफल या छोटी से छोटी पूर्णांक से भी कम समय से अधिक है बीजगणितीय भाग्य कार्यान्वयन-परिभाषित है, जैसा कि% ऑपरेटर के परिणाम का संकेत है। यदि भाग्य ए/बी प्रतिनिधित्व योग्य है, अभिव्यक्ति (ए/बी) * बी + एक% बी बराबर होगी।

तो जब आप C89 कंपाइलर के साथ फंस जाते हैं तो नकारात्मक संख्याओं के साथ देखें।

यह एक मजेदार तथ्य है कि सी 99 ने शून्य की ओर छंटनी का चयन किया क्योंकि इसी तरह फोरट्रान ने ऐसा किया था। Comp.std.c. पर this message देखें

+0

और सी 99 ड्राफ्ट एन 1256 प्रस्तावना अनुच्छेद 5 एक नई भाषा सुविधा के रूप में 'विश्वसनीय पूर्णांक विभाजन' का उल्लेख करता है। अद्भुत '* - *'। –

+0

छंटनी यह है कि कैसे सबसे आम CPU हार्डवेयर (उदा। X86) व्यवहार करता है, इसलिए यह एक अलग विकल्प बनाने के लिए पागल हो जाएगा। आईडीके जो पहले आया था, फोरट्रान अर्थशास्त्र या हार्डवेयर व्यवहार, लेकिन यह एक संयोग नहीं है कि वे भी वही हैं। –

10

परिणाम हमेशा विभाजन का तल होगा?

सं। परिणाम भिन्न होता है, लेकिन भिन्नता केवल नकारात्मक मानों के लिए होती है।

परिभाषित व्यवहार क्या है?

नकारात्मक अनंत की ओर से यह स्पष्ट मंजिल दौर बनाने के लिए, जबकि पूर्णांक विभाजन शून्य (ट्रंकेटस) की ओर दौर

सकारात्मक मूल्यों के लिए वे एक ही

int integerDivisionResultPositive= 125/100;//= 1 
double flooringResultPositive= floor(125.0/100.0);//=1.0 

हैं नकारात्मक मूल्य के लिए यह अलग है

int integerDivisionResultNegative= -125/100;//=-1 
double flooringResultNegative= floor(-125.0/100.0);//=-2.0 
संबंधित मुद्दे