大神约翰·卡马克(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