求可保持顺序的IEEE-754 16位浮点数到16位无符号整数同构算法
保持顺序的IEEE-754半精度浮点数与16位无符号整数映射方案
核心原理
IEEE-754半精度(f16)的二进制结构为1位符号位(S)+5位指数位(E)+10位尾数位(M)。要实现顺序保持的无损映射,需针对正负浮点数的二进制特性做针对性处理:
- 正浮点数的原始二进制按无符号整数比较时,大小关系与浮点数本身一致,但需将其整体偏移到负浮点数映射值的上方,确保正负区域的顺序分界正确
- 负浮点数的原始二进制存在"越大的二进制值对应越小的浮点数"的反向关系,因此对所有位取反即可翻转顺序,使其匹配浮点数大小逻辑
映射算法(伪代码)
// f16转u16:输入为f16的原始16位二进制值 uint16_t f16_to_ordered_u16(uint16_t f16_raw) { const uint16_t SIGN_MASK = 0x8000; if (f16_raw & SIGN_MASK) { // 负浮点数:取反所有位,修正顺序 return ~f16_raw; } else { // 正浮点数:翻转符号位,让正数值的u16全部大于负数的映射值 return f16_raw | SIGN_MASK; } } // u16转f16:逆操作,还原原始f16二进制 uint16_t ordered_u16_to_f16(uint16_t u16_val) { const uint16_t SIGN_MASK = 0x8000; if (u16_val & SIGN_MASK) { // 对应原正浮点数:去掉翻转的符号位 return u16_val & ~SIGN_MASK; } else { // 对应原负浮点数:取反还原 return ~u16_val; } }
验证示例
| 浮点数 | f16原始二进制 | 映射后u16值 | 大小关系验证 |
|---|---|---|---|
| -∞ | 0xFC00 | 0x03FF | 最小的u16值,对应最小的浮点数 |
| -2.0 | 0xC000 | 0x3FFF | 小于-1.0的映射值 |
| -1.0 | 0xBC00 | 0x43FF | 小于0.0的映射值 |
| 0.0 | 0x0000 | 0x8000 | 介于正负映射值之间 |
| 1.0 | 0x3C00 | 0xBC00 | 大于0.0的映射值 |
| 2.0 | 0x4000 | 0xC000 | 大于1.0的映射值 |
| +∞ | 0x7C00 | 0xFC00 | 最大的u16值,对应最大的浮点数 |
关键特性
- 顺序保持:映射后的u16大小比较结果与原f16的大小比较结果完全一致
- 无损可逆:所有操作都是位级别的可逆运算,能100%还原f16的原始二进制数据
- 特殊值兼容:正负无穷、正负零都能正确映射;NaN的二进制也会被无损转换,但NaN本身的大小比较无定义,需根据业务场景额外处理
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

