16位浮点数

来源:互联网 发布:天猫推荐算法大赛 编辑:程序博客网 时间:2024/05/17 09:21
地球人都知道现在的dx内部都开始支持16位的浮点了, also known as float16(half)
这种类型本身并不是标准IEEE里的,不同的平台也有不同的实现方法。
就偶这几天hardcore Xenon的程序来看,dx内部的16位float结构如下:
|0100 0010 0010 0100|
 s
   |exp|
           | mantissa  |
假设0100 0010 0010 0100是一个16位的浮点数,那么从高位的第一位仍然是sign位
然后有4位的exp和11位的mantissa。
4位的exp是直接截低4位就ok了
mantissa则是截高11位,这点需要注意,模拟的c/c++ code如下:
u16 tofloat16(float f)
{
u32 *i = (u32 *)&f;
u32 sign = (*i >> 31) & 0x1;
u32 exponent = ((*i >> 23) & 0xff) - 0x7f;
u32 mantissa = (*i) & 0x7fffff;

exponent += 0x7;
u16 ret = ((sign & 0x1) << 15);
ret |= (exponent & 0xf) << 11;
ret |= (mantissa  >> 13) & 0x7ff;
return ret;
}

 

u32 tofloat32(u16 f)
{
u16 *i = (u16 *)&f;
u32 sign = (*i >> 15) & 0x1;
u32 exponent = ((*i >> 11) & 0xf) - 0x7;
u32 mantissa = (*i) & 0x7ff;

exponent += 0x7f;
u32 ret = ((sign & 0x1) << 31);
ret |= (exponent & 0xff) << 23;
ret |= (mantissa << 13) & 0x7fffff;
return ret;

原创粉丝点击