【发布时间】:2021-07-04 13:17:06
【问题描述】:
我正在尝试为定点数实现Fast Inverse Square Root,但我没有得到任何结果。
我试图遵循与文章完全相同的原则,除了不是以浮点格式x = (-1) ^ s * (1 + M) * 2 ^ (E-127) 写入数字,我使用的是x = M * 2 ^ -16 格式,这是一个 32 位定点数16 个小数位和 16 个小数位。
问题是我找不到“魔法常数”的值。根据我的计算,它不存在,但我不是数学家,我认为我做的一切都错了。
为了解决Y = 1 / sqrt(x),我使用了以下推理(不知道是否正确)。
在原始代码中,牛顿的近似值 Y0 由下式给出:
i = 0x5f3759df - (i >> 1);
这意味着我们将因此得到一个浮点数:
y0 = (1 + R2 - M / 2) * 2 ^ (R1 - E / 2);
这是因为 >> 运算将指数和尾数除以 2,然后我们将数字减为整数。
按照文章中显示的步骤,我将x的格式设置为:
x = M * 2 ^ -16
为了尝试执行相同的逻辑,我尝试将 Y0 定义为:
Y0 = (R2 - M / 2) * 2 ^ (R1 - (-16/2));
我正在尝试找到一个数字,它可以最大程度地减少以下给出的错误:
error = (Y - Y0) / Y
无论 R1 的值如何,我都可以进行移位运算来校正最终结果的指数值,从而在固定点获得正确的结果。
我哪里错了?
【问题讨论】:
-
如果是数学问题,也许这个问题属于数学交换。
-
@ChristianGibbons:当然不是; “Fast Inverse Square Root”使用 IEEE-754 binary32 浮点表示的细节以及浮点运算的特性,而使算法适应定点运算的任务是一个软件工程问题。
标签: c++ c math approximation fixed-point