我正在尝试为一个定点数字实现Fast Inverse Square Root,但是我没有取得任何进展。
我尝试遵循与本文完全相同的原则,只不过我使用的是x = M * 2 ^ -16
格式,而不是浮点格式x = (-1) ^ s * (1 + M) * 2 ^ (E-127)
,这是一个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的值是多少,我都可以执行移位操作来校正最终结果的指数值,从而在一个固定点上获得正确的结果。
我哪里错了?
发布于 2021-04-09 00:22:32
这是不可能的。
快速的反向sqrt是由于浮点表示,它已经将数字拆分为2的幂(指数)和重要的。
这是可以做到的。
使用与浮点数相同的技巧,可以将定点转换为2^exp * x。给定uint32_t a
,uint8_t exp = bias- builtin_count_leading_zeros(a)
;uint32_t b = a << exp
,并仔细选择常量(和a
的域),这样就不会有下溢或溢出。
因此,您实际上将拥有一个定制的浮点表示,它是为这个特定目的量身定做的,它至少省略了符号位,并具有指数的最佳可能位数,也可能是8。
https://stackoverflow.com/questions/67007886
复制相似问题