返回
《雷神之锤3》速算平方根倒数算法:神秘又有趣的0x5f3759
前端
2024-01-18 11:03:09
<#body>
您好,朋友们!今天,我要带你们探索一个令人兴奋的话题——《雷神之锤3》中的平方根倒数速算算法。这是一个非常棒的算法,对游戏开发人员和其他从事数学密集型工作的人员来说,它是一个必备工具。
首先,让我们来看看如何用代码写出这个公式:
f(x) = \frac{1}{\sqrt{x}}
好吧,这很简单。我们可以用一行代码搞定:
def inverse_square_root(x):
return 1.0 / math.sqrt(x)
这就是全部。不过,《雷神之锤3》实现这个算法的方式非常有趣。
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
如果你看到这个0x5f3759,你会不会感到非常困惑呢?不要担心,现在就让我来为你揭开这个谜团。
0x5f3759是一个常数,它等于1.5的32位浮点数的位模式。这是一种非常聪明的方法,因为它允许我们在不使用除法的情况下计算平方根倒数。
这个算法是如何工作的呢?它实际上使用了一种叫做牛顿迭代法的方法。牛顿迭代法是一种求函数根的迭代方法。它通过不断地改进一个初始猜测值来逼近函数的根。
在快速倒数平方根算法中,初始猜测值是1.0。然后,我们使用牛顿迭代法来改进这个猜测值,直到它足够接近函数的根。
这个算法非常快,而且它非常准确。这就是为什么它在《雷神之锤3》中被使用。
如果你想了解更多关于快速倒数平方根算法的信息,我建议你阅读以下资源:
我希望这篇博文对你有帮助。如果你有任何问题,请随时提问。
感谢阅读!