2011-04-22 4 views
14

क्या .NET दशमलव मान 1m और 1.0000m के बीच कोई व्यावहारिक अंतर है?क्या .NET दशमलव मान 1m और 1.0000m के बीच कोई व्यावहारिक अंतर है?

आंतरिक भंडारण अलग है:

1m  : 0x00000001 0x00000000 0x00000000 0x00000000 
1.0000m : 0x000186a0 0x00000000 0x00000000 0x00050000 

लेकिन, वहाँ एक स्थिति है जहाँ "महत्वपूर्ण अंक" के ज्ञान बीसीएल में एक विधि द्वारा इस्तेमाल किया जाएगा है?

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

उत्तर

4

एकमात्र कारण मैं सोच सकता हूं कि 'ToString स्रोत कोड में सटीक पाठपरक प्रतिनिधित्व देता है।

Console.WriteLine(1m); // 1 
Console.WriteLine(1.000m); // 1.000 
+1

-1: "टूस्ट्रिंग" स्रोत कोड के बारे में कुछ भी कैसे जान सकता है? –

+0

दिलचस्प। मुझे कुछ देना होगा मैंने सोचा कि क्या मुझे परवाह है या नहीं। – MarkPflug

+0

@ जॉन - स्पष्ट रूप से यह करता है। – ChaosPandion

11

एन्कोडिंग में अंतर की वजह जिसकी वजह से भाजक के रूप में प्रयोग किया जाता है दशमलव डेटा प्रकार भंडार एक पूर्ण संख्या (96 बिट पूर्णांक) के रूप में संख्या, पैमाने के साथ आंशिक संख्या प्राप्त करने के लिए है। मूल्य अनिवार्य रूप से

integer/10^scale 

आंतरिक दशमलव प्रकार 4 Int32 के रूप में प्रतिनिधित्व कर रहा है, और अधिक विस्तार के लिए Decimal.GetBits के दस्तावेज़ देखें। सारांश में, GetBits 4 Int32s, जहां प्रत्येक तत्व दशमलव एन्कोडिंग

Element 0,1,2 - Represent the low, middle and high 32 bits on the 96 bit integer 
Element 3  - Bits 0-15 Unused 
       Bits 16-23 exponent which is the power of 10 to divide the integer by 
       Bits 24-30 Unused 
       Bit 31 the sign where 0 is positive and 1 is negative 
अपने उदाहरण में

तो के भाग पालन का प्रतिनिधित्व करता है की एक सरणी देता है, बहुत बस जब 1.0000m दशमलव के रूप में एन्कोड किया गया है डाल वास्तविक प्रतिनिधित्व 10000/10^4 है जबकि 1 मीटर को 1/10^0 गणितीय रूप से दर्शाया गया है, वही मान अलग-अलग एन्कोड किया गया है।

यदि आप दशमलव प्रकार के लिए मूल .NET ऑपरेटरों का उपयोग करते हैं और बिट/बाइट्स को स्वयं की तुलना/तुलना नहीं करते हैं तो आपको सुरक्षित होना चाहिए।

आप यह भी देखेंगे कि स्ट्रिंग रूपांतरण इस बाइनरी प्रतिनिधित्व को विभिन्न स्ट्रिंग्स पर विचार करने और उत्पादन करने के लिए भी लेंगे, इसलिए यदि आप कभी स्ट्रिंग प्रस्तुति पर भरोसा करते हैं तो आपको उस मामले में सावधान रहना होगा।

+0

छोटे नाइटपिक: यह बाइट 1,2,3 नहीं बल्कि बल्कि (4 बाइट क्वार्टेट) है। या शायद आप कह सकते हैं कि पहले 12 बाइट्स पूर्णांक मान रखते हैं। –

+0

@ मैट ब्रूनेल, आप बिल्कुल सही हैं! इसके लिए धन्यवाद मैंने तदनुसार जवाब सही किया। –

5

decimal टाइप ट्रैक स्केल क्योंकि यह अंकगणित में महत्वपूर्ण है। आप हाथ से लंबे समय से गुणा करते हैं, दो नंबर उदाहरण के लिए —, 3.14 * 5.00 — परिणाम परिशुद्धता के 6 अंक होते हैं और एक पैमाने 4.

की के गुणन ऐसा करने के लिए, तो दशमलव अंक की अनदेखी (अभी के लिए) और दो संख्याओं को पूर्णांक के रूप में मानें।

3.14 
* 5.00 
------ 
    0000 -- 0 * 314 (0 in the one's place) 
00000 -- 0 * 314 (0 in the 10's place) 
157000 -- 5 * 314 (5 in the 100's place) 
------ 
157000 

जो आपको असुरक्षित परिणाम देता है। अब, अभिव्यक्ति में दशमलव बिंदु के दाईं ओर अंकों की कुल संख्या की गणना (जो 4 होगा) और बाईं ओर दशमलव बिंदु 4 स्थानों सम्मिलित करें:

15.7000 

यही परिणाम है, जबकि करने के लिए मूल्य में बराबर 15।7, मूल्य 15.7 से अधिक सटीक है। मूल्य 15.7000 में परिशुद्धता के 6 अंक और 4 के पैमाने हैं; 15.7 में परिशुद्धता के 3 अंक हैं और 1.

यदि कोई सटीक अंकगणित करने का प्रयास कर रहा है, तो अपने मूल्यों और परिणामों के सटीकता और पैमाने को ट्रैक करना महत्वपूर्ण है क्योंकि यह आपको अपने परिणामों की सटीकता के बारे में कुछ बताता है (ध्यान दें कि सटीकता सटीकता के समान नहीं है: एक शासक के साथ 1/10 वें में स्नातक शासक के साथ कुछ मापें और परिणामस्वरूप माप के बारे में आप जो भी कह सकते हैं, इससे कोई फर्क नहीं पड़ता कि आप दशमलव बिंदु के दाईं ओर कितने पीछे वाले शून्यों को डालते हैं यह है कि, सर्वोत्तम रूप से, एक इंच का 1/10 वां सटीक है। इसे डालने का एक और तरीका यह कहना होगा कि आपका माप सही मूल्य पर +/- 5/100ths के भीतर सटीक है।

+0

दुर्भाग्यवश, जिस तरीके से 'दशमलव' ट्रैक सटीकता शामिल है, वह शामिल संख्याओं की सटीकता के बारे में किसी भी जानकारी को विश्वसनीय रूप से बनाए रखता नहीं है। संख्याओं द्वारा डिवीजन जो फॉर्म 2^एन * 5^एन नहीं हैं, अंकों की अधिकतम प्रतिनिधित्व योग्य संख्या उत्पन्न करेंगे, भले ही वे अंक किसी भी वास्तविक सटीकता का प्रतिनिधित्व करते हैं, और कुछ भी संकेत नहीं देता है कि जब विच्छेदन रद्दीकरण में घटाव परिणाम होता है। – supercat

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