是否可以在表格中进行浮点除法的倒数
查找表(例如 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(使用前将#替换为@)