为什么在这个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函数。