2010-09-13 23 views
5

में युगल के साथ अंकगणितीय परिशुद्धता मुझे समझ में कुछ परेशानी हो रही है कि इन युगलों की सटीकता Matlab में अंकगणितीय परिचालन के परिणाम को कैसे प्रभावित करती है। मैंने सोचा कि चूंकि & बी दोनों युगल हैं क्योंकि वे उस परिशुद्धता तक संचालन करने में सक्षम होंगे। मुझे एहसास है कि राउंड-ऑफ त्रुटि हो सकती है लेकिन चूंकि ये संख्या 64-बिट संख्या के प्रतिनिधित्व के भीतर अच्छी तरह से हैं, इसलिए मुझे नहीं लगता कि यह एक मुद्दा होगा।मैटलैब

a = 1.22e-45 
b = 1 
a == 0 
    ans = 0 %a is not equal to zero 
(a + b) == 1 
    ans = 1 

कैसे आ यह पहचान करने के लिए एक! = 0, लेकिन यह किसी भी परिवर्तन दिखाई नहीं देता जब 1 करने के लिए जोड़ा पर्याप्त परिशुद्धता ले जाने में सक्षम है।

उत्तर

6

64-बिट आईईईई -754 फ्लोटिंग पॉइंट संख्याओं में 16 महत्वपूर्ण दशमलव अंकों का प्रतिनिधित्व करने के लिए पर्याप्त सटीकता (53 बिट मंटिसा के साथ) है। लेकिन इसके उदाहरण के लिए (1 + ए) = 1.00 .... 000122 और 1.000 के बीच अंतर बताने के लिए 45 महत्वपूर्ण दशमलव अंकों की आवश्यकता है।

+0

मुझे लगता है कि मंटिसा में 52 बिट्स (एक्सपोनेंट के लिए 11 बिट्स, प्लस 1 बिट कुल 64-बिट बनाने के लिए) है। * क्लेव मोलर * (MATLAB के पहले संस्करण के लेखक) द्वारा एक उत्कृष्ट लेख फ़्लोटिंग पॉइंट नंबरों के सभी विवरण बताता है: [पीडीएफ लिंक] http://www.mathworks.com/company/newsletters/news_notes/pdf/Fall96Cleve। पीडीएफ – Amro

+2

@ एमेरो: एक अंतर्निहित अग्रणी "1" बिट है, जब तक कि संख्या denormalized नहीं है। तो जिम के अधिकार, ज्यादातर मामलों में (और निश्चित रूप से इन संख्याओं के लिए)। –

+0

धन्यवाद। मेरे पास अभी भी कंप्यूटर में संख्या प्रतिनिधित्व को समझने के तरीके हैं। – ZuluForce

6

"फ़्लोटिंग" बिंदु का अर्थ केवल यही है - परिशुद्धता संख्या के पैमाने के सापेक्ष है।

आपके द्वारा दिए गए विशिष्ट उदाहरण में, 1.22e-45 अकेले प्रदर्शित किया जा सकता है क्योंकि एक्सपोनेंट को 10^-45, या लगभग 2^-150 का प्रतिनिधित्व करने के लिए समायोजित किया जा सकता है।

दूसरी ओर, स्केल 2^0 (यानी, 1) के साथ बाइनरी में 1.0 का प्रतिनिधित्व किया जाता है।

इन दो मानों को जोड़ने के लिए, आपको अपने दशमलव बिंदु (एर ... बाइनरी पॉइंट्स) को संरेखित करने की आवश्यकता है, जिसका अर्थ है कि 1.22e-45 की सभी परिशुद्धता 150-विषम बिट्स को दाईं ओर स्थानांतरित कर दी गई है।

बेशक, आईईईई डबल परिशुद्धता फ्लोटिंग पॉइंट मानों में केवल 53 बिट्स मंटिसा (सटीक) हैं, जिसका अर्थ है कि 1.0 के पैमाने पर 1.22e-45 प्रभावी रूप से शून्य है।

+0

बहुत बहुत धन्यवाद !! – ZuluForce

3

अन्य उत्तरों ने जो कहा है, उसे जोड़ने के लिए, आप MATLAB फ़ंक्शन EPS का उपयोग कर सकते हैं ताकि आप जिस परिशुद्धता समस्या को चला रहे हैं उसे कल्पना कर सकें। किसी दिए गए डबल परिशुद्धता फ्लोटिंग प्वाइंट संख्या के लिए, समारोह EPS आप अगले सबसे बड़ा प्रदर्शनीय चल बिन्दु संख्या के लिए इसे से दूरी बता देगा:

>> a = 1.22e-45; 
>> b = 1; 
>> eps(b) 

ans = 

    2.2204e-016 

ध्यान दें कि है 1 से बड़ा अगले फ्लोटिंग बिंदु संख्या है कि 1.00000000000000022204 ..., और a का मान भी दो संख्याओं के बीच आधा दूरी तक नहीं आता है। इसलिए a+b रहने 1.

संयोग से समाप्त होता है, तो आप भी क्यों a गैर शून्य भले ही यह फ़्लोटिंग-बिंदु मान समारोह REALMIN का उपयोग कर छोटी से छोटी प्रदर्शनीय डबल परिशुद्धता को देखकर इतना छोटा है माना जाता है देख सकते हैं:

>> realmin 

ans = 

    2.2251e-308 %# MUCH smaller than a!