16位有符号整数转类IEEE754自定义浮点格式的代码逻辑与参数咨询
自定义浮点格式代码解析
首先先贴出你提供的代码方便对照:
#include <stdint.h> uint32_t short2fp (int16_t inp) { int x, f, i; if (inp == 0) { return 0; } else if (inp < 0) { i = -inp; x = 191; } else { i = inp; x = 63; } for (f = i; f > 1; f >>= 1) x++; for (f = i; f < 0x8000; f <<= 1); return (x * 0x8000 + f - 0x8000); }
代码执行逻辑梳理
这段代码的作用是将有符号16位整数转换为32位自定义浮点格式,执行流程可以拆解为5步:
- 零值处理:输入为0时直接返回0,对应浮点格式的零值
- 符号与阶码初始化:
- 正数场景:取输入原值为计算基准,阶码初始值设为63(二进制
00111111,最高位为0对应正号) - 负数场景:取输入绝对值为计算基准,阶码初始值设为191(二进制
10111111,最高位为1对应负号)
- 正数场景:取输入原值为计算基准,阶码初始值设为63(二进制
- 阶码计算:通过右移基准值直到结果为1,右移的次数就是指数的增量,叠加到初始阶码上得到最终阶码
- 尾数规整:通过左移基准值直到最高位对齐到bit15(即值≥0x8000),得到带前导1的完整尾数
- 结果拼接:将阶码左移15位(乘以0x8000等价于左移15位),加上去掉前导1的尾数(减0x8000),得到最终32位浮点值
自定义浮点格式结构
该32位浮点格式(bit0为最低位,bit31为最高位)的定义如下:
- bit22:1位符号位,0表示正数,1表示负数
- bit21 ~ bit15:7位阶码,采用偏移码表示,偏移量为63,规格化数对应实际指数范围为-63 ~ +64
- bit14 ~ bit0:15位尾数,采用IEEE 754类似的隐含前导1规则,实际有效数精度为16位(含隐含的1)
- bit31 ~ bit23:共9位保留位,当前代码实现中固定为0,属于预留扩展位
位宽确认
- 有效数(尾数)的存储位宽为15位,加上隐含的前导1,总精度为16位,刚好匹配输入16位整数的精度需求
- 阶码的存储位宽为7位,偏移量63
内容的提问来源于stack exchange,提问作者everchav
相关产品推荐
相关产品推荐

