好的,到目前为止,我想很多人都知道著名的快速反平方根(参见编写自己的平方根函数和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
所以一次迭代应该是x1 = x - f(x)/f'(x) = x / 2 + 1 / (2 * r * x)
,对吧?
怎么来的x * (1.5 - ((r / 2) * x * x))
?(注意我在这里替换xhalf
为r / 2
)
编辑
好的f(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)
,它仍然与代码中使用的公式有很大不同,对吧?