2012-12-03 12 views
23

यदि मेरे पास int है, तो इसे double पर परिवर्तित करें, फिर double को int पर कनवर्ट करें, क्या मैं उसी मूल्य को वापस पाने की गारंटी देता हूं जिसके साथ मैंने शुरुआत की थी?int-> डबल-> int मूल्य-संरक्षित होने की गारंटी है?

int passThroughDouble(int input) 
{ 
    double d = input; 
    return d; 
} 

Am मुझे लगता है कि सभी के लिए passThroughDouble(x) == xint रों x गारंटी: दूसरे शब्दों में, इस समारोह को देखते हुए?

+0

यह int के आकार पर निर्भर करेगा, उदा। 64 बिट इट्स के लिए यह निश्चित रूप से काम नहीं करेगा। 32 बिट इट्स के लिए यह * शायद * काम करेगा। –

+1

'जोर दें (std :: numeric_limits :: अंक <= std :: numeric_limits :: अंक); '- http://en.cppreference.com/w/cpp/types/numeric_limits/digits – sehe

+1

@sehe: निश्चित रूप से आपका मतलब 'static_assert' है। : पी – GManNickG

उत्तर

30

नहीं, यह नहीं है। मानक int और double के सापेक्ष आकारों के बारे में कुछ भी नहीं कहता है।

यदि int एक 64-बिट पूर्णांक है और double मानक आईईईई डबल-परिशुद्धता है, तो यह पहले से ही 2^53 से बड़ी संख्या में विफल हो जाएगा।


जिसके अनुसार, int आज के वातावरण के बहुमत पर 32-बिट अब भी है। तो यह अभी भी कई मामलों में पकड़ जाएगा।

+0

किस प्रणाली में int 64 है हालांकि? विंडोज़ और लिनक्स दोनों में 32 बिट पर है। –

+0

मुझे नहीं लगता कि सी आईईईई डबल परिशुद्धता कहता है। यह सिर्फ डबल परिशुद्धता कहते हैं; जिसका मतलब फ्लोट की सटीकता से दोगुना है। तो 64 बिट int डबल में ठीक से फिट हो सकता है (स्पष्ट रूप से गारंटी नहीं है) – pm100

+0

@ जोहान्सचैब-लीटब मैंने कुछ लिनक्स वितरण के बारे में सुना है जिसमें 64-बिट 'int 'है। लेकिन यह लाउंज से दूसरी हाथ की जानकारी थी। – Mysticial

12

यदि हम फ़्लोटिंग-पॉइंट प्रकारों के "पारंपरिक" आईईईई -754-शैली के प्रतिनिधित्व पर विचार प्रतिबंधित करते हैं, तो आप उम्मीद कर सकते हैं कि यह रूपांतरण मूल्य-संरक्षण के लिए हो सकता है अगर केवल double के मंटिसा में कई बिट्स हैं क्योंकि int में गैर-साइन बिट्स हैं।

क्लासिक आईईईई -754 double प्रकार का मंथिसा 53-बिट चौड़ा है ("अंतर्निहित" अग्रणी बिट सहित), जिसका अर्थ है कि आप [-2^53, +2^53] सीमा में पूर्णांक का प्रतिनिधित्व कर सकते हैं। इस सीमा से बाहर सबकुछ आम तौर पर सटीकता खो देगा।

तो, यह सब इस बात पर निर्भर करता है कि आपके int की तुलना आपके double से की जाती है। जवाब विशिष्ट मंच पर निर्भर करता है। 32-बिट int और आईईईई -754 double के साथ समानता को पकड़ना चाहिए।

+0

डिजिटल ऑडियो सिस्टम काम करने के लिए पूर्णांक रूपांतरणों के लिए फ़्लोटिंग-पॉइंट के पूर्णांक पर निर्भर करते हैं, या 'दुनिया कताई बंद कर देगी'। किसी ऐसे व्यक्ति के रूप में जिसने विषय के सिद्धांत में प्रवेश किया और कुछ व्यावहारिक प्रयोग करने के लिए, मैं केवल इतना कह सकता हूं कि यह सही जवाब है। – Izhaki

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