一个绝妙的算法,一段神秘的代码
原创 库里 码农有道 2024-01-22 08:35 广东
游戏行业汇聚了很多计算机天才,而在这些天才中,约翰·卡马克(John Carmack)无疑是最耀眼的之一。
1999年,当卡马克在开发《雷神之锤III竞技场》时,需要使用“浮点运算求平方根倒数”计算照明和投影的波动角度与反射效果,但这样做的成本极高,因为在快节奏、对图形要求高的《雷神之锤III竞技场》中,计算机每秒要进行数百万次运算。
?
为此约翰·卡马克想到了一种极为高效的算法:他选择了一个16进制数字0x5f3759df,然后用牛顿法反复迭代,以求出更精确的近似值。这样做比传统算法快4倍,这就是平方根倒数速算法(Fast Inverse Square Root,Fast InvSqrt())。天才发明算法,普通人学都学不明白,或许这就是降维碾压吧。
这个算法的价值在于它显著地减少了浮点运算操作所带来的巨大计算负担,对于游戏图形运算有着非凡的意义,下面就是这段源代码:
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;
}
这段代码就如同一把来自天外的利剑,惊艳了无数人。它使大师级程序员卡马克的成就如天人,让无数人趋之若鹜,感怀其中。
这段代码中的神秘常数——0x5f3759df——至今仍是个谜。无人能够确切解释这个特殊常数的起源,它就像掩藏在黑暗中的未解之谜。
而后有一位研究者不甘心于这一数字,经过长时间的探索,他找到了另一个比之更高效的常数,虽然如此,他也不得不承认这个神秘数字的卓越之处,甚至撰写了一篇论文详细阐述其内在奥秘。
这段代码,这个算法,它们不仅仅是技术的奇迹,更揭示了人类思维之美,引领着我们不断前行,探索未知的境地。
本文暂时没有评论,来添加一个吧(●'◡'●)