以下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
函数。
需要了解更多c/c++开发分享为什么在这个C代码中使用的IEEE-754指数偏差是126.94269504而不是127?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享为什么在这个C代码中使用的IEEE-754指数偏差是126.94269504而不是127?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980104.html