平方根倒数速算法

背景

最近的GitHub Copilot好像出了个不大不小的新闻,AI程序员的『抄袭』好像让大家有了共同话题。[1]在这里我们不讨论Copilot的问题,毕竟技术的发展需要时间。我们来看看这个事件中的另一个主角:平方根倒数速算法。

历史沿革

  1. 就现在所知,此算法最早由Gary Tarolli在SGI Indigo的开发中使用。[2]
  2. 但后来的调查显示,该算法在这之前就于计算机图形学的硬件与软件领域有所应用,如SGI和3dfx就曾在产品中应用此算法。[2]
  3. 此算法最早可能是于90年代前期由SGI所发明。[2]
  4. 此算法的热议来源于其出现在了1999年的《雷神之锤III竞技场》源代码中。[2]
  5. 现在的准程序员对他的了解更多的可能来源于一串神奇的魔法数字:0x5f3759df。[2]

源代码[1]

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. 一个朴素的想发是,最简单的想发是牛顿法,但是牛顿法依赖频繁的浮点数运算。而在计算机上浮点数的运算远远慢于整数运算,同时也慢于位运算 & 逻辑运算。
  2. 更进一步,是否可以通过推导,将之前方法的浮点数运算转为整数运算,或位运算以及逻辑运算。
  3. 一个复杂的推导方案出来了。[3]

说在最后

当年计算机资源紧张的时候,看把我们的前辈们逼成什么样了。摩拜当年的大神。

参考文献

[1] https://baijiahao.baidu.com/s?id=1704248449970053334
[2] https://baike.baidu.com/item/%E5%B9%B3%E6%96%B9%E6%A0%B9%E5%80%92%E6%95%B0%E9%80%9F%E7%AE%97%E6%B3%95/4075273
[3] https://www.cnblogs.com/saaav/p/5807736.html
[4] http://www.matrix67.com/data/InvSqrt.pdf

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 说一下,我刷题是按照这个刷的,一个类型一个类型的,虽然会有一题多解的情况,但我很多时候没有看,之后联系到那再补吧,...
    含泪若笑阅读 166评论 0 0
  • 此算法很有名,来自《雷神之锤3》Quake引擎源码q_math.c的552行,传言是3d游戏开发大神约翰卡马克写的...
    MathPhilosophy阅读 1,404评论 0 3
  • 密码学是在编码与破译的斗争实践中逐步发展起来的,并随着先进科学技术的应用,已成为一门综合性的尖端技术科学。 密码学...
    我叫Vincent阅读 24,277评论 0 19
  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 15,288评论 1 180
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 130,646评论 2 7

友情链接更多精彩内容