क्या कोई मुझे बता सकता है कि मैं 32-बिट फ़्लोटिंग पॉइंट मान को 16-बिट फ़्लोटिंग पॉइंट मान में कैसे परिवर्तित करता हूं?Float32 से Float16
(रों = चिह्न ई = प्रतिपादक और मीटर = अपूर्णांश)
32-बिट नाव 1s7e24m
और 16-बिट नाव है 1s5e10m
है तो यह कर के रूप में सरल है?
int fltInt32;
short fltInt16;
memcpy(&fltInt32, &flt, sizeof(float));
fltInt16 = (fltInt32 & 0x00FFFFFF) >> 14;
fltInt16 |= ((fltInt32 & 0x7f000000) >> 26) << 10;
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);
मुझे लगता है कि यह इतना आसान नहीं है ... तो क्या कोई मुझे बता सकता है कि आपको क्या करना है?
संपादित करें: मैं देखता हूं कि मुझे अपना एक्सपोनेंट शिफ्ट गलत मिला है ... तो क्या यह बेहतर होगा?
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x7c000000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;
मुझे उम्मीद है कि यह सही है। क्षमा करें अगर मुझे कुछ स्पष्ट याद आ रही है जो कहा गया है। शुक्रवार की रात को लगभग आधी रात ... इसलिए मैं "पूरी तरह से" शांत नहीं हूं;)
संपादित करें 2: ओउप्स। इसे फिर से खराब कर दिया। मैं शीर्ष 3 बिट्स को कम नहीं करना चाहता हूं! तो कैसे इस बारे में:
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x0f800000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;
अंतिम कोड होना चाहिए:
fltInt16 = ((fltInt32 & 0x7fffffff) >> 13) - (0x38000000 >> 13);
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);
मुझे लगता है कि यह पहले से ही पूछा गया था (और उत्तर दिया गया): http://stackoverflow.com/questions/1659440/32-bit-to-16-bit-floating-point-conversion – humbagumba
यह इतना आसान हो सकता है, लेकिन जब तक फ्लोट 32 अपने सभी "परिशुद्धता" का उपयोग नहीं करता है तब तक आप सटीकता को ढीला करते हैं ... मूल रूप से, आपको एक्सपी के बिट्स का 5/7 मिलता है (आप निश्चित रूप से सबसे महत्वपूर्ण हैं), और मंटिसा के 10/24; इन अनुपातों का कहना है कि रूपांतरण में आप कितना खो सकते हैं। ठीक उसी तरह होता है यदि आप 16 बिट्स पूर्णांक में 32 बिट पूर्णांक फिट करना चाहते हैं ... rappresentable संख्याओं की सीमा छोटी है; मंथिसा "काटने" को "परिशुद्धता" कम कर देता है, और एक्सपोनेंट भी सीमा को सीमित करता है: 5 हस्ताक्षरित बिट्स -6/+ 63 के खिलाफ -16 से +15 देते हैं (यदि मैंने यह सही किया ...: डी देर हो चुकी है) – ShinTakezou
@ShinTakezou: निश्चित रूप से 16-बिट डेटा खोना संभव नहीं है और सटीकता खोना नहीं है ?? Float16 बहुत कम सटीक है और इस प्रकार स्वचालित रूप से कम परिशुद्धता है ... या मैं आपको गलत समझ रहा हूँ? – Goz