除法作为乘法和 LUT ? / 快速浮点数除法倒数

2024-03-11

是否可以在表格中进行浮点除法的倒数 查找表(例如 1/f -> 1*inv[f] )?怎么办呢? 我认为一些掩模和移位应该应用到浮动以使 它是索引的一种形式吗?究竟会怎样呢?


您可以像这样猜测一个近似的逆:

int x = bit_cast<int>(f);
x = 0x7EEEEEEE - x;
float inv = bit_cast<float>(x);

在我的测试中,0x7EF19D07 稍好一些(测试时包含 2 个 Newton-Raphson 改进的效果)。

然后您可以使用 Newton-Raphson 进行改进:

inv = inv * (2 - inv * f);

尽可能频繁地迭代。 2 或 3 次迭代可以得到很好的结果。

更好的初始近似值

为了最小化相对误差:

  • 0x7EF311C2(未经细化)
  • 0x7EF311C3(1 细化)
  • 0x7EF312AC(2 项改进)
  • 0x7EEEEBB3(3 项改进)

为了最小化 1 和 2 之间输入的绝对误差(它们在该范围之外工作得足够好,但它们可能不是最好的):

  • 0x7EF504F3(未经细化)
  • 0x7EF40D2F(1 细化)
  • 0x7EF39252(2 项改进)

对于三个细化步骤,初始近似几乎不影响最大相对误差。 0x7EEEEEEE 效果很好,我找不到更好的了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

除法作为乘法和 LUT ? / 快速浮点数除法倒数 的相关文章

随机推荐