首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用定点代替浮点的快速平方根反比

使用定点代替浮点的快速平方根反比
EN

Stack Overflow用户
提问于 2021-04-09 00:10:22
回答 1查看 264关注 0票数 4

我正在尝试为一个定点数字实现Fast Inverse Square Root,但是我没有取得任何进展。

我尝试遵循与本文完全相同的原则,只不过我使用的是x = M * 2 ^ -16格式,而不是浮点格式x = (-1) ^ s * (1 + M) * 2 ^ (E-127),这是一个32位定点数字,具有16个十进制位和16个小数位。

问题是我找不到“魔法常量”的值。根据我的计算,它不存在,但我不是一个数学家,我认为我做的一切都是错的。

为了求解Y=1/ sqrt (x),我使用了以下推理(我不知道它是否正确)。

在原始代码中,牛顿近似的Y0由下式给出:

代码语言:javascript
运行
复制
i = 0x5f3759df - (i >> 1);

这意味着我们将得到一个浮点数,其结果是:

代码语言:javascript
运行
复制
y0 = (1 + R2 - M / 2) * 2 ^ (R1 - E / 2);

这是因为操作>>将指数和尾数除以2,然后我们将这些数字作为整数进行减法。

按照本文中的步骤,我将x的格式设置为:

代码语言:javascript
运行
复制
x = M * 2 ^ -16

为了执行相同的逻辑,我尝试为以下对象定义Y0:

代码语言:javascript
运行
复制
Y0 = (R2 - M / 2) * 2 ^ (R1 - (-16/2));

我正在尝试寻找一个数字,它可以最小化以下所给出的误差:

代码语言:javascript
运行
复制
error = (Y - Y0) / Y

无论R1的值是多少,我都可以执行移位操作来校正最终结果的指数值,从而在一个固定点上获得正确的结果。

我哪里错了?

EN

回答 1

Stack Overflow用户

发布于 2021-04-09 00:22:32

这是不可能的。

快速的反向sqrt是由于浮点表示,它已经将数字拆分为2的幂(指数)和重要的。

这是可以做到的。

使用与浮点数相同的技巧,可以将定点转换为2^exp * x。给定uint32_t auint8_t exp = bias- builtin_count_leading_zeros(a)uint32_t b = a << exp,并仔细选择常量(和a的域),这样就不会有下溢或溢出。

因此,您实际上将拥有一个定制的浮点表示,它是为这个特定目的量身定做的,它至少省略了符号位,并具有指数的最佳可能位数,也可能是8。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67007886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档