Birisi bana 32 bit kayan nokta değerini 16 bit kayan nokta değerine nasıl dönüştürdüğümü açıklayabilir mi?Float32 to Float16
(s = işareti e = üs ve m = mantis)
32 bit şamandıra 1s7e24m
ve 16 bit şamandıra ise O 1s5e10m
olan bu durumu kadar basittir?
int fltInt32;
short fltInt16;
memcpy(&fltInt32, &flt, sizeof(float));
fltInt16 = (fltInt32 & 0x00FFFFFF) >> 14;
fltInt16 |= ((fltInt32 & 0x7f000000) >> 26) << 10;
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);
Bu kadar basit olmadığımı farz ediyorum ... bu yüzden bana ne yapman gerektiğini söyleyen var mı?
Düzenleme: Görüyorum ki, üçüncü tarafımın hatalı geçişini yaptım ... bu yüzden daha iyi olur mu?
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x7c000000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;
Bunun doğru olduğunu umuyorum. Özür dileyen bir şey eksik olsaydım özür dilerim. Bir Cuma gecesi neredeyse gece yarısı ... bu yüzden "tamamen" ayık değilim;)
Düzenleme 2: Ooops. Yine tetikledi. En alttaki 3 biti kaybetmek istiyorum! Peki bu konuda:
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x0f800000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;
Final kod olmalıdır:
fltInt16 = ((fltInt32 & 0x7fffffff) >> 13) - (0x38000000 >> 13);
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);
Bence bu zaten sorulmuştu (ve cevaplandırıldı): http://stackoverflow.com/questions/1659440/32-bit-to-16-bit-floating-point-conversion – humbagumba
bu kadar basit olabilir, ama float32, tüm "hassas" ı kullanmadığı sürece hassaslığı kaybedersiniz ... temel olarak, 5/7 exp'in (en anlamlı olanları alırsınız) ve mantislerin 10/24'ünü alırsınız; Bu oranlar, dönüşümde ne kadar kaybedebileceğinizi söyler. Tam olarak, 16 bit tamsayıya 32 bit tamsayıya sığdırmak istediğinizde gerçekleşir ... rappresentable sayı aralığı daha küçüktür; mantissa "kesme", "hassas" azaltır ve üssü de aralığı sınırlar: 5 işaretli bit -16 ila +15, -64/+ 63 karşı (eğer doğru yaptıysam ...: D geç olduğunu) – ShinTakezou
@ShinTakezou: Kesinlikle veri 16-bit kaybetmek ve hassas değil kaybetmek mümkün değil mi ?? Float16 çok daha az hassastır ve bu nedenle otomatik olarak daha az hassasiyete sahiptir ... ya da sizi yanlış anlamış mıyım? – Goz