2017-02-28 12 views
5

दिखा रहा है मेरे पास मेरे कार्यक्रम के साथ एक अजीब व्यवहार था जिसमें डबल परिशुद्धता खो रहा था। मेरे कोउट सही मूल्य दिखा रहे थे लेकिन फिर भी व्यवहार अप्रत्याशित था। इसलिए मैंने डीबग किया और पाया कि जीडीबी अप्रत्याशित मूल्य दिखाता है।gdb गलत डबल मान

double length =2.11; 
//gdb shows 2.10 here but prints 2.11 correctly using cout at the end 
cout<<"length; //It prints 2.11 correctly here 

अक्सर ऐसे मुद्दों उत्पादन परिदृश्यों पर मुश्किल जहां डिबगिंग एक विकल्प नहीं है और एकमात्र विकल्प यथासंभव अधिक से अधिक प्रिंट उपयोग कर रहा है कर रहे हैं: के बाद ही सरल परिदृश्य है। कोई सुझाव मैं इस समस्या से कैसे बच सकता हूं?

+1

गलत सवाल (क्योंकि आप इसे प्रेरित करने के लिए भूल गए हैं, और वास्तव में कुछ [XY समस्या] (http://xyproblem.info) ...) हैं। जैसा कि आपने टिप्पणी की थी, आप * संख्या * का उपयोग नहीं करते हैं लेकिन कुछ बारोक लंबाई प्रतिनिधित्व (चूंकि आपने टिप्पणी की है कि '2.11' का मतलब 2 फीट और 11 इंच होगा) –

+1

यदि आप' डबल 'का उपयोग करते हैं तो http पढ़ने के लिए कई घंटे लगाना सुनिश्चित करें: //floating-point-gui.de/ –

+0

@ बेसिलस्टारनकेविच: बिल्कुल अच्छी सलाह। इस ज्ञान के साथ सशस्त्र, आप पार्टियों पर एक हूट नीचे भी जाते हैं। – Bathsheba

उत्तर

6

मान लिया जाये कि IEEE754 डबल परिशुद्धता चल बिन्दु, निकटतम double 2.11 करने के लिए थोड़ा छोटा

2.109999999999999875655021241982467472553253173828125

std::cout पर्याप्त चतुर डिफ़ॉल्ट रूप से उचित रूप से पूर्णांक बनाना है, लेकिन gdb 2 दशमलव स्थानों के लिए छोटा प्रतीत होता है।

+0

मैं इससे कैसे बचूं? मान लीजिए कि मेरे पास डबल डबल वैरिएबल है 'डबल var = 2.11' जहां 2 फीट्स और 11 इंच का प्रतिनिधित्व करता है, मैं यहां से 0.11 भाग कैसे निकाल सकता हूं क्योंकि यह हमेशा 11 – anurag86

+3

के बजाय इसे 10 बनाता है, यह एक' डबल 'का संदिग्ध उपयोग है, और हल करने के लिए तुच्छ नहीं है। 'फीट' और' इंच 'अलग से मॉडलिंग' स्ट्रक्चर 'का उपयोग क्यों न करें? आप उस पर "सामान्यीकृत" विधि भी बना सकते हैं जो चीजों को 1 फुट 13 इंच से 2 फीट 1 इंच में परिवर्तित करता है। – Bathsheba

+2

ऐसा प्रतिनिधित्व होने के कारण एक बड़ी गलती है। 'डबल' * अनुमानित * [वास्तविक संख्याएं] (https://en.wikipedia.org/wiki/Real_number) हैं। आपका डेटा भी एक संख्या नहीं है। या तो (और अधिमानतः) * इसे कुछ लंबाई में परिवर्तित करें (उदा।* मीटर * में), या कुछ और रखें (एक 'std :: string', a 'std :: pair ') –

2

इस तथ्य को देखते हुए वास्तविक संख्याएं आपके मामले में व्यवहार करती हैं, मुझे डर है कि इसके बारे में बहुत कुछ नहीं करना है। आप इससे बचने के लिए योजना बना सकते थे, और अपने डबल मानों पर समानता जांच करने के लिए जगह बनाई थी।

1: [एक कॉलेज परियोजना में इस की कोशिश की], आदेश 10^-4 में संख्या के साथ सौदा एक पूर्णांक और एक कारक मूल्य का उपयोग करने के

यहाँ आप के लिए दो प्रशंसनीय हैक्स कर रहे हैं। उदाहरण: 1.2345 स्टोर करने के लिए, पूर्णांक 12345 और कारक 10000 के रूप में स्टोर करें। अब आप सही तरीके से प्रिंट कर सकते हैं और यह समानता जांच करने की व्यवहार्यता भी प्रदान करता है।

2: यदि डबल मानों की सटीकता पहले ही ज्ञात है तो आप ऑफ़सेट का उपयोग कर सकते हैं। उदाहरण: यदि 2.10 99 99 में 2 दशमलव स्थानों की सटीकता है, तो इस तरह कुछ उपयोग करें: (int) ((2.109999 + .005) * 100)। और फिर तदनुसार प्रिंट करें।

1:

लेकिन दोनों इन हैक्स निम्नलिखित मान आप मूल्यों की सटीकता पर नियंत्रण है। 2: आपको वास्तव में सटीक मान प्रिंट करने की आवश्यकता है।