Umasoft
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
FP8.h
1 /* homegrown floating point: 3 bits exponent, 8 bit mantissa
2  maps
3  0.. 31 -> 0.. 31
4  32.. 63 -> 32.. 63
5  64.. 95 -> 64.. 126, step 2
6  96..127 -> 128.. 252, step 4
7  128..159 -> 256.. 504, step 8
8  160..191 -> 512..1008, step 16
9  192..223 -> 1024..2016, step 32
10  224..255 -> 2048..4032, step 64
11 */
12 
13 #ifdef _MSC_VER
14 # define INLINE __forceinline
15 #else
16 # define INLINE inline
17 #endif
18 
19 INLINE uchar EncodeFP8( unsigned short nVal )
20 {
21  if( nVal < 64 ) return (uchar) nVal;
22  if( nVal < 128 ) return (0x40 | (nVal- 64)/2);
23  if( nVal < 256 ) return (0x60 | (nVal- 128)/4);
24  if( nVal < 512 ) return (0x80 | (nVal- 256)/8);
25  if( nVal < 1024 ) return (0xa0 | (nVal- 512)/16);
26  if( nVal < 2048 ) return (0xc0 | (nVal-1024)/32);
27  if( nVal < 4096 ) return (0xe0 | (nVal-2048)/64);
28  return 0xff;
29 }
30 
31 INLINE unsigned short DecodeFP8( uchar nVal )
32 {
33  int a = nVal >> 5;
34  int b = nVal & 31;
35 
36  if( a < 2 ) {
37  return b;
38  } else {
39  return (b + 32) << (a-1);
40  }
41 }
42 
43