2009-04-15 19 views
15

मेरे सी ++ प्रोग्राम में, मुझे बाहरी बाइट अनुक्रम से 64 बिट फ्लोट खींचने की आवश्यकता है। क्या संकलन-समय पर यह सुनिश्चित करने का कोई तरीका है कि युगल 64 बिट्स हैं? क्या डेटा के स्टोर के लिए मुझे कुछ अन्य प्रकार का उपयोग करना चाहिए?सी ++ युगल सुनिश्चित करना 64 बिट्स

संपादित करें: आप इस और वास्तव में एक तरह से आईईईई 754 प्रारूप में भंडारण सुनिश्चित करने की तलाश में पढ़ रहे हैं तो नीचे दिए गए एडम Rosenfield के जवाब पर एक नजर है।

+0

बिल्कुल आप क्या कर रहे हैं? क्या आप आठ बाइट्स लेने और उन्हें आईईईई-मानक 64-बिट फ्लोटिंग-पॉइंट नंबर के रूप में समझने के लिए एक पूरी तरह से पोर्टेबल तरीका ढूंढ रहे हैं? –

+2

@ डेविड: हाँ, यह वही है जो मैं कर रहा हूं। मुझे कुछ ऐसा पता चला जो सी ++ फ्लोट्स और युगल आईईईई -754 प्रारूप में थे।मुझे यकीन नहीं था कि युगल हमेशा एक ही परिशुद्धता का उपयोग करते थे और इसके लिए एक चेक जोड़ना चाहते थे। – Whatsit

+0

अब मुझे यकीन नहीं है कि मेरी मूल जानकारी सही थी। यहां सम्मेलन क्या है? क्या मुझे इस प्रश्न को हटा देना चाहिए और आईईईई -754 से रूपांतरण के बारे में पूछना चाहिए? – Whatsit

उत्तर

11

अन्य उत्तरों पर एक सुधार (जो एक मान मानता है 8-बिट्स है, मानक इसकी गारंटी नहीं देता है ..)। इस तरह होगा:

char a[sizeof(double) * CHAR_BIT == 64]; 

या

BOOST_STATIC_ASSERT(sizeof(double) * CHAR_BIT == 64); 

आप CHAR_BIT <limits.h> या <climits> में परिभाषित पा सकते हैं।

+0

यह गलत मानता है कि एक चार बाइट के रूप में बड़ा है। –

+4

उम, नहीं, यह बिल्कुल नहीं है। वर्णों की इकाइयों में आकार का रिटर्न। CHAR_BIT को प्रति चार बिट्स की संख्या के रूप में परिभाषित किया जाता है। CHAR_BIT द्वारा आकार (x) को गुणा करें और आपके पास * बिल्कुल * कितने बिट्स x है। –

+0

तो उदाहरण के लिए, x86 CHAR_BIT को 8 आकार (डबल) रिटर्न 8 के रूप में परिभाषित किया गया है। (8 * 8) == 64. –

4

समाधान को बढ़ावा देने के बिना तो

char a[ 8 == sizeof(double) ]; 

जैसी सरणी परिभाषित करने के लिए डबल 64 बिट्स नहीं है तो कोड इच्छा की तरह

char a[0]; 

जो एक संकलन समय त्रुटि है दिखता है। बस इस निर्देश के पास उचित टिप्पणी डालें।

+0

एक बाइट 8-बिट –

+0

@Evan: गारंटी बिंदु की गारंटी नहीं है। "Ch& (unsigned char) 255 == 255 && (unsigned char) 256 == 0" यह जांचने के लिए कि वर्ण 8 बिट्स हैं, को जोड़ें। –

+1

उस मामले के बारे में क्या है जब डबल का आकार 16 बाइट होता है, लेकिन बाइट में 4 बिट होते हैं? –

6

मुझे नहीं लगता कि आपको अपने डबल ("आमतौर पर 80 बिट, 64 बिट नहीं) पर" कच्चे आकार "पर ध्यान देना चाहिए, बल्कि इसके परिशुद्धता पर ध्यान देना चाहिए।

numeric_limits के लिए धन्यवाद :: अंक 10 यह काफी आसान है।

+1

80 बिट युगल इंटेल-आईएसएम हैं, और केवल तभी सच है जब एफपीयू वास्तव में 80-बिट मोड में है (64-बिट मोड भी है) ... – DevSolar

+0

मुझे पता है, लेकिन फिर भी ... –

+0

और यहां तक ​​कि 32-बिट मोड डायरेक्ट 3 डी को प्रारंभ करने के तरीके के आधार पर। –

1

इसी समस्या के लिए this post और CCASSERT नामक एक गैर-बूस्ट संकलन समय दावा देखें।

22

सी 99 में, आप केवल जांच सकते हैं कि प्रीप्रोसेसर प्रतीक __STDC_IEC_559__ परिभाषित किया गया है या नहीं। यदि ऐसा है, तो आपको गारंटी है कि double आईईईई 754 (आईईसी 60559 के रूप में भी जाना जाता है) प्रारूप के साथ प्रदर्शित 8-बाइट मान होगा। सी 99 मानक, अनुलग्नक एफ देखें। मुझे यकीन नहीं है कि यह प्रतीक सी ++ में उपलब्ध है या नहीं।

#ifndef __STDC_IEC_559__ 
#error "Requires IEEE 754 floating point!" 
#endif 

वैकल्पिक रूप से, आप पूर्वनिर्धारित स्थिरांक की जांच कर सकते __DBL_DIG__ (15 होना चाहिए), __DBL_MANT_DIG__ (53 होना चाहिए), __DBL_MAX_10_EXP__ (308 होना चाहिए), __DBL_MAX_EXP__ (1024 होना चाहिए), __DBL_MIN_10_EXP (-307 होना चाहिए) , और __DBL_MIN_EXP__ (-1021 होना चाहिए)। ये सी और सी ++ के सभी स्वादों में उपलब्ध होना चाहिए।

+0

यह एक बेहतर समाधान है जिसकी मुझे उम्मीद थी। स्वीकृत इवान का जवाब, हालांकि, चूंकि यह प्रश्न का उत्तर देता है क्योंकि यह अस्तित्व में है। मैंने अभी गलत सवाल पूछा है। – Whatsit

6

std::numeric_limits<double>::is_iec559 जांचें यदि आपको यह पता होना चाहिए कि आपका सी ++ कार्यान्वयन मानक युगल का समर्थन करता है या नहीं। यह न केवल गारंटी देता है कि बिट्स की कुल संख्या 64 है, बल्कि डबल के अंदर सभी क्षेत्रों का आकार और स्थिति भी है।

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