फिक्स्ड-आकार फ़्लोटिंग पॉइंट प्रकार


91

में stdint.h(C99), को बढ़ावा देने / cstdint.hpp , और cstdint(C ++ 0x) हेडर वहाँ है, दूसरों के बीच में, टाइप करें int32_t

क्या समान आकार के फ़्लोटिंग पॉइंट प्रकार हैं? कुछ पसंद है float32_t?


4
आपको ऐसा कुछ क्यों चाहिए?
आरा

40
आपको कुछ इस तरह की आवश्यकता होती है जब आपके पास फ्लोटिंग-पॉइंट वैल्यू के साथ डेटा संरचना होती है और आप यह भी जानना चाहते हैं कि इसका आकार क्या है।
भीड़

5
@ मोब्रुले: यदि आपको केवल यह जानना है कि आकार क्या है, तो आप sizeofऑपरेटर का उपयोग करते हैं । इस तरह का एक प्रकार उपयोगी होगा जब एक एल्गोरिथ्म की आवश्यकता होती है कि यह एक ज्ञात विशिष्ट आकार हो।
स्टीफन कैनन

6
@ स्टेफेन कैनन - हां, जब आप गारंटी देना चाहते हैं कि आकार क्या है। कहो, कि आपके डेटा संरचना का एक उदाहरण 64 बिट्स में फिट होगा और कुछ बाहरी लाइब्रेरी के लिए मूल्य द्वारा पारित किया जा सकता है।
भीड़

6
@StephenCanon एक क्रॉस-प्लेटफॉर्म क्रमांकन लाइब्रेरी पर विचार करें। कैसे sizeofनिरंतर मार्शलिंग और अनमर्शलिंग फ्लोटिंग प्रकारों के मुद्दे को हल करने के लिए इस्तेमाल किया जा सकता है?
काइल स्ट्रैंड

जवाबों:


47

वर्तमान में C या C ++ मानकों में ऐसा कुछ भी मौजूद नहीं है। वास्तव में, इस बात की भी कोई गारंटी नहीं है कि floatबाइनरी फ्लोटिंग-पॉइंट प्रारूप होगा।

कुछ संकलक गारंटी देते हैं कि floatप्रकार IEEE-754 32 बिट बाइनरी प्रारूप होगा। कुछ नहीं। वास्तव में, floatवास्तव में अधिकांश गैर-एम्बेडेड प्लेटफार्मों singleपर IEEE-754 प्रकार है, हालांकि कुछ कंपाइलर व्यापक प्रारूप में अभिव्यक्तियों का मूल्यांकन करने वाले कुछ संकलक के बारे में बताते हैं।

आईईईई -754 के 2008 के संशोधन के लिए सी भाषा बाइंडिंग को जोड़ने पर चर्चा करने वाला एक कार्य समूह है, जो इस बात पर विचार करने की सिफारिश कर सकता है कि इस तरह के टाइफाइड को जोड़ा जाए। यदि इसे C में जोड़ा गया, तो मुझे उम्मीद है कि C ++ मानक सूट का पालन करेगा ... अंततः।


3
IEEE-754 के बावजूद या नहीं, यह अभी भी एंडियन पोर्टेबिलिटी की समस्याओं को नहीं रोकेगा।
मार्क बी

1
@ पीटर: भाषा बदलने से आपकी हार्डवेयर संगतता प्रभावित नहीं होगी, यह केवल अनुपालन से कुछ हार्डवेयर को हटा देगा। IEEE FP गारंटी पोर्टेबिलिटी में मदद कैसे करेगी?
पोटाटोस्वाटर

1
@Potatoswatter: यह अनुपालन समाधान प्रदान करने के लिए हार्डवेयर विक्रेताओं को प्रोत्साहित करेगा। यदि कोई सॉफ्ट-फ्लोट लाइब्रेरी हैक्स की आवश्यकता के बिना मानक C का समर्थन करता है और भाग b नहीं करता है, तो यह भाग के लिए एक बाजार लाभ है।
स्टीफन कैनन

2
@Potatoswatter: (लगभग) कोई भी हार्डवेयर की गति के बारे में परवाह नहीं करता है। हम हार्डवेयर पर चलने वाले सॉफ़्टवेयर की गति के बारे में परवाह करते हैं। सॉफ्टवेयर तेज हो सकता है यदि यह हार्डवेयर जिस पर चल रहा है वह मानकों के अनुसार होता है और सॉफ्टवेयर को 15 अलग-अलग विशेष मामलों का पता लगाने और उन्हें पैच करने की आवश्यकता नहीं होती है जो इस बात पर निर्भर करता है कि यह किस मंच पर चल रहा है।
स्टीफन कैनन

8
पृथ्वी पर आप अपने पोर्टफ़ोलियो को कई आला आर्किटेक्चर पर संकलन करने से बेहतर पोर्टेबिलिटी कैसे प्राप्त करेंगे ? या तो आप IEEE होने पर फ़्लोट्स पर भरोसा करते हैं, जिस स्थिति में आपका कोड पहले से ही प्रत्येक IEEE-अनुरूप कार्यान्वयन पर चलेगा और कुछ नहीं, या आप नहीं करते हैं, इस स्थिति में आपका कोड सिस्टम की एक विस्तृत श्रृंखला पर चलेगा। यदि C ++ ने IEEE अनुपालन की गारंटी दी है , तो आपका कोड जादुई रूप से अधिक पोर्टेबल नहीं होगा, आप बस इस बात से इंकार करेंगे कि यह उन गैर-अनुपालन आर्किटेक्चर पर कभी भी चल सकता है । आपका तर्क पूरी तरह से पीछे की तरफ है।
जल्फ

30

यदि आप जानना चाहते हैं कि क्या आपका floatIEEE 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 प्रतिपादक को पकड़ते हैं और फ़ील्ड पर हस्ताक्षर करते हैं।
स्टीफन कैनन

@ स्टीफन: यह अच्छी खबर है: v)। क्या मैं पोस्ट किए गए नंबरों से सहमत हूं?
पोटाटॉस्वाटर

1
याद रखें कि डबल विस्तारित (अन्य 754 प्रारूपों के विपरीत) में एक स्पष्ट अग्रणी महत्व बिट है, इसलिए 5.0Lइसका एक महत्व है a000000000000000। इसका निष्पक्ष घातांक +2 है, और डबल विस्तारित प्रतिपादक पूर्वाग्रह है 3fff, इसलिए 5.0L के लिए पक्षपाती प्रतिपादक है 4001। जब छोटे-एंडियन क्रम में संग्रहीत किया जाता है तो वास्तविक बाइट पैटर्न होता है 00 00 00 00 00 00 00 a0 01 40, और यदि आप देखते हैं कि दो छोटे-एंडियन 64-बिट पूर्णांक के रूप में हैं, तो आप वास्तव में वही देखेंगे जो आपने देखा था।
स्टीफन कैनन

(*) इंटेल द्वारा हार्डवेयर में लागू किए गए दोहरे विस्तार, जो कि है। डबल विस्तारित प्रारूप वास्तव में जिस तरह से IEEE-754 (1985) के अन्य दो बुनियादी स्वरूपों को नीचे पिन नहीं किया गया है।
स्टीफन कैनन

@ स्टेफेन: मुझे पूरा यकीन है कि 4001लिटिल-एंडियन में 01 40 00 00 ...अगर कुछ और नहीं है, तो सबसे कम महत्वपूर्ण बाइट पहले आती है। मुझे उम्मीद है कि यह क्रम a0 01 40संख्या में कहीं दिखाई देगा (यदि उन्होंने केवल एक रोटेशन किया है), लेकिन मुझे नहीं लगता कि आपने समझाया है कि क्यों a0और 01 40पूरी तरह से आधे हिस्से में हैं।
पोटेटोस्वाटर

18

अगर आपको लगता है कि फ्लोट32_ टी और फ़्लाट 64_ टी जैसे टाइप्डफ़ेफ़्स किसी भी कारण से अव्यवहारिक हैं, तो आपको अपने परिचित ओएस, कंपाइलर का भी आदी होना चाहिए, कि आप अपने छोटे से घोंसले के बाहर भी असमर्थ हैं।

ऐसे हार्डवेयर मौजूद हैं जो मूल रूप से 32-बिट IEEE फ़्लोटिंग पॉइंट ऑपरेशन चलाते हैं और अन्य जो 64-बिट करते हैं। कभी-कभी ऐसी प्रणालियों को प्रत्येक व्यक्ति से बात करनी पड़ती है, इस स्थिति में यह जानना बेहद जरूरी है कि क्या प्रत्येक प्लेटफ़ॉर्म पर एक डबल 32 बिट या 64 बिट है। यदि 32-बिट प्लेटफॉर्म को दूसरे से 64-बिट मानों के आधार पर अत्यधिक गणना करना था, तो हम समय और गति आवश्यकताओं के आधार पर कम परिशुद्धता के लिए डालना चाहते हैं।

मैं व्यक्तिगत रूप से झांकियों और युगल का उपयोग करने में असहज महसूस करता हूं, जब तक कि मुझे नहीं पता कि मेरे प्लेटफ़ॉर्म पर कितने बिट्स हैं। इससे भी ज्यादा अगर मैं इन्हें किसी संचार चैनल पर किसी अन्य मंच पर स्थानांतरित करने के लिए हूं।


"मैं व्यक्तिगत रूप से फ़्लोट्स और डबल्स का उपयोग करने में असहज महसूस करता हूं, जब तक कि मुझे नहीं पता कि वे वास्तव में मेरे प्लेटफ़ॉर्म पर कितने बिट्स हैं। यहां तक ​​कि अगर मैं इन्हें कुछ संचार चैनल पर दूसरे प्लेटफ़ॉर्म पर स्थानांतरित कर रहा हूं।" - आप मतलब है कि आप पाठ फ़ाइल स्वरूपों का उपयोग करें? इनके साथ फ़ाइल आकार का नुकसान है: एक 32 फ्लोट को 4 बाइट्स की आवश्यकता होती है; इन पाठ रूप में केवल चार अंकों की संख्या का प्रतिनिधित्व कर सकते हैं ...
Pietro

3

वर्तमान में भाषा में निम्नलिखित प्रकार जोड़ने का प्रस्ताव है:

decimal32
decimal64
decimal128

जो एक दिन के माध्यम से सुलभ हो सकता है #include <decimal>

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html


3
दी गई, दशमलव प्रकार IEEE 754 फ़्लोटिंग-पॉइंट प्रकार नहीं हैं।
माइक डीमोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.