わかりました、多くの人が有名な高速逆平方根を知っていると思います (独自の平方根関数の記述と0x5f3759dfの詳細を参照してください) 。
ここにコードがあります
float FastInvSqrt(float x) {
float xhalf = 0.5f * x;
int i = *(int*)&x; // evil floating point bit level hacking
i = 0x5f3759df - (i >> 1); // what the fuck?
x = *(float*)&i;
x = x*(1.5f-(xhalf*x*x)); // one Newton Method iteration
return x;
}
わかりました、魔法0x5f3759df
がどのようなものかをこれ以上知る必要はありません。
私が理解していないのは、なぜx*(1.5f-(xhalf*x*x))
反復なのNewton Method
ですか?
分析してみましたが、わかりません。
r が実数で、x が r の逆平方根であると仮定しましょう。
1 / (x^2) = r
、f(x) = r*(x^2)-1
そしてf'(x) = 2 * r * x
したがって、1回の反復は であるはずx1 = x - f(x)/f'(x) = x / 2 + 1 / (2 * r * x)
ですよね?
どうしてx * (1.5 - ((r / 2) * x * x))
ですか?(ここに置き換えxhalf
たことに注意してr / 2
ください)
編集
OKf(x) = x^2 - 1/r
は別の形式です。計算させてください
f(x) = x^2 - 1 / r
f'(x) = 2 * x
それでx1 = x - (f(x)/f'(x)) = x - (x^2 -(1 / r))/(2*x) = x / 2 + 1 / (2 * r * x)
、それでもコードで使用されている式とはかなり異なりますよね?