gru*_*htr 2 c c++ optimization fpu
是否可以以查找表的形式进行浮点除法的倒数(如1/f - > 1*inv [f])?怎么做?我认为应该将一些and mask和shift应用于float以使其成为索引的一种形式?怎么会这么好?
您可以像这样猜测近似的逆:
int x = bit_cast<int>(f);
x = 0x7EEEEEEE - x;
float inv = bit_cast<float>(x);
Run Code Online (Sandbox Code Playgroud)
在我的测试中,0x7EF19D07略胜一筹(测试了2 Newton-Raphson改进的效果).
然后,您可以使用Newton-Raphson进行改进:
inv = inv * (2 - inv * f);
Run Code Online (Sandbox Code Playgroud)
根据需要随时迭代.2或3次迭代可以得到很好的结果.
为了最小化相对误差:
最小化1到2之间输入的绝对误差(它们在该范围之外工作得很好,但它们可能不是最好的):
对于三个细化步骤,初始近似几乎不影响最大相对误差.0x7EEEEEEE运行良好,我找不到更好的东西.