float16格式解析

659 阅读1分钟

float16格式解析

float16存储格式如下,C++并没有float16类型,所以一般都是使用uint16_t以二进制形式存储

f16.png

二进制数据到float的转换公式如下

(1)sign2exponent15(1+fraction1024)(-1)^{sign} * 2^{exponent - 15} * (1 + \frac{fraction}{1024} )

C++实现如下

float fp16ToFloat(uint16_t val) {
    uint16_t sign = val >> 15;
    uint16_t expo = (0b0111111111111111 & val) >> 10;
    uint16_t frac = 0b0000001111111111 & val;
    float fval = std::pow(-1, sign) * std::pow(2, expo - 15) * (1 + frac / 1024.0);
    return fval;
}