「カーマックの逆平方根」アルゴリズムを実装すると、結果が偏っているように見えることに気付きました。次のコードは、より良い結果をもたらすようです。
float InvSqrtF(float x)
{
// Initial approximation by Greg Walsh.
int i = * ( int* ) &x;
i = 0x5f3759df - ( i >> 1 );
float y = * ( float * ) &i;
// Two iterations of Newton-Raphson's method to refine the initial estimate.
x *= 0.5f;
float f = 1.5F;
y = y * ( f - ( x * y * y ) );
y = y * ( f - ( x * y * y ) );
* ( int * )(&y) += 0x13; // More magic.
return y;
}
主な違いは、最後から 2 番目の「more magic」行にあります。最初の結果はかなり一定の係数で低すぎたため、1 つの命令だけで 19 * 2^(exponent(y)-bias) が結果に追加されます。約 3 ビット余分に得られるようですが、何か見落としがありますか?