You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求半精度浮点数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:00:57