一个绝妙的算法,一段神秘的代码

约翰·卡马克的FastInverseSquareRoot算法:游戏界的浮点运算革命
文章讲述了约翰·卡马克在《雷神之锤III竞技场》中发明的FastInverseSquareRoot算法,通过16进制常数0x5f3759df实现高效计算,减少游戏图形运算负担,体现了技术与思维的交融。

游戏行业汇聚了很多计算机天才,而在这些天才中,约翰·卡马克(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——至今仍是个谜。无人能够确切解释这个特殊常数的起源,它就像掩藏在黑暗中的未解之谜。

而后有一位研究者不甘心于这一数字,经过长时间的探索,他找到了另一个比之更高效的常数,虽然如此,他也不得不承认这个神秘数字的卓越之处,甚至撰写了一篇论文详细阐述其内在奥秘。

这段代码,这个算法,它们不仅仅是技术的奇迹,更揭示了人类思维之美,引领着我们不断前行,探索未知的境地。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值