सी में, पूर्णांक विभाजन ए/बी और मंजिल (ए/बी) के बीच कोई अंतर है जहां ए और बी दोनों पूर्णांक हैं? अधिक विशेष रूप से दोनों प्रक्रियाओं के दौरान क्या होता है?सी पूर्णांक विभाजन और मंजिल
उत्तर
a/b
पूर्णांक विभाजन करता है। यदि a
या b
ऋणात्मक है, तो परिणाम संकलक पर निर्भर करता है (गोलिंग शून्य की ओर जा सकती है या पूर्व-सी 99 में नकारात्मक अनंतता की ओर जा सकती है; सी 99 + में, गोलाकार 0 की तरफ जाता है)। परिणाम int
टाइप किया गया है। floor(a/b)
एक ही विभाजन करता है, परिणाम को दोहराता है, (nonexistent) fractional भाग को छोड़ देता है, और परिणाम को दोहरा देता है।
floor
रिटर्न एक double
जबकि a/b
जहां दोनों a
और b
हैं पूर्णांकों पैदावार एक पूर्णांक मूल्य।
सही कास्ट के साथ मान समान है।
तो typeof
ऑपरेटर सी में ही अस्तित्व में (यह नहीं है) हम होगा:
(typeof (a /b)) floor(a/b) == a/b
संपादित करें: अब अगर सवाल यह है:
(double) (a/b)
और: वहाँ के बीच कोई अंतर है
floor(a/(double) b)
उत्तर हाँ है। नकारात्मक मूल्यों के संबंध में परिणाम अलग-अलग हैं।
पूर्णांक से फ़्लोटिंग पॉइंट में कनवर्ट करने की जानकारी खोना संभव है। पूर्णांक और डबल के साथ होने की संभावना नहीं है, लेकिन थोड़ा-बहुत बदलाव के साथ:
#include <stdio.h>
#include <math.h>
int main(void)
{
unsigned long long a = 9000000000000000003;
unsigned long long b = 3;
printf("a/b = %llu\n", a/b);
printf("floor(a/b) = %f\n", floor(a/b));
return 0;
}
परिणाम:
a/b = 3000000000000000001
floor(a/b) = 3000000000000000000.000000
एक डबल सभी 32 बिट पूर्णांक मानों को बिल्कुल स्टोर कर सकता है। आप int के बजाय हमेशा डबल का उपयोग कर सकते हैं। यह सटीक खोने की संभावना नहीं है, यह असंभव है। आपका उदाहरण सही है, लेकिन उन लोगों को गुमराह करना जो अभी तक समस्या को नहीं समझते हैं। – maxy
सामान्य तौर पर, यह सोचते हैं कि पूर्णांकों दोनों पूर्णांक में प्रदर्शनीय कर रहे हैं और फ्लोटिंग प्वाइंट प्रकार, वहाँ isn एक अंतर नहीं है, लेकिन सबूत स्पष्ट नहीं है। समस्या यह है कि फ्लोटिंग-पॉइंट में, विभाजन ए/बी में एक गोलाकार होता है, ताकि फर्श फ़ंक्शन सटीक तर्कसंगत मान पर लागू न हो, लेकिन अनुमानित मूल्य पर। मैंने विषय पर एक पेपर लिखा था: https://www.vinc17.net/research/publi.html#Lef2005b
संक्षेप में, परिणाम प्राप्त हुआ है कि अगर ए - बी फ्लोटिंग-पॉइंट सिस्टम में बिल्कुल प्रतिनिधित्व करने योग्य है, तो फर्श (ए/बी), जहां एक और बी फ़्लोटिंग-पॉइंट नंबर (पूर्णांक मानों के साथ) हैं, एक ही परिणाम को पूर्णांक विभाजन ए/बी के रूप में देता है।
सी पूर्णांक विभाजन शून्य की ओर छंटनी करता है। कार्यान्वयन-परिभाषित होने से पहले यह सी 99 के बाद से सच है। – ouah
आह, 'सी' टैग से चूक गया। फिर भी, यह स्पष्ट है कि मेरा जवाब सी ++ के बारे में है। '' –
@ मिस्टिकियल बिंदु यह है कि 'मंजिल' इस उदाहरण में कुछ भी नहीं है क्योंकि 'ए/बी' पूर्णांक विभाजन करता है और * फिर * इसे 'मंजिल' तक भेजता है। – oldrinb