उदाहरण के लिए,
int result;
result = 125/100;
या
result = 43/100;
क्या परिणाम हमेशा विभाजन की मंजिल होगा? परिभाषित व्यवहार क्या है?
"I just throw the dam fraction part in the trash and move on with life"
उदाहरण के लिए,
int result;
result = 125/100;
या
result = 43/100;
क्या परिणाम हमेशा विभाजन की मंजिल होगा? परिभाषित व्यवहार क्या है?
"I just throw the dam fraction part in the trash and move on with life"
जवाबों:
क्या परिणाम हमेशा विभाजन की मंजिल होगा? परिभाषित व्यवहार क्या है?
हां, दो ऑपरेंड के पूर्णांक भागफल।
6.5.5 गुणक संचालक
6 जब पूर्णांकों को विभाजित किया जाता है, तो / ऑपरेटर का परिणाम बीजीय भागफल होता है जिसमें किसी भी आंशिक भाग को छोड़ दिया जाता है। 88) यदि भागफल a / b प्रतिनिधित्व योग्य है, तो अभिव्यक्ति (a / b) * b + a% b समान होगी।
और संगत फुटनोट:
88) इसे अक्सर '' शून्य की ओर झुकाव '' कहा जाता है।
निश्चित रूप से नोट करने के लिए दो बिंदु हैं:
3 संचालन पर सामान्य अंकगणितीय रूपांतरण किए जाते हैं।
तथा:
5 / ऑपरेटर का परिणाम दूसरे द्वारा पहले ऑपरेंड के विभाजन से भागफल है; % ऑपरेटर का परिणाम शेष है। दोनों कार्यों में, यदि दूसरे ऑपरेंड का मान शून्य है, तो व्यवहार अपरिभाषित है।
[नोट: जोर मेरा]
(a / b) * b + a % b == a
से संतुष्ट होना था, और पूर्ण मूल्य से a % b
कम होना था a
, लेकिन क्या a % b
नकारात्मक के लिए नकारात्मक था a
या b
निर्दिष्ट नहीं किया गया था।
Dirkgently C99 में पूर्णांक विभाजन का एक उत्कृष्ट विवरण देता है , लेकिन आपको यह भी जानना चाहिए कि C89 पूर्णांक विभाजन में एक नकारात्मक ऑपरेंड के साथ कार्यान्वयन-परिभाषित दिशा होती है।
ANSI C ड्राफ्ट (3.3.5) से:
यदि या तो ऑपरेंड नकारात्मक है, तो क्या / ऑपरेटर का परिणाम बीजगणितीय भागफल की तुलना में सबसे बड़ा पूर्णांक है या बीजगणितीय भागफल की तुलना में सबसे छोटा पूर्णांक कार्यान्वयन-परिभाषित है, जैसा कि% ऑपरेटर के परिणाम का संकेत है। यदि भागफल a / b प्रतिनिधित्व योग्य है, तो अभिव्यक्ति (a / b) * b + a% b बराबर होगी।
इसलिए जब आप C89 कंपाइलर से चिपके हुए हों तो निगेटिव नंबर देखें।
यह एक मजेदार तथ्य है कि C99 ने शून्य की ओर ट्रेंकुलेशन को चुना क्योंकि यही फोरट्रान ने किया था। इस संदेश को देखें comp.std.c.
reliable integer division
में एक नई भाषा की विशेषता के रूप में उल्लेख किया है। कमाल है *-*
।
expr1 / expr2
और expr1 % expr2
एक दूसरे के अनुरूप होना चाहिए, जब दोनों उदाहरण expr1
समान वस्तुओं को एक ही तरह से जोड़ते हैं, और इसी तरह के लिए expr2
, लेकिन ट्रंकिंग बनाम फ्लोर्ड विभाजन की पसंद अन्यथा अनपेक्षित है। यह अधिक अनुकूलता को तोड़े बिना अधिक कुशल कोड जेनरेशन की अनुमति देता (और कार्यान्वयन यदि विशिष्ट व्यवहार का दस्तावेजीकरण कर सकता है तो)
जहां परिणाम नकारात्मक है, C फर्श के बजाय 0 की ओर बढ़ता है - मैंने पठन के पूर्णांक विभाजन को हमेशा यहां फर्श के बारे में पढ़ा है: पायथन के इंटीजर डिवीजन फर्श क्यों
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
के बदलते मूल्यों के साथ पुनरावृत्त value
। यह समय के साथ एक फर्स्ट-ऑर्डर लोर्ज़ फ़िल्टर के लिए एक अच्छा पूर्णांक सन्निकटन बनाता है k
... लेकिन यह केवल सममित है यदि विभाजन छोटा है और carry
नकारात्मक मान प्राप्त करता है। विभाजन के लिए दोनों व्यवहार समय-समय पर काम आते हैं।
div
एक फ्लोर्ड डिवीजन ऑपरेटर है और factor
विषम है, तो filtered += (filter+(factor div 2)) div factor
सभी मूल्यों के लिए स्वच्छ और सममित व्यवहार होगा INT_MAX-(factor div 2)
।
हां, परिणाम हमेशा शून्य की ओर छोटा होता है। यह सबसे छोटे निरपेक्ष मान की ओर बढ़ेगा।
-5 / 2 = -2
5 / 2 = 2
अहस्ताक्षरित और गैर-नकारात्मक हस्ताक्षरित मूल्यों के लिए, यह फर्श के समान है (-फिनिटी की ओर)।
क्या परिणाम हमेशा विभाजन की मंजिल होगा?
नहीं। परिणाम भिन्न होता है, लेकिन भिन्नता केवल नकारात्मक मूल्यों के लिए होती है।
परिभाषित व्यवहार क्या है?
नकारात्मक अनंत की ओर स्पष्ट मंजिल के चक्कर लगाने के लिए, जबकि पूर्णांक विभाजन शून्य (ट्रंकट्स) की ओर गोल होता है
सकारात्मक मूल्यों के लिए वे समान हैं
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