2013-07-30 11 views
5

एक सी अनुप्रयोग जो मैं कार्यान्वित कर रहा हूं, मुझे फ़ाइल में कॉन्फ़िगरेशन मानों का एक सेट पढ़ने और लिखने में सक्षम होना चाहिए। ये मान फ़्लोटिंग पॉइंट नंबर हैं। भविष्य में यह संभव है कि एक और आवेदन (सी ++, पायथन, पर्ल, इत्यादि में लिखा जा सकता है ...) इस डेटा का उपयोग करेगा, इसलिए इन कॉन्फ़िगरेशन मानों को एक अच्छी तरह परिभाषित प्रारूप में संग्रहीत करने की आवश्यकता है जो संकलक और मशीन स्वतंत्र है ।फ़ाइल में फ्लोटिंग पॉइंट नंबरों को संग्रहीत करना

बाइट ऑर्डर रूपांतरण फ़ंक्शन (ntoh/hton) एंडियननेस को संभालने के लिए उपयोग किया जा सकता है, हालांकि "फ्लोट" मान के विभिन्न अर्थों को प्राप्त करने का सबसे अच्छा तरीका क्या है? क्या फ्लोट्स स्टोर करने के लिए आम तरीका है? गोलाकार और छिड़काव एक समस्या नहीं है, जब तक इसे परिभाषित किया जाता है।

+2

फ़्लोट (या उस मामले के लिए कोई भी मूल्य) स्टोर करने का सबसे अच्छा तरीका, प्लेटफ़ॉर्म स्वतंत्र, पाठ रूप में है। बाइनरी रूप में इसे संग्रहीत करना काम नहीं करेगा, और अंतहीन कार्यों का उपयोग करने से कोई मदद नहीं होगी क्योंकि फ़्लोटिंग पॉइंट मानों के बाइनरी प्रस्तुतियों के लिए कोई अंतहीनता परिभाषित नहीं है। –

+2

@ जोचिमपिलबोर्ग बाइनरी फ्लोटिंग पॉइंट प्रस्तुतियों के लिए कोई मानक परिभाषित अंतराल नहीं हो सकता है, यह स्वयं को लागू करने में काफी आसान है। आपको बस इतना करना है कि फ़्लोटिंग पॉइंट मानों को बड़े एंडियन प्रारूप में संग्रहीत किया जाए। –

+0

आप एक मानक प्रकार का उपयोग कर सकते हैं जैसे IEEE754 युगल – SheetJS

उत्तर

5

शायद दो मुख्य विकल्प हैं: पाठ स्वरूप में

  1. स्टोर। यहां आप एक अच्छी तरह से परिभाषित दशमलव विभाजक का उपयोग करके एक विशेष प्रारूप पर मानकीकृत करेंगे और वैज्ञानिक नोटेशन का उपयोग करेंगे, यानी 6.66e42
  2. आईईईई 754 मानक का उपयोग कर बाइनरी प्रारूप में स्टोर करें। या तो 4 या 8 बाइट डेटा प्रकार का प्रयोग करें। और जैसा कि आपने देखा है, आपको एक अंत्येष्टि सम्मेलन पर बसना होगा।

एक टेक्स्ट प्रारूप शायद अधिक पोर्टेबल है क्योंकि ऐसी मशीनें हैं जो IEEE754 को मूल रूप से समझ में नहीं आती हैं। उस ने कहा, इस तरह की मशीनें इन दिनों दुर्लभ हैं।

+0

दशमलव का उपयोग क्यों करें? –

+0

@Eric पोर्टेबिलिटी के लिए, और मानव पठनीयता –

+2

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

0

IEEE 754, या आईएसओ/आईईसी/आईईईई 60559: 2011, अधिकांश भाषाओं द्वारा उपयोग किए जाने वाले फ्लोटिंग पॉइंट के लिए मानक है।

सी के लिए, यह आधिकारिक तौर पर सी 11 में मानक द्वारा लिया जाता है। (सी 11 अनुलग्नक एफ आईईसी 60559 फ्लोटिंग प्वाइंट अंकगणित)

+0

अनुलग्नक एफ वैकल्पिक है; एक कार्यान्वयन को केवल इसका पालन करने की आवश्यकता है यदि यह '__STDC_IEC_559__' परिभाषित करता है। –

0

कॉन्फ़िगरेशन मानों जैसे डेटा की थोड़ी मात्रा के लिए, बाइनरी नहीं पाठ के साथ जाएं। यदि आप चाहते हैं, तो कुछ रूपों के संरचित पाठ के लिए जाएं, जैसे JSON, XML। अपनी आवश्यकताओं के अनुसार फ़्लोटिंग-पॉइंट नंबर का प्रतिनिधित्व करने के लिए कितने अंक लिखने के लिए निर्णय लें।

आवश्यक पोर्टेबिलिटी (भाषाओं में, ऑपरेटिंग सिस्टम, समय, स्थान इत्यादि) की सीमा बढ़ जाती है इसलिए पाठ के पक्ष में तर्क की शक्ति मजबूत हो जाती है।

4

सी स्वरूपित इनपुट/आउटपुट फ़ंक्शंस के लिए प्रारूप प्रारूप है, %a। यह एक हेक्साडेसिमल फ्लोटिंग-पॉइंट प्रारूप में एक फ़्लोटिंग-पॉइंट नंबर स्वरूपित करता है, [-] 0x एच hhhh पी ± डी। यही है, यदि आवश्यक हो, तो इसके लिए "-" चिह्न होना चाहिए, एक्सपोनेंट शुरू करने और दशमलव (दशमलव में) के एक हस्ताक्षरित एक्सपोनेंट को शुरू करने के लिए एक रेडिक्स बिंदु, "पी" ("पावर" के लिए) के अंश भाग के लिए हेक्साडेसिमल अंक।

जब तक आपका सी कार्यान्वयन बाइनरी फ़्लोटिंग-पॉइंट (या किसी भी फ़्लोटिंग-पॉइंट जैसे कि FLT_RADIX दो की शक्ति है) का उपयोग करता है, %a प्रारूप के साथ रूपांतरण सटीक होना चाहिए।

+0

सी के अलावा अन्य भाषाओं द्वारा इस तरह के पाठ को कैसे पढ़ा जाएगा? –

+1

@ डेविड हेफरन: हेक्साडेसिमल फ्लोटिंग-पॉइंट प्रारूप बाइनरी फ़्लोटिंग-पॉइंट से और कनवर्ट करना आसान है। समान बाइनरी प्रारूप से आने वाली संख्याओं को परिवर्तित करते समय (इसलिए, कोई अतिरिक्त अंक नहीं हैं जिन्हें गोल करने की आवश्यकता है), कोई गोल करने वाले मुद्दे नहीं हैं। –

+0

लेकिन यह सी के अलावा अन्य भाषाओं में तुच्छ नहीं हो सकता है उदाहरण के लिए, पर्ल में ऐसा करने के लिए कोड क्या होगा? क्या ऐसा करने के लिए कोई अंतर्निहित कार्य है? मुझे संदेह है कि कई भाषाओं के लिए आपको अपना खुद का रोल करना होगा। यही कारण है कि लोग कुछ राउंड-ट्रिप सटीक हानि के खर्च पर दशमलव की सुविधा का विकल्प चुन सकते हैं। –

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