2010-08-11 21 views
44

मुझे पता है कि विभिन्न डेटा प्रकारों का आकार बदल सकता है कि मैं किस प्रणाली पर हूं। मैं XP 32bits उपयोग करें, और सी ++ में sizeof() ऑपरेटर का उपयोग, यह लंबे समय डबल की तरह लगता है 12 बाइट्स की है, और डबल 8.लंबे डबल बनाम डबल

हालांकि, सबसे प्रमुख स्रोत कहा गया है कि लंबे समय तक डबल 8 बाइट्स है, और रेंज इसलिए एक डबल के समान है।

मेरे पास 12 बाइट्स कैसे हैं? यदि लंबी डबल वास्तव में 12 बाइट्स है, तो क्या यह मूल्य की सीमा भी विस्तारित नहीं करता है? या लंबे हस्ताक्षर का उपयोग केवल (कंपाइलर आंकड़े) होता है जब मान डबल की सीमा से अधिक होता है, और इस प्रकार, 8 बाइट से अधिक तक फैला होता है?

धन्यवाद।

+2

यह आईएसओ सी में सबसे खराब विशेषता है। मैं आपको इसका उपयोग करने से दृढ़ता से हतोत्साहित करता हूं। यह केवल समस्याओं का कारण बनता है क्योंकि विनिर्देश इतना ढीला है। – Jeff

उत्तर

49

Wikipedia से हवाला देते हुए:

x86 आर्किटेक्चर पर, सबसे compilers लंबे डबल को लागू कि हार्डवेयर (कभी कभी डेटा संरचना बनाए रखने के लिए 12 या 16 बाइट्स के रूप में जमा के द्वारा समर्थित 80-बिट बढ़ाया परिशुद्धता प्रकार के रूप में

और

संकलनकर्ता भी एक 128-बिट चौगुनी परिशुद्धता प्रारूप है, जो वर्तमान है के लिए लंबे समय तक डबल का उपयोग कर सकते सॉफ्टवेयर में लागू

दूसरे शब्दों में, हाँ, एक long double एक double से मूल्यों की एक बड़ी रेंज स्टोर करने के लिए सक्षम हो सकता है। लेकिन यह पूरी तरह से कंपाइलर तक है।

+2

डेटा प्रकार आपके द्वारा विकसित किए जा रहे आर्किटेक्चर पर भारी निर्भर करता है। – karlphillip

+0

यह कंपाइलर विकल्पों पर भी निर्भर करता है। 80-बिट प्रकार को लगभग हर x86 कंपाइलर पर स्पष्ट रूप से अक्षम किया जा सकता है। – greyfade

+1

@karlphillip, @greyfade: हां, मेरा मतलब है कि "कंपाइलर तक" इस अर्थ में है कि यह तय करता है कि आपका डेटा कैसे स्टोर किया जाए। स्पष्ट रूप से यह प्लेटफ़ॉर्म पर उपलब्ध होने तक सीमित है, और निश्चित रूप से संकलक उपयोगकर्ता को ओवरराइड करने की अनुमति दे सकता है। – Borealid

2

संख्याओं के लिए मानक बाइट आकार सभी प्लेटफार्मों में न्यूनतम न्यूनतम आकार हैं। वे कुछ प्रणालियों पर बड़े हो सकते हैं, लेकिन वे कभी छोटे नहीं होंगे।

1

जहाँ तक मेरी प्रोग्रामिंग नौसिखिया अनुभव का संकेत देता है:

  • उपयोग periodicaly सामान्यीकृत नाव [-1.0, + 1.0]

  • होल्ड सामान्य मूल्य अलग से डबल, या लंबे समय तक डबल के साथ

  • सामान्यीकरण शोर = छोटी त्रुटियों = उच्च आवृत्तियों को चर मानों को पेश करता है

  • समय से यह माध्यिका मान के साथ सामान्य बनाने अलग से पकड़ और डेटा अनुसार क्रमबद्ध रखने उपयोगी है समय के लिए (मूल डेटा आदेश क्रमचय के रूप में वेक्टर बचाया जा सकता है)

1

64, बजना और जीसीसी उपयोग करता है पर आधुनिक compilers के लिए long double के लिए 16-बाइट डबल जबकि वीसी ++ 8-बाइट डबल का उपयोग करता है। दूसरे शब्दों में, क्लैंग और जीसीसी के साथ आपको उच्च परिशुद्धता मिलती है लेकिन वीसी ++ long double के लिए double के समान है। आधुनिक x86 CPUs इन 16-बाइट युगल का समर्थन करते हैं, इसलिए मुझे लगता है कि क्लेंग और जीसीसी सही काम कर रहे हैं और आपको उच्च स्तरीय भाषा प्राइमेटिव का उपयोग करके निम्न स्तर की हार्डवेयर क्षमता तक पहुंचने की अनुमति देता है।

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