求半精度浮点数2^x与log2(x)的FP输入输出近似实现方案
半精度浮点数log2(x)与2^x的输入输出全FP近似实现
基于原定点/跨类型近似公式,改造为输入输出均为半精度FP(binary16)的版本,全部采用位操作、移位和简单算术运算:
1. log2(x):输入半精度FP,输出半精度FP
核心逻辑
半精度FP格式:x = (-1)^S * 2^(E-15) * (1.M),其中S是符号位(1位),E是指数位(5位),M是尾数位(10位)。
原近似公式为log2(X) = (E-15) + (M>>10) + 2^-5,由于M>>10结果恒为0(10位尾数位右移10位无有效位),因此近似值为(E-15) + 0.03125,将该值打包为半精度FP即可。
具体实现步骤(位运算+算术)
- 提取输入x的符号位、指数位:
S_in = (x >> 15) & 0x1 // 获取符号位 E_in = (x >> 10) & 0x1F // 获取5位指数位 - 计算log2近似值的整数部分
k = E_in - 15,小数部分固定为0.03125(即2^-5) - 将近似值打包为半精度FP:
- 符号位
S_out = S_in(仅对正输入有效,负输入可返回NaN或按需处理) - 指数位
E_out = k + 15(还原指数偏移量) - 尾数位
M_out = 0x20(0.03125 × 2^10 = 32,对应二进制100000) - 最终结果:
result = (S_out << 15) | (E_out << 10) | M_out
- 符号位
2. 2^x:输入半精度FP,输出半精度FP
核心逻辑
原近似公式为2^X = (X+15) << 10(X为整数),改造时先将输入FP近似为整数X,再复用原公式逻辑生成输出FP。
具体实现步骤(位运算+算术)
- 提取输入x的指数位、尾数位:
E_in = (x >> 10) & 0x1F // 获取5位指数位 M_in = x & 0x3FF // 获取10位尾数位 - 将输入FP近似为整数X:取指数对应的值加上尾数最高位(实现四舍五入近似)
k = E_in - 15 // 输入x的指数部分对应的整数 round_bit = (M_in >> 9) & 0x1 // 尾数最高位,用于四舍五入 X = k + round_bit - 复用原公式生成输出FP:
- 符号位
S_out = 0(2^x恒为正) - 指数位
E_out = X + 15(还原指数偏移量) - 尾数位
M_out = 0(对应2^X的尾数为1.0,存储时尾数位全0) - 最终结果:
result = (S_out << 15) | (E_out << 10) | M_out
- 符号位
可选优化(保留小数贡献)
若需提升精度,可基于泰勒近似2^f ≈ 1+f(f为输入x的小数部分,即f = M_in / 2^10),此时输出FP的尾数位直接复用输入的尾数位M_in,指数位为E_in,即result = (0 <<15) | (E_in <<10) | M_in,该实现更简单且精度更高。
内容的提问来源于stack exchange,提问作者auzifriend
相关产品推荐
相关产品推荐

