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

时间:2015-06-26 20:30:11

标签: 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;
}

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

2 个答案:

答案 0 :(得分:9)

在您关联的项目中,它们包含Mathematica notebook及其算法的解释,其中包含“神秘”-126.94269值。
如果您需要观看者,可以免费从Mathematica website获取一个。

编辑:由于我感觉很慷慨,所以这是相关部分in screenshot form

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

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

答案 1 :(得分:-4)

嗯,不,126.94269504不是“更准确”的偏差值。这段代码做的非常非常奇怪;我很惊讶它的工作原理。它需要一个浮点数就好像它们是一个int(根据我的经验通常会给你一个完全垃圾值,但可能没有),然后获取“垃圾”int值并将其转换回浮点数,然后做一些数学就可以了。正如他们所说,这是一种快速且近似的做事方式,在这种情况下,采用base-2日志。它根本不应该工作,但127和126.94269504之间的区别显然只是几个愚蠢的软糖因素之一,旨在从应该是无意义的代码中挽救一些含义。 (一种“两个几乎是错误使得几乎是正确的”的东西。)

如果你想精确地提取浮点数的尾数和指数(虽然它既不会那么快也不会近似),通常的做法是使用frexpf函数。