zoukankan      html  css  js  c++  java
  • 快速开方法(c语言)译文

    人们最早就在Quake3源代码中发现了类似如下的C代码,它可以快速的求1/sqrt(x),在3D图形向量计算方面应用很广。

    float invSqrt(float x)
    {
        float xhalf = 0.5 * x;
        int i = *(int*)&x; // get bits for floating value
        i = 0x5f3759df - (i >> 1); // gives initial guess
        x = *(float*)&i; // convert bits back to float
        x = x * (1.5 - xhalf * x * x); // Newton step
        return x;
    }

     

    人们在QuakeIII源码发现了这个函数,于是很自然的认为这是卡马克(John Carmack)的杰作,其中0x5f3759df这个数被称为卡马克密码,我们在下面称这个数为magic,Beyond3D.com的Ryszard Sommefeldt一直在想到底是哪个家伙写了这些神奇的代码,于是就开始找作者,John Carmack在邮件回复中明确表示不是他,也不是Michael。Terje Mathisen说他写过类似的高效代码,但上面的不是。后来猜测这个来自于一些早期黑客的算法笔记,作者究竟是谁自然也难以追查了,可以肯定的是这个家伙对计算机和高数知识都有较好理解,很聪明
    2003年普渡大学的数学家Chris Lomont写了一篇文章对这段代码进行了分析。论文是英文的,地址在:
    http://wenku.baidu.com/view/80b84d1fb7360b4c2e3f644b.html
    在这篇12页的论文中,Lomont对这个算法做了分析,并从推导出了一个理论上最优的magic 0x5f37642f,有意思的是,这个数居然没有invSqrt里的0x5f3759df效果好,最大相对误差达到1.78‰,Lomont一怒之下,用暴力搜索枚举了所有可能的magic,终于找到一个最优的magic 0x5f375a86,只比0x5f3759df效果好一点点,至于invSqrt的作者究竟如何找到0x5f3759df的,也就是个迷了。

    参考:https://en.wikipedia.org/wiki/Fast_inverse_square_root

    https://blog.csdn.net/xtlisk/article/details/51249371

  • 相关阅读:
    java数据结构:二叉树
    java数据结构:队列
    java数据结构:堆栈
    nosql初探索:linux安装redis数据库
    javaweb成长之路:SSM框架搭建
    struts2在继承ActionSupport时,在导入package前面出现错误
    ognl.NoSuchPropertyException
    第八届蓝桥杯省赛B组c++_方格分割
    第八届蓝桥杯省赛B组c++_承压计算
    第八届蓝桥杯省赛B组c++_等差素数列
  • 原文地址:https://www.cnblogs.com/litifeng/p/10436675.html
Copyright © 2011-2022 走看看