में stdint.h
(C99), को बढ़ावा देने / cstdint.hpp , और cstdint
(C ++ 0x) हेडर वहाँ है, दूसरों के बीच में, टाइप करें int32_t
।
क्या समान आकार के फ़्लोटिंग पॉइंट प्रकार हैं? कुछ पसंद है float32_t
?
में stdint.h
(C99), को बढ़ावा देने / cstdint.hpp , और cstdint
(C ++ 0x) हेडर वहाँ है, दूसरों के बीच में, टाइप करें int32_t
।
क्या समान आकार के फ़्लोटिंग पॉइंट प्रकार हैं? कुछ पसंद है float32_t
?
sizeof
ऑपरेटर का उपयोग करते हैं । इस तरह का एक प्रकार उपयोगी होगा जब एक एल्गोरिथ्म की आवश्यकता होती है कि यह एक ज्ञात विशिष्ट आकार हो।
sizeof
निरंतर मार्शलिंग और अनमर्शलिंग फ्लोटिंग प्रकारों के मुद्दे को हल करने के लिए इस्तेमाल किया जा सकता है?
जवाबों:
वर्तमान में C या C ++ मानकों में ऐसा कुछ भी मौजूद नहीं है। वास्तव में, इस बात की भी कोई गारंटी नहीं है कि float
बाइनरी फ्लोटिंग-पॉइंट प्रारूप होगा।
कुछ संकलक गारंटी देते हैं कि float
प्रकार IEEE-754 32 बिट बाइनरी प्रारूप होगा। कुछ नहीं। वास्तव में, float
वास्तव में अधिकांश गैर-एम्बेडेड प्लेटफार्मों single
पर IEEE-754 प्रकार है, हालांकि कुछ कंपाइलर व्यापक प्रारूप में अभिव्यक्तियों का मूल्यांकन करने वाले कुछ संकलक के बारे में बताते हैं।
आईईईई -754 के 2008 के संशोधन के लिए सी भाषा बाइंडिंग को जोड़ने पर चर्चा करने वाला एक कार्य समूह है, जो इस बात पर विचार करने की सिफारिश कर सकता है कि इस तरह के टाइफाइड को जोड़ा जाए। यदि इसे C में जोड़ा गया, तो मुझे उम्मीद है कि C ++ मानक सूट का पालन करेगा ... अंततः।
यदि आप जानना चाहते हैं कि क्या आपका float
IEEE 32-बिट प्रकार है, तो जांचें std::numeric_limits<float>::is_iec559
। यह एक संकलन-समय स्थिर है, एक फ़ंक्शन नहीं है।
यदि आप अधिक बुलेटप्रूफ बनना चाहते हैं, तो यह std::numeric_limits<float>::digits
सुनिश्चित करने के लिए भी जांच लें कि वे IEEE मानक डबल-सटीक का उपयोग करके चुपके से नहीं कर रहे हैं float
। इसकी संख्या 24 होनी चाहिए।
जब यह आता है long double
, तो यह जांचना अधिक महत्वपूर्ण है digits
क्योंकि कुछ IEEE प्रारूप हैं जो यथोचित हो सकते हैं: 128 बिट्स (अंक = 113) या 80 बिट्स (अंक = 64)।
यह व्यावहारिक नहीं होगा float32_t
क्योंकि आप आमतौर पर फ्लोटिंग-पॉइंट हार्डवेयर का उपयोग करना चाहते हैं, यदि उपलब्ध हो, और सॉफ़्टवेयर कार्यान्वयन पर वापस नहीं आते हैं।
long double
ओएस एक्स (32-बिट और 64-बिट इंटेल) पर प्रारूप वास्तव में आईईईई-754 डबल विस्तारित थोड़ा-endian क्रम में संग्रहित किया प्रारूप है। इसके बारे में कुछ भी मजाकिया नहीं है। बाइट्स 0-4 महत्व क्षेत्र को पकड़ते हैं, और बाइट्स 8 और 9 प्रतिपादक को पकड़ते हैं और फ़ील्ड पर हस्ताक्षर करते हैं।
5.0L
इसका एक महत्व है a000000000000000
। इसका निष्पक्ष घातांक +2 है, और डबल विस्तारित प्रतिपादक पूर्वाग्रह है 3fff
, इसलिए 5.0L के लिए पक्षपाती प्रतिपादक है 4001
। जब छोटे-एंडियन क्रम में संग्रहीत किया जाता है तो वास्तविक बाइट पैटर्न होता है 00 00 00 00 00 00 00 a0 01 40
, और यदि आप देखते हैं कि दो छोटे-एंडियन 64-बिट पूर्णांक के रूप में हैं, तो आप वास्तव में वही देखेंगे जो आपने देखा था।
4001
लिटिल-एंडियन में 01 40 00 00 ...
अगर कुछ और नहीं है, तो सबसे कम महत्वपूर्ण बाइट पहले आती है। मुझे उम्मीद है कि यह क्रम a0 01 40
संख्या में कहीं दिखाई देगा (यदि उन्होंने केवल एक रोटेशन किया है), लेकिन मुझे नहीं लगता कि आपने समझाया है कि क्यों a0
और 01 40
पूरी तरह से आधे हिस्से में हैं।
अगर आपको लगता है कि फ्लोट32_ टी और फ़्लाट 64_ टी जैसे टाइप्डफ़ेफ़्स किसी भी कारण से अव्यवहारिक हैं, तो आपको अपने परिचित ओएस, कंपाइलर का भी आदी होना चाहिए, कि आप अपने छोटे से घोंसले के बाहर भी असमर्थ हैं।
ऐसे हार्डवेयर मौजूद हैं जो मूल रूप से 32-बिट IEEE फ़्लोटिंग पॉइंट ऑपरेशन चलाते हैं और अन्य जो 64-बिट करते हैं। कभी-कभी ऐसी प्रणालियों को प्रत्येक व्यक्ति से बात करनी पड़ती है, इस स्थिति में यह जानना बेहद जरूरी है कि क्या प्रत्येक प्लेटफ़ॉर्म पर एक डबल 32 बिट या 64 बिट है। यदि 32-बिट प्लेटफॉर्म को दूसरे से 64-बिट मानों के आधार पर अत्यधिक गणना करना था, तो हम समय और गति आवश्यकताओं के आधार पर कम परिशुद्धता के लिए डालना चाहते हैं।
मैं व्यक्तिगत रूप से झांकियों और युगल का उपयोग करने में असहज महसूस करता हूं, जब तक कि मुझे नहीं पता कि मेरे प्लेटफ़ॉर्म पर कितने बिट्स हैं। इससे भी ज्यादा अगर मैं इन्हें किसी संचार चैनल पर किसी अन्य मंच पर स्थानांतरित करने के लिए हूं।
वर्तमान में भाषा में निम्नलिखित प्रकार जोड़ने का प्रस्ताव है:
decimal32
decimal64
decimal128
जो एक दिन के माध्यम से सुलभ हो सकता है #include <decimal>
।
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html