2012-08-13 14 views
7

में एक फ्लोट का प्रतिनिधित्व करना मेरे पास एक ऐसी स्थिति है जिसके लिए float एक char में प्रदर्शित किया जाना आवश्यक है। इस 'मिनीफ्लैट' को प्रस्तुत करने की आवश्यकता 0 से 10e-7 है, इसलिए हम हमेशा यह मान सकते हैं कि संख्या + है, और एक्सपोनेंट -वे अंतरिक्ष को बचाने के लिए।एक बाइट

प्रतिनिधित्व के बारे में मैंने जो विचार किया है, वह एक्सपोनेंट के 3 बिट्स और 5 बिट्स मंटिसा (1 निहित बिट के साथ) है, जो बेस 10 में एक्सपोनेंट है, यानी x = man * 10^exp

मेरी minifloat को एक नाव से बदलने के लिए, मैं frexp उपयोग करते हैं, और कुछ गणित का उपयोग करने के आधार 2 से आधार से 10

में बदलने की योजना है इस एक समझदार दृष्टिकोण है? या यह हासिल करने के बेहतर तरीके हैं?

उत्तर

7

क्या आपको वास्तव में फ़्लोटिंग पॉइंट होने के लिए मूल्य की आवश्यकता है (यानी मूल्यमान के रूप में लगभग स्थिर परिशुद्धता है)? आप इन मूल्यों के साथ क्या करने जा रहे हैं?

एक बिट (8 और 7) के एक अंतर्निहित पैमाने के साथ एक हस्ताक्षरित निश्चित बिंदु संख्या के रूप में 8 बिट्स की व्याख्या करना एक बहुत ही सरल (और अधिक कुशल) विचार होगा। अर्थात्:

float toFloat(uint8_t x) { 
    return x/255.0e7; 
} 

uint8_t fromFloat(float x) { 
    if (x < 0) return 0; 
    if (x > 1e-7) return 255; 
    return 255.0e7 * x; // this truncates; add 0.5 to round instead 
} 
+0

यह काम करता है, धन्यवाद! – Dunnie

4

यदि यह आपके उद्देश्यों की सेवा करता है, तो एक छोटे से स्थान में डेटा रिकॉर्ड करने के लिए स्टोरेज या ट्रांसमिशन प्रारूप के रूप में ऐसे प्रारूप का उपयोग करना उचित है। आपको यह सत्यापित करना चाहिए कि इस प्रारूप से गोल करने वाली त्रुटियां आपकी आवश्यकताओं के लिए बहुत बड़ी नहीं हैं, कि सीमा उपयुक्त है, और cetera।

यह गणना के लिए एक अच्छा प्रारूप नहीं होगा, क्योंकि यह सामान्य हार्डवेयर पर धीमा होगा।

मुझे समझ में नहीं आता कि आप कौन सा आधार रूपांतरण करेंगे। यदि आपके पास float में आईईईई -754 फ्लोटिंग-पॉइंट नंबर है, तो आपके 8-बिट प्रारूप में या उससे कनवर्ट करने का काम महत्त्वपूर्ण पूर्वाग्रह को समायोजित करने और एक्सपोनेंट पूर्वाग्रह को समायोजित करने के लिए महत्व (अंश) को गोल करने में से एक है , साथ ही विशेष मामलों को संभालना (denormals, overflow, NaNs)। इसमें केवल द्विआधारी अंकगणित शामिल होगा, दशमलव नहीं।

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

0

5 अपूर्णांश बिट्स आप कम से कम कदम आकार 0,25

1,00 1,25 1,50 1,75 2,00 .... 8,75 9,00

3 एक्स्पोनेंट्स दे सकते हैं के साथ 9.00 करने के लिए 1.00 से 32 विभिन्न स्थितियों देना आप 8 अलग-अलग स्थितियों 10^0 (जो 1 है) 10^-2 10^-3 10^-4 .... अंत में 10^-7

आपके अंश भाग की त्रुटि 0.25 है। यदि आपकी गणना इस त्रुटि को क्षतिपूर्ति कर सकती है, तो आप इसका उपयोग कर सकते हैं।

3

एक विकल्प 256 फ्लोट (या डबल) की स्थिर सरणी का उपयोग करना है जिसे आप अपने मानदंडों पर चुनेंगे।

फिर रूपांतरण हस्ताक्षरित चार -> फ्लोट/डबल छोटा है ...

रूपांतरण फ्लोट/डबल-> हस्ताक्षरित चार थोड़ा अधिक शामिल है (स्थैतिक सरणी में निकटतम फ्लोट ढूंढें); यह एक बेवकूफ बाइनरी खोज एल्गोरिदम के साथ लगभग 8 तुलनाओं की लागत होगी, लेकिन आप स्थिर सरणी में मानों को चुनने के तरीके के अनुसार बेहतर पा सकते हैं।

बेशक, संचालन देशी फ्लोट/डबल के साथ किया जाएगा।

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