“Fast InvSqrt” 算法

大神约翰·卡马克(John Carmack)的一段代码:

// 快速计算浮点数的平方根的倒数
float Q_rsqrt(float number) {
    long i;
    float x2, y;
    const float threehalfs = 1.5F;  // 1.5的浮点表示,用于之后的牛顿迭代

    // 将浮点数的值的一半存储在 x2
    x2 = number * 0.5F;
    // 将浮点数的值存储在 y
    y = number;

    // 将浮点数的位表示转换为长整型
    i = *(long *)&y;

    // 使用魔法常数和位运算进行近似平方根的倒数计算
    i = 0x5f3759df - (i >> 1);
    // 将计算得到的值重新转换回浮点数。
    y = *(float *)&i;

    // 使用牛顿迭代法提高精度,这个步骤会通过迭代逐渐接近平方根的倒数。
    y = y * (threehalfs - (x2 * y * y));
    
    // 返回最终计算结果,即输入浮点数的平方根的倒数
    return y;
}

最后更新于 2023-11-17 16:31:51 by twotwolucky

发表评论