返回

《雷神之锤3》速算平方根倒数算法:神秘又有趣的0x5f3759

前端

<#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》中被使用。

如果你想了解更多关于快速倒数平方根算法的信息,我建议你阅读以下资源:

我希望这篇博文对你有帮助。如果你有任何问题,请随时提问。

感谢阅读!