पूर्णांक विभाजन का व्यवहार क्या है?


209

उदाहरण के लिए,

int result;

result = 125/100;

या

result = 43/100;

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


5
सारांश: हस्ताक्षरित पूर्णांक विभाजन शून्य की ओर बढ़ता है । गैर-नकारात्मक परिणामों के लिए, यह फर्श के समान है (गोल-इनफिनिटी)। (खबरदार कि C89 यह गारंटी नहीं देता है, जवाब देखें।)
पीटर कॉर्डेस

5
हर कोई कहता है कि "शून्य की ओर छंटनी" या "छत" या "मंजिल" जैसे कोड एक जानबूझकर निर्णय ले रहा है जिस पर तकनीक का उपयोग करना है। अगर कोड बात कर सकता है तो यह कहेंगे"I just throw the dam fraction part in the trash and move on with life"
टिमोथी एलजे स्टीवर्ट

3
@ TimothyL.J.Stewart "कोड" एक जानबूझकर निर्णय ले रहा है। विनिर्देश के अनुसार, पूर्णांक विभाजन का अर्थ टी (रनकेशन) -डिविज़न है। इस वजह से, मोडुलो / शेष ऑपरेटर को अलग तरह से प्रत्यारोपित किया जाता है, अगर वह किसी अन्य भाषा में हो, जैसे कि पायथन या रूबी। विभिन्न तरीकों की सूची के लिए इसे देखें मोडुलो ऑपरेटर और यह पेपर जो प्रोग्रामिंग भाषाओं के कम से कम पांच तरीकों को सूचीबद्ध करता है, जो div / modulo करने का निर्णय करता है।
13steinj

1
@ 13steinj मैं बोलचाल की टिप्पणियों के अनुसार बोल रहा हूं कि यह "शून्य की ओर छोटा है ... कोई मंजिल नहीं है ... यदि इसकी नकारात्मक छत इसकी नकारात्मक है ..." जैसे हम चाहते हैं, लेकिन यह जानकर कि "अंश भाग को फेंक दिया जाता है" आप तकनीकी बिंदुओं को प्राप्त कर सकते हैं। तकनीकी एक भारी बोझ हैं, लेकिन अंतर्ज्ञान प्रकाश और हवा के रूप में ताज़ा है, मैं उन दूर-दूर तक ले जाऊंगा और जब आवश्यक हो मुझे पता चल जाएगा कि कहां से शुरू करना है। उस पेपर की तरह, जिससे आप जुड़े हैं, धन्यवाद।
टिमोथी एलजे स्टीवर्ट

मैंने यहां यूक्लिडियन डिवीजन (पूर्णांक विभाजन और मापांक ऑपरेटर के बीच अंतर-प्ले) पर जोर देने के साथ उत्तर दिया
पाइकौड विंसेंट

जवाबों:


182

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

हां, दो ऑपरेंड के पूर्णांक भागफल।

6.5.5 गुणक संचालक

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

और संगत फुटनोट:

88) इसे अक्सर '' शून्य की ओर झुकाव '' कहा जाता है।

निश्चित रूप से नोट करने के लिए दो बिंदु हैं:

3 संचालन पर सामान्य अंकगणितीय रूपांतरण किए जाते हैं।

तथा:

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

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


26
... जब तक, निश्चित रूप से, आप एक सकारात्मक (या वीवी) द्वारा एक नकारात्मक संख्या को विभाजित कर रहे हैं, जिस स्थिति में यह छत होगी।
होगा

74
यह न तो फर्श है और न ही छत है, यह आंशिक भाग का छंटनी है, यह वैचारिक रूप से अलग है!
लर्नोवा

38
@Will A: नहीं। इसे शून्य की ओर छंटनी के रूप में परिभाषित किया गया है। इसे और कुछ भी कहना भ्रम की स्थिति को बढ़ा देगा इसलिए कृपया ऐसा करने से बचना चाहिए।
मार्टिन यॉर्क

44
कम से कम एक गणितीय दृष्टिकोण से, शून्य की ओर छंटाई "यदि> 0 तो मंजिल की छत है" के बराबर है। मुझे लगता है कि बस इसे ट्रंकेशन कहना मंजिल / छत को कॉल करने की तुलना में सरल है, लेकिन या तो वैध है। भले ही, विल ए की बात सर्वमान्य है: डर्केपट्टी का उत्तर आंशिक रूप से गलत है, क्योंकि उन्होंने कहा कि ओपी परिणाम के विभाजन के बारे में सही है।
ब्रायन

9
@ पिलिप पॉटर: मुझे नहीं लगता कि इसे C89 में परिभाषित किया गया था, और यह 1998 के C ++ मानक में नहीं है। उन में, निश्चित रूप (a / b) * b + a % b == aसे संतुष्ट होना था, और पूर्ण मूल्य से a % bकम होना था a, लेकिन क्या a % bनकारात्मक के लिए नकारात्मक था aया bनिर्दिष्ट नहीं किया गया था।
डेविड थॉर्नले

39

Dirkgently C99 में पूर्णांक विभाजन का एक उत्कृष्ट विवरण देता है , लेकिन आपको यह भी जानना चाहिए कि C89 पूर्णांक विभाजन में एक नकारात्मक ऑपरेंड के साथ कार्यान्वयन-परिभाषित दिशा होती है।

ANSI C ड्राफ्ट (3.3.5) से:

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

इसलिए जब आप C89 कंपाइलर से चिपके हुए हों तो निगेटिव नंबर देखें।

यह एक मजेदार तथ्य है कि C99 ने शून्य की ओर ट्रेंकुलेशन को चुना क्योंकि यही फोरट्रान ने किया था। इस संदेश को देखें comp.std.c.


2
और C99 ड्राफ्ट N1256 ने अनुच्छेद 5 reliable integer divisionमें एक नई भाषा की विशेषता के रूप में उल्लेख किया है। कमाल है *-*
सिरो सेंटिल्ली 郝海东 i iro i 法轮功

ट्रंकेशन यह है कि सबसे आम सीपीयू हार्डवेयर (जैसे x86) कैसे व्यवहार करता है, इसलिए यह एक अलग विकल्प बनाने के लिए पागल होगा। IDK जो पहले आया था, फोरट्रान शब्दार्थ या हार्डवेयर व्यवहार, लेकिन यह संयोग नहीं है कि वे समान हैं, भी।
पीटर कॉर्डेस

2
@PeterCordes: अधिकांश सामान्य सीपीयू हार्डवेयर विभाजन को अधिक तेजी से विभाजित कर सकते हैं क्योंकि वे विभाजन को कम कर सकते हैं। IMHO, यह कहने के लिए मानक के लिए बेहतर होता कि वह expr1 / expr2और expr1 % expr2एक दूसरे के अनुरूप होना चाहिए, जब दोनों उदाहरण expr1समान वस्तुओं को एक ही तरह से जोड़ते हैं, और इसी तरह के लिए expr2, लेकिन ट्रंकिंग बनाम फ्लोर्ड विभाजन की पसंद अन्यथा अनपेक्षित है। यह अधिक अनुकूलता को तोड़े बिना अधिक कुशल कोड जेनरेशन की अनुमति देता (और कार्यान्वयन यदि विशिष्ट व्यवहार का दस्तावेजीकरण कर सकता है तो)
सुपरकैट

23

जहां परिणाम नकारात्मक है, C फर्श के बजाय 0 की ओर बढ़ता है - मैंने पठन के पूर्णांक विभाजन को हमेशा यहां फर्श के बारे में पढ़ा है: पायथन के इंटीजर डिवीजन फर्श क्यों


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

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

@supercat विचार करें:, filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factorके बदलते मूल्यों के साथ पुनरावृत्त value। यह समय के साथ एक फर्स्ट-ऑर्डर लोर्ज़ फ़िल्टर के लिए एक अच्छा पूर्णांक सन्निकटन बनाता है k... लेकिन यह केवल सममित है यदि विभाजन छोटा है और carryनकारात्मक मान प्राप्त करता है। विभाजन के लिए दोनों व्यवहार समय-समय पर काम आते हैं।
hobbs

1
@ ओह: मुझे नहीं लगता कि जब संकेत शून्य को पार करते हैं तो उपरोक्त कोड सफाई से व्यवहार करेगा। यदि divएक फ्लोर्ड डिवीजन ऑपरेटर है और factorविषम है, तो filtered += (filter+(factor div 2)) div factorसभी मूल्यों के लिए स्वच्छ और सममित व्यवहार होगा INT_MAX-(factor div 2)
सुपरकैट

@ सुपरकैट हालांकि यह काम करता है; वह कोड केवल कुछ से थोड़ा डिस्टिल्ड है जो मैंने परमाणु घड़ी के नियंत्रक में थोड़ी देर के लिए चला था।
हॉब्स

21

हां, परिणाम हमेशा शून्य की ओर छोटा होता है। यह सबसे छोटे निरपेक्ष मान की ओर बढ़ेगा।

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

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


43
ट्रंकेशन, फ्लोर नहीं
dan04

9
@ dan04: हां मंजिल केवल धनात्मक पूर्णांक के लिए :) मान्य होगा
लियोनिद

13

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

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

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

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

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

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

0

मुझे पता है कि लोगों ने आपके प्रश्न का उत्तर दिया है, लेकिन आम शब्दों में:

5 / 2 = 2 // चूंकि 5 और 2 दोनों पूर्णांक हैं और पूर्णांक विभाजन हमेशा दशमलव को काटते हैं

5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5 // यहाँ 5 या 2 या दोनों में दशमलव है इसलिए आपको जो भागफल मिलेगा वह दशमलव में होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.