2015-02-15 13 views
5

मैं हाल ही में सी ++ में प्रोग्रामिंग के बारे में सीखने में दिलचस्पी लेता हूं, क्योंकि मैं कम्प्यूटर के काम करने और निर्देशों को संभालने के तरीके की गहरी समझ लेना चाहता हूं। मैंने सोचा कि मैं बाहर डेटा प्रकारक्या मैं एक लंबी डबल का उपयोग कर रहा हूं?

#include <iostream> 
#include <iomanip> 

using namespace std; 

int main() { 

    float fValue = 123.456789; 
    cout << setprecision(20) << fixed << fValue << endl; 
    cout << "Size of float: " << sizeof(float) << endl; 

    double dValue = 123.456789; 
    cout << setprecision(20) << fixed << dValue << endl; 
    cout << "Size of double: " << sizeof(double) << endl; 

    long double lValue = 123.456789; 
    cout << setprecision(20) << fixed << lValue << endl; 
    cout << "Size of long double: " << sizeof(long double) << endl; 

    return 0; 
} 

उत्पादन मैं की तरह कुछ हो जाएगा उम्मीद की कोशिश करेंगे, लेकिन मैं वास्तव में समझ में नहीं आता कि मेरी उत्पादन के साथ क्या हो रहा है ...:

123.45678710937500000000 
Size of float: 4 
123.45678900000000000000 
Size of double: 8 
123.45678900000000000000 
Size of long double: 16 

यह वह जगह है मेरा वास्तविक आउटपुट:

123.45678710937500000000 
Size of float: 4 
123.45678900000000000000 
Size of double: 8 
-6518427077408613100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000000 
Size of long double: 12 

जो हुआ उसके बारे में कोई भी विचार बहुत सराहना की जाएगी, धन्यवाद!

संपादित करें:

System: 
Windows 10 Pro Technical Preview 
64-bit Operating System, x64-based processor 
Eclipse CDT 8.5 

MinGW Installation

+1

पुन: उत्पन्न नहीं कर सकता है। आप किस कंपाइलर का उपयोग कर रहे हैं? –

+4

'लंबे डबल' का आकार कंपाइलर और हार्डवेयर द्वारा भिन्न होता है। आकार 8, 12, और 16 ज्ञात हैं। जो आप आकार के रूप में देख रहे हैं वह पूरी तरह से उचित है, भले ही यह आपकी अपेक्षा न हो। स्वरूपित आउटपुट इतना उचित नहीं है, हालांकि। –

+0

FWIW (जो लगभग कुछ भी नहीं है), 4.9.1 पैदावार जीसीसी के साथ पर मैक ओएस एक्स 10.10.2 अपने कोड चलाने: '123.45678710937500000000 नाव के आकार: 4 123.45678900000000055570 डबल का आकार: 8 123.45678900000000055570 लंबे डबल का आकार: 16'। 'फ्लोट' मान में 'एफ' प्रत्यय जोड़ना और' लम्बी डबल 'मान के लिए' एल' प्रत्यय 'फ्लोट' या 'डबल' आउटपुट में कोई फर्क नहीं पड़ता है, लेकिन 'लंबे डबल' आउटपुट को इसमें बदलता है: '123.45678900000000000059 लंबे समय का आकार: 16', जो बेहतर सटीकता दिखाता है। –

उत्तर

6

patch that fixed this in earlier versions से:

MinGW माइक्रोसॉफ्ट क्रम DLL msvcrt.dll उपयोग करता है। यहां एक समस्या है: जबकि जीसीसी 80 बिट लंबे युगल बनाता है, एमएस रनटाइम केवल 64 बिट लंबे युगल स्वीकार करता है। जब मैं MinGW-मिल (सबसे हाल के संस्करण में यह प्रदान करता है) से 4.8.1 संशोधन 4 का उपयोग

इस बग मेरे लिए होता है, लेकिन जब मैं का उपयोग नहीं 4.8.1 संशोधन 5.

तो आप कर रहे हैं लंबे डबल गलत का उपयोग नहीं करते (हालांकि यह सुनिश्चित करने के लिए long double lValue = 123.456789L करने के लिए बेहतर सटीकता होगी कि यह 123.456789 को डबल के रूप में नहीं लेता है, फिर इसे लंबे समय तक डालें)।

इसे ठीक करने का सबसे आसान तरीका आपको केवल 4.9 या 4.7 तक उपयोग करने वाले मिनीजीडब्ल्यू के संस्करण को बदलना होगा, जो आपको चाहिए (आप 4.9 here प्राप्त कर सकते हैं)।

आप के बजाय printf का उपयोग करने को तैयार हैं, तो आप printf("%Lf", ...) को बदल सकता है, और या तो:

  • जब आप जी ++
  • साथ संकलन #include <cstdio> से पहले #define __USE_MINGW_ANSI_STDIO 1 जोड़ने झंडा -posix जोड़ने (से पाया origional patch)

अंत में, आप भी सिर्फ एक double जब भी आप बाहर long double (प्रिंट करने का प्रयास डाल सकता वहाँ से कुछ नुकसान हुआ है सटीकता, लेकिन जब संख्याओं को मुद्रित करते हैं तो इससे कोई फर्क नहीं पड़ता)।

अधिक जानकारी प्राप्त करने के लिए, आप my blog post on this issue पर भी देख सकते हैं।

अपडेट: यदि आप मिंगव 4.8 का उपयोग करना जारी रखना चाहते हैं, तो आप Mignw का एक अलग वितरण भी download कर सकते हैं, जिसमें मेरे लिए यह समस्या नहीं थी।

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