2012-09-02 15 views
10

सी में, पूर्णांक विभाजन ए/बी और मंजिल (ए/बी) के बीच कोई अंतर है जहां ए और बी दोनों पूर्णांक हैं? अधिक विशेष रूप से दोनों प्रक्रियाओं के दौरान क्या होता है?सी पूर्णांक विभाजन और मंजिल

उत्तर

11

a/b पूर्णांक विभाजन करता है। यदि a या b ऋणात्मक है, तो परिणाम संकलक पर निर्भर करता है (गोलिंग शून्य की ओर जा सकती है या पूर्व-सी 99 में नकारात्मक अनंतता की ओर जा सकती है; सी 99 + में, गोलाकार 0 की तरफ जाता है)। परिणाम int टाइप किया गया है। floor(a/b) एक ही विभाजन करता है, परिणाम को दोहराता है, (nonexistent) fractional भाग को छोड़ देता है, और परिणाम को दोहरा देता है।

+2

सी पूर्णांक विभाजन शून्य की ओर छंटनी करता है। कार्यान्वयन-परिभाषित होने से पहले यह सी 99 के बाद से सच है। – ouah

+0

आह, 'सी' टैग से चूक गया। फिर भी, यह स्पष्ट है कि मेरा जवाब सी ++ के बारे में है। '' –

+0

@ मिस्टिकियल बिंदु यह है कि 'मंजिल' इस उदाहरण में कुछ भी नहीं है क्योंकि 'ए/बी' पूर्णांक विभाजन करता है और * फिर * इसे 'मंजिल' तक भेजता है। – oldrinb

6

floor रिटर्न एक double जबकि a/b जहां दोनों a और b हैं पूर्णांकों पैदावार एक पूर्णांक मूल्य।

सही कास्ट के साथ मान समान है।

तो typeof ऑपरेटर सी में ही अस्तित्व में (यह नहीं है) हम होगा:

(typeof (a /b)) floor(a/b) == a/b 

संपादित करें: अब अगर सवाल यह है:

(double) (a/b) 

और: वहाँ के बीच कोई अंतर है

floor(a/(double) b) 

उत्तर हाँ है। नकारात्मक मूल्यों के संबंध में परिणाम अलग-अलग हैं।

4

पूर्णांक से फ़्लोटिंग पॉइंट में कनवर्ट करने की जानकारी खोना संभव है। पूर्णांक और डबल के साथ होने की संभावना नहीं है, लेकिन थोड़ा-बहुत बदलाव के साथ:

#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 
+1

एक डबल सभी 32 बिट पूर्णांक मानों को बिल्कुल स्टोर कर सकता है। आप int के बजाय हमेशा डबल का उपयोग कर सकते हैं। यह सटीक खोने की संभावना नहीं है, यह असंभव है। आपका उदाहरण सही है, लेकिन उन लोगों को गुमराह करना जो अभी तक समस्या को नहीं समझते हैं। – maxy

1

सामान्य तौर पर, यह सोचते हैं कि पूर्णांकों दोनों पूर्णांक में प्रदर्शनीय कर रहे हैं और फ्लोटिंग प्वाइंट प्रकार, वहाँ isn एक अंतर नहीं है, लेकिन सबूत स्पष्ट नहीं है। समस्या यह है कि फ्लोटिंग-पॉइंट में, विभाजन ए/बी में एक गोलाकार होता है, ताकि फर्श फ़ंक्शन सटीक तर्कसंगत मान पर लागू न हो, लेकिन अनुमानित मूल्य पर। मैंने विषय पर एक पेपर लिखा था: https://www.vinc17.net/research/publi.html#Lef2005b

संक्षेप में, परिणाम प्राप्त हुआ है कि अगर ए - बी फ्लोटिंग-पॉइंट सिस्टम में बिल्कुल प्रतिनिधित्व करने योग्य है, तो फर्श (ए/बी), जहां एक और बी फ़्लोटिंग-पॉइंट नंबर (पूर्णांक मानों के साथ) हैं, एक ही परिणाम को पूर्णांक विभाजन ए/बी के रूप में देता है।

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