2008-09-11 14 views
32

this question का पालन करने में, ऐसा लगता है कि कुछ संख्याओं को फ्लोटिंग पॉइंट द्वारा बिल्कुल प्रतिनिधित्व नहीं किया जा सकता है, और इसके बजाय अनुमानित हैं।फ्लोटिंग पॉइंट कैसे संग्रहीत किया जाता है? यह कब मायने रखता है?

फ़्लोटिंग पॉइंट नंबर कैसे संग्रहीत किए जाते हैं?

क्या विभिन्न आकारों के लिए एक सामान्य मानक है?

अगर मैं फ़्लोटिंग पॉइंट का उपयोग करता हूं तो मुझे किस तरह के गॉचस देखने की ज़रूरत है?

क्या वे क्रॉस-भाषा संगत हैं (यानी, एक पाइथन प्रोग्राम से एक फ्लोटिंग पॉइंट नंबर को टीसीपी/आईपी पर एक सी प्रोग्राम में भेजने के लिए मुझे क्या रूपांतरण करने की आवश्यकता है)?

-Adam

उत्तर

22

जैसा कि बताया गया है, Wikipedia article on IEEE 754 दिखाता है कि अधिकांश सिस्टम पर फ्लोटिंग पॉइंट नंबर कैसे संग्रहीत किए जाते हैं, यह दिखाने का अच्छा काम करता है।

अब, यहाँ कुछ आम gotchas हैं:

  • सबसे बड़ी है कि आप लगभग कभी समानता (या असमानता) के लिए दो चल बिन्दु संख्या की तुलना करना चाहते। आप इसके बजाय तुलना से अधिक/कम उपयोग करना चाहेंगे।
  • फ़्लोटिंग पॉइंट नंबर पर आप जितना अधिक ऑपरेशन करते हैं, उतनी महत्वपूर्ण गोलिंग त्रुटियां बन सकती हैं।
  • प्रेसिजन अंश के आकार से सीमित है, इसलिए आप परिमाण के कई आदेशों से अलग संख्याओं को सही ढंग से जोड़ने में सक्षम नहीं हो सकते हैं। (उदाहरण के लिए, आप 1E30 को 1E30 जोड़ने के लिए सक्षम नहीं होगा।)
0

मैं क्या याद एक 32 बिट चल बिन्दु एक वास्तविक संख्या के लिए 24 बिट का उपयोग कर संग्रहीत है, और रहने के 8 बिट 10 की एक शक्ति के रूप में उपयोग किया जाता है, का निर्धारण करने जहां दशमलव बिंदु है।

मैं थोड़ा विषय यद्यपि पर जंग लगी हूँ ...

5

मानक IEEE 754 है।

बेशक, आईईई 754 पर्याप्त नहीं होने पर संख्याओं को स्टोर करने के अन्य साधन हैं। जावा के BigDecimal जैसे पुस्तकालय अधिकांश प्लेटफ़ॉर्म के लिए उपलब्ध हैं और SQL के नंबर प्रकार के लिए अच्छी तरह से मानचित्र हैं। प्रतीकों का उपयोग अपरिमेय संख्याओं के लिए किया जा सकता है, और अनुपात जिन्हें बाइनरी या दशमलव फ़्लोटिंग पॉइंट में सटीक रूप से प्रदर्शित नहीं किया जा सकता है, अनुपात के रूप में संग्रहीत किया जा सकता है।

2

यह article "आईईईई मानक 754 फ़्लोटिंग प्वाइंट नंबर" नामक सहायक हो सकता है। ईमानदार होने के लिए मुझे पूरा यकीन नहीं है कि मैं आपका प्रश्न समझ रहा हूं इसलिए मुझे यकीन नहीं है कि यह सहायक होगा लेकिन मुझे उम्मीद है कि यह होगा।

3

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

सी ++ में, अंगूठे का एक अच्छा नियम यह सोचना है कि एक फ्लोट आपको परिशुद्धता के 7 अंक देता है, जबकि एक डबल आपको 15 देता है। इसके अलावा, यदि आप समानता के परीक्षण के बारे में जानने में रुचि रखते हैं, तो आप देख सकते हैं this प्रश्न धागा।

5

आपके प्रश्न के दूसरे भाग के रूप में, जब तक कि आपके प्रोजेक्ट के लिए प्रदर्शन और दक्षता महत्वपूर्ण न हो, तो मेरा सुझाव है कि आप फ्लोटिंग पॉइंट डेटा को टीसीपी/आईपी पर एक स्ट्रिंग के रूप में स्थानांतरित करें। यह आपको बाइट संरेखण जैसे मुद्दों से बचने देता है और डीबगिंग को कम करेगा।

1

यदि आप वास्तव में फ़्लोटिंग पॉइंट राउंडिंग त्रुटियों के बारे में चिंतित हैं, तो अधिकांश भाषाएं डेटा प्रकार प्रदान करती हैं जिनमें फ़्लोटिंग पॉइंट त्रुटियां नहीं होती हैं। एसक्यूएल सर्वर में दशमलव और मनी डेटा प्रकार हैं। .NET में दशमलव डेटा प्रकार है। वे जावा में बिगडिसीमल जैसी अनंत परिशुद्धता नहीं हैं, लेकिन वे दशमलव अंकों की संख्या के लिए सटीक हैं जिनके लिए उन्हें परिभाषित किया गया है। इसलिए आपको $ 4 के रूप में टाइप किए गए डॉलर मूल्य के बारे में चिंता करने की ज़रूरत नहीं है।58 4.579 99 99 99 99 99 7

3

में इस सवाल का पालन, यह प्रतीत होता है कि कुछ संख्या चल बिल्कुल बिंदु का प्रतिनिधित्व करती नहीं किया जा सकता, और इसके बजाय अनुमानित हैं।

सही।

फ़्लोटिंग पॉइंट नंबर कैसे संग्रहीत किए जाते हैं? क्या विभिन्न आकारों के लिए एक सामान्य मानक है?

जैसा कि अन्य पोस्टर पहले से ही उल्लेख किए गए हैं, लगभग पूरी तरह से IEEE754 और इसके उत्तराधिकारी IEEE754R। गुगलिंग यह आपको थोड़ा पैटर्न और उनके स्पष्टीकरण के साथ हजारों स्पष्टीकरण देता है। यदि आपको अभी भी इसे प्राप्त करने में समस्याएं हैं, तो अभी भी दो सामान्य एफपी प्रारूप हैं: आईबीएम और डीईसी-वैक्स। कुछ गूढ़ मशीनों और कंपाइलर्स (ब्लिट्जबासिक, टर्बोपास्कल) के लिए कुछ विषम प्रारूप हैं।

अगर मैं फ़्लोटिंग पॉइंट का उपयोग करता हूं तो मुझे किस तरह के गॉचस देखने की ज़रूरत है? क्या वे क्रॉस-लैंग्वेज संगत हैं (यानी, से निपटने के लिए मुझे किन रूपांतरणों की आवश्यकता है, एक पाइथन प्रोग्राम से एक फ्लोटिंग पॉइंट नंबर टीसीपी/आईपी पर एक सी प्रोग्राम में भेजें)?

व्यावहारिक रूप से कोई नहीं, वे क्रॉस-भाषा संगत हैं।

बहुत ही दुर्लभ घटित quirks:

  • IEEE754 sNaNs (NANS संकेत) और qNaNs (शांत NANS) को परिभाषित करता है। पूर्व लोग एक जाल का कारण बनते हैं जो प्रोसेसर को लोड होने पर हैंडलर रूटीन को कॉल करने के लिए मजबूर करता है। उत्तरार्द्ध ऐसा नहीं करते हैं। चूंकि भाषा डिजाइनरों ने इस संभावना से नफरत की है कि एसएनएएनएस अपने वर्कफ़्लो को बाधित करते हैं और उन्हें समर्थन देते हैं हैंडलर रूटीन के लिए समर्थन लागू करते हैं, एसएनएएन लगभग हमेशा चुपचाप qNaNs में परिवर्तित हो जाते हैं। तो 1: 1 कच्चे रूपांतरण पर भरोसा न करें। लेकिन फिर: यह बहुत दुर्लभ है और केवल तब होता है जब NaNs मौजूद हैं।

  • यदि आप अलग-अलग कंप्यूटरों के बीच फ़ाइलों को साझा करते हैं तो आपको अंतराल के साथ समस्याएं हो सकती हैं (बाइट गलत क्रम में हैं)। यह आसानी से पता लगाने योग्य है क्योंकि आप संख्याओं के लिए NaNs प्राप्त कर रहे हैं।

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