gpt4 book ai didi

c++ - 使用定点代替浮点的快速平方根求逆

转载 作者:行者123 更新时间:2023-12-03 23:39:14 25 4
gpt4 key购买 nike

我正在尝试实现 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 的值如何,我都可以进行移位操作来校正最终结果的指数值,从而在固定点获得正确的结果。
我哪里错了?

最佳答案

做不到。
快速逆 sqrt 是由于浮点表示,它已经将数字拆分为 2 的幂(指数)和有效值。
可以办到。
使用与浮点相同的技巧,可以将您的定点转换为 2^exp * x。给定 uint32_t a , uint8_t exp = bias- builtin_count_leading_zeros(a) ; uint32_t b = a << exp ,仔细选择常量(和域 a ),不会出现下溢或溢出。
因此,您实际上将拥有一个自定义浮点表示,它是为此特定目的量身定制的,至少省略了符号位,并且指数的位数尽可能多,也可能是 8。

关于c++ - 使用定点代替浮点的快速平方根求逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67007886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com