是否可以在表格中做 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/