除法和LUT?/快速浮动分割互惠

gru*_*htr 2 c c++ optimization fpu

是否可以以查找表的形式进行浮点除法的倒数(如1/f - > 1*inv [f])?怎么做?我认为应该将一些and mask和shift应用于float以使其成为索引的一种形式?怎么会这么好?

har*_*old 6

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

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次迭代可以得到很好的结果.

更好的初始近似值

为了最小化相对误差:

  • 0x7EF311C2(无细化)
  • 0x7EF311C3(1个细化)
  • 0x7EF312AC(2个改进)
  • 0x7EEEEBB3(3个改进)

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

  • 0x7EF504F3(无细化)
  • 0x7EF40D2F(1个细化)
  • 0x7EF39252(2个改进)

对于三个细化步骤,初始近似几乎不影响最大相对误差.0x7EEEEEEE运行良好,我找不到更好的东西.