我正在尝试实现快速反平方根算法,但对于固定点数却一无所获。
我的实现原理与文章中完全相同,只是将数字以浮点格式 x = (-1) ^ s * (1 + M) * 2 ^ (E-127)
改为以32位固定点数格式 x = M * 2 ^ -16
,具有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 的值是多少,我都可以进行移位操作来纠正最终结果的指数值,从而在定点处获得正确的结果。
我错在哪里?