2013-06-21 11 views
5

को प्रभावित कर सकते हैं, d1.d2d3d4d5 ... dnExxx के दशमलव प्रस्तुतियों पर विचार करें जहां xxx एक मनमानी एक्सपोनेंट है और दोनों d1 और dn nonzero हैं।दशमलव अंकों की अधिकतम संख्या जो एक डबल

अधिकतम एन ज्ञात है कि दशमलव प्रतिनिधित्व d1.d2d3d4d5 ... dnExxx ऐसा है कि अंतराल (d1.d2d3d4d5 ... dnExxx, d1.d2d3d4d5 ... ((dn) +1) Exxx) में एक आईईईई 754 डबल है?

n कम से कम 17 होना चाहिए सवाल यह है कि 17

यह संख्या ऊपर कितना n अंकों की संख्या के साथ कुछ है कि यह एक दशमलव करने वाली डबल रूपांतरण ऐसे में विचार करने के लिए पर्याप्त है strtod() के रूप में। मैंने David M. Gay's implementation के लिए स्रोत कोड देखा जो वहां एक उत्तर खोजने की उम्मीद कर रहा था। "40" के लिए एक संकेत है लेकिन यह अस्पष्ट है कि यह ध्वनि गणितीय परिणाम या केवल सांख्यिकीय रूप से सुरक्षित बाध्यता का परिणाम है। इसके अलावा "छंटनी" के बारे में टिप्पणी यह ​​0.5000000000000000000000000000000000000000000000000001 जैसी ध्वनि को राउंड-अप मोड में 0.5 में परिवर्तित किया जा सकता है।

Musl's implementation लगभग 125 * 9 अंक पढ़ने लगता है, जो बहुत कुछ है।

if (c!='0') x[KMAX-4] |= 1; 

अंत में, कैसे जवाब परिवर्तन जब प्रतिस्थापन है "शामिल एक आईईईई 754 डबल" "लगातार दो आईईईई 754 डबल्स के मध्य होता है" के साथ: तो फिर यह "स्टिकी" मोड पर स्विच करता है?

+1

मुझे यकीन नहीं है कि मैं इस बिंदु को समझता हूं। उदाहरण के लिए, '2^(- 1074)' में 751 महत्वपूर्ण दशमलव अंक हैं, इस प्रकार एक दशमलव प्रतिनिधित्व 'd1.d2 है ...डी 750 ई -324 'हालत को संतुष्ट करता है (आप लंबे समय तक प्राप्त कर सकते हैं, लेकिन ज्यादा नहीं)। लेकिन निकटतम आईईईई 754 'डबल' निर्धारित करने के लिए आपको केवल इन अंकों के मुट्ठी भर की आवश्यकता है। –

+1

@ डैनियल फिशर लेकिन 2^(- 1074) अनन्य अंतराल में नहीं है (d1.d2 ... d750E-324, d1.d2 ... (d750 + 1) ई -324)। वैसे (डी 750 + 1) डी 750 एक "9" है, तो नोटेशन का मामूली दुरुपयोग है। यह दुरुपयोग मेरे प्रश्न में भी है लेकिन वैकल्पिक (d1.d2 ... d750E-324, (d1.d2 ... d750E-324 + 1E-1074)) भ्रमित भी है। मुझे एक्सपोनेंट गलत भी मिल सकता है। –

+1

मैंने सटीक प्रतिनिधित्व के मुकाबले एक अंक कम किया है, इसलिए यह खुले अंतराल में है। –

उत्तर

6

आप अजीब significand के साथ एक सामान्य से कम संख्या है, कि, 2^(-1074) का एक अजीब कई है, तो आप एक नंबर जिसका आखिरी अशून्य अंकों दशमलव प्रतिनिधित्व 1074 वें दशमलव बिंदु के बाद है। फिर आपके पास दशमलव बिंदु का पालन करने के लगभग 300 शून्य हैं, इसलिए संख्या में लगभग 750-770 महत्वपूर्ण दशमलव अंक हैं। सबसे छोटा सकारात्मक सबनोर्मल, 2^(-1074) में 751 महत्वपूर्ण अंक हैं, और सबसे बड़ा सकारात्मक सबनोर्मल, (2^52-1)*2^(-1074) में 767 महत्वपूर्ण अंक हैं (मुझे लगता है कि यह अधिकतम है)।

तो वहाँ कम से कम एक दशमलव अंक के अनुक्रम d1, ..., d766 एक IEEE754 double खुला अंतराल

(d1.d2...d766E-308, d1.d2...(d766 + 1)E-308) 

जवाब ज्यादा परिवर्तन नहीं करता है, तो हम इस पर विचार में है ऐसी है कि वहाँ है "लगातार दो IEEE754 के मध्य होता है double s ", चूंकि subnormal double एस में लगभग सभी दशमलव दशमलव अंकों की समान मात्रा है, और लगातार दो के मध्य बिंदु भी हैं।

सबसे खराब स्थिति में, पूरे अंकों अनुक्रम सेवन किया जाना चाहिए (मनमाने ढंग से कई शून्य से "0.5000000...0001" पर विचार से पहले अंतिम 1 कि निर्धारित करता है कि परिणाम 0.5 + 0.5^53 होगा और नहीं 0.5 जब शून्य या ऊपर से दूर गोलाई)।

हालांकि, वहाँ केवल

floor(DBL_MANT_DIG * log 2/log 10) + 2 = 17 

महत्वपूर्ण दशमलव अलग double मूल्यों के बीच अंतर करने के लिए आवश्यक अंक, इसलिए एक अपेक्षाकृत आसान कर रहे हैं, हालांकि शायद बहुत ही कुशल नहीं, पार्स की विधि कम से कम पहले पार्स करने के लिए होगा (17) निकटतम double के लिए अंक (और एक्सपोनेंट), और उस double मान (और उसके पड़ोसी) के सटीक प्रतिनिधित्व के साथ इनपुट स्ट्रिंग की तुलना करें।

+0

आपके उत्तर के लिए धन्यवाद। जिस नंबर पर मैं निर्धारित करने की कोशिश कर रहा था वह "चिपचिपा" मोड पर जाने से पहले सामान्य मोड में पार्स किए जाने वाले दशमलव अंकों की संख्या थी। मनमाने ढंग से लंबे दशमलव अनुक्रम जैसे कि 0.50000 ... 00001 बनाया जा सकता है लेकिन थोड़ी देर के बाद यह केवल मायने रखता है कि क्या शून्य शून्य अंक रहता है या नहीं, और जिस प्रश्न का मैं जवाब देना चाहता था वह था "कितने अंक, ठीक है?"। मुझे अभी भी निर्देशित और निकटतम मोड के बीच अंतर पर विचार करने की आवश्यकता है, लेकिन आपने मुझे बहुत मदद की है। –

+1

मुझे नहीं लगता कि मैं आपका तर्क खरीदता हूं कि 17 अंक पर्याप्त हैं। 1 + 45/2^53 और 1 + 46/2^53 देखें। '1.00000000000000505' राउंड डाउन लेकिन' 1.000000000000005059' राउंड अप। अंतर 18 वें दशमलव स्थान पर है। – tmyklebu

+1

@tmyklebu मूल्य '1 + 45/2^53' के साथ कोई IEEE754' डबल' नहीं है। इसका प्रतिनिधित्व करने के लिए 54 बिट परिशुद्धता की आवश्यकता होती है। '1 + 46/2^53' के बाद अगला छोटा '1 + 44/2^53 = 1.000000000000004884981308350688777863979339599609375' है। –

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