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



下面的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;
}

这里的一些专家能解释一下为什么上面代码中使用的指数偏差是126.94269504而不是127吗?它的偏差值更准确吗?

在您链接的项目中,他们包含了一个Mathematica笔记本,其中包含了对其算法的解释,其中包括"神秘"的-126.94269
如果你需要一个查看器,你可以从Mathematica网站免费获得。

编辑:由于我感觉很慷慨,下面是截图形式的相关部分。

简单地说,他们解释说,这个值"更简单、更快、更不准确"
他们不是用-126.94269代替-127,而是用它代替以下计算的结果(为简洁起见,值四舍五入):

-124.2255 - 1.498 * mx - (1.72588 / (0.35201 + mx))

不,126.94269504不是一个"更准确"的偏差值。这个代码正在做一些非常非常奇怪的事情;我很惊讶它能起作用。它把浮点的比特当作int(根据我的经验,这通常会给你一个完全垃圾的值,但可能不是),然后取这个"垃圾"int值,将其转换回浮点,然后对它进行一些数学运算。正如他们所说,这是一种快速而近似的方法,在这种情况下,取base-2日志。它根本不应该起作用,但127和126.94269504之间的差异显然只是几个愚蠢的捏造因素之一,这些因素旨在从本应毫无意义的代码中挽救一些意义。(有点像"两个几乎是错的东西构成一个几乎是对的"。)

如果您想准确地提取浮点的尾数和指数(尽管这既不快也不近似),通常的方法是使用frexpf函数。

最新更新