「カーマックの逆平方根」アルゴリズムを実装すると、結果が偏っているように見えることに気付きました。次のコードは、より良い結果をもたらすようです。
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 ビット余分に得られるようですが、何か見落としがありますか?