以下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吗?是否更准确的偏差值?
答案 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
函数。