c++ - 除法作为乘法和 LUT ?/fast float 除法倒数

标签 c++ c optimization fpu

是否可以在表格中做 float 除法的倒数 查找表(例如 1/f -> 1*inv[f] )?怎么做到的? 我认为一些掩码和移位应该被应用到 float 来制作 它是一种索引形式?具体会怎样?

最佳答案

你可以猜出这样的近似逆:

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 效果很好,我找不到更好的了。

关于c++ - 除法作为乘法和 LUT ?/fast float 除法倒数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12227126/

相关文章:

c++ - 为什么 valgrind(helgrind) 在我的线程结构上调用虚拟函数时生成 "Possible Data Races"

c++ - 将二维数组传递给函数而不指定第二维时出现编译器错误

c++ - 无法打开文件 'SOIL.libkernel32.lib'

c - 使用位运算符将十进制转换为二进制

c - 我是结构新手,我不知道是什么导致了错误 : "duplicate identifiers"

c++ - 如何在字符串列表中查找匹配的字符串

c - 如何找到缓冲区溢出和内存损坏的地方?

Python,回顾并加速A*算法

c# - 优化 XNA 上的颜色操作

c++ - 优化 std::visit 可能吗?