为什么在这个C代码中使用的IEEE-754指数偏差是126.94269504而不是127?

Ast*_*oth 14 c math floating-point ieee-754

以下C函数来自fastapprox项目.

static inline float 
fasterlog2 (float x)
{
  union { float f; uint32_t i; } vx = { x };
  float y = vx.i;
  y *= 1.1920928955078125e-7f;
  return y - 126.94269504f;
}
Run Code Online (Sandbox Code Playgroud)

有些专家可以解释一下为什么上面代码中使用的指数偏差是126.94269504而不是127?是否更准确的偏差值?

Mr.*_*ama 9

在您链接的项目中,它们包括一个Mathematica笔记本,其中包含对其算法的解释,其中包含"神秘" -126.94269值.
如果您需要观看者,可以从Mathematica网站免费获取一个.

编辑:由于我感觉很慷慨,这是截图表格中的相关部分.

简单地说,他们解释说价值"更简单,更快,更准确".
他们没有-126.94269代替-127使用它们,而是使用它代替以下计算的结果(为简洁而舍入的值):

-124.2255 - 1.498 * mx - (1.72588 / (0.35201 + mx))
Run Code Online (Sandbox Code Playgroud)

  • 啊,果然,作者添加了一个软糖因子,因此输入接近2的幂的结果更准确,但总体准确性会降低. (3认同)
  • 我喜欢它们使用数字1.1920928955078125e-7和126.94269504,分别具有17和11位数的精确度,然后在末尾粘贴`f`以使它们浮动! (2认同)