负暄琐话

我的email: rot47('649@ 6(hF+`hd"w=92vhG{>}G3"@l M >:>6?4@56 \F')

囧囧ID:g9yuayon
[修改头像]
780575次访问,排名36好友9人,关注者11
g9yuayon的文章
原创 239 篇
翻译 4 篇
转载 48 篇
评论 790 篇
g9的公告
最近评论
alextooter:ff可是用的完全的自己内存管理。。

最近ff3非常好,值得试试看。
fferror:无比期待g9老大的model checking续集。
sprhawk:哈哈,太强了,最近刚听说有Erlang,了解一下。
看一下历史,比看语法有意思得多嘿嘿
lordchl:后面提示下不动点好了,跳得太大
lbaby:Do you mind if I jot down some notes on your chests ??


猛到无以复加
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes
文章分类
收藏
    相册
    旅游
    计算机科学
    Lambda the Ultimate
    软件开发
    Reddit编程专栏(RSS)
    正在读的书
    存档

    转载 《雷神之锤III》里求平方根的函数

    新一篇: 我最恨的狗屁翻译

    更新:有人问这个算法的原理。其实原理很简单。就是牛顿迭代求根。卡马克算法牛X的地方就是他选了一个常数作为起始值。而这个起始值让他只用一次迭代就够了。

    这里看来的。QuakeIII自然就是传奇高手卡马克的杰作之一了。在有的CPU上,这个函数比普通的(float)(1.0/sqrt(x)快4倍!快的原因之一是用了一个神秘常数,0x5f3759df。普渡大学的Chris Lomont在这篇论文里讨论了这个常数的意义,尝试用严格的方法推导出这个常数(他还提到有人认为这个函数是在NVidia工作过的Gary Tarolli写的)。Chris推出的常数是0x5f37642f),和Q_rsqrt里的稍有不同,而且实际表现也稍有不如。卡马克到底怎么推出这个常数的就是谜了。这种高手不写书,实在可惜。
    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

      #ifndef Q3_VM
      #ifdef __linux__
        assert( !isnan(y) ); // bk010122 - FPE?
      #endif
      #endif
      return y;
    }

    发表于 @ 2006年03月18日 12:47:00|评论(loading...)|编辑

    旧一篇: 这句太绝了,不转不行

    评论

    #曾登高 发表于2006-03-20 13:12:00  IP: 211.100.21.*
    TrackBack来自《上周技术关注:第16届JOLT大奖获奖名单公布》

    BOOKS GENERAL
    Jolt Winner: Prefactoring by Ken Pugh (O'Reilly)

    Productivity Winners:
    * Innovation Happens Elsewhere: Open Source as Business Strategy by Ron Goldman, Richard P. Gabriel (Morgan Kaufmann)
    * Producing Open Source Software: How to Run a...
    #太假了吧 发表于2006-03-31 14:23:00  IP: 210.22.82.*
    用到这地步,服了
    #蜗牛 发表于2006-04-01 22:06:00  IP: 218.1.134.*
    就是按照上边的函数算吗?我按照这样算出来不对呀,是不是我漏了什么呢?
    #Zhe 发表于2006-04-01 23:04:00  IP: 218.80.248.*
    这个标题有误导性,这个函数是求平方根的倒数的
    return y; 改成 return number * y; 求的就是平方根了
    #wangjun 发表于2006-04-06 17:37:00  IP: 61.172.57.*
    一个比一个厉害! 服了!
    #yanx8844 发表于2006-04-07 22:09:00  IP: 211.143.181.*
    国人有没有这种程度的?
    #咋回事? 发表于2006-04-10 09:54:00  IP: 202.204.57.*
    结果根本就不对!
    #yyxxh 发表于2006-05-10 22:56:00  IP: 58.51.105.*
    没人用数值计算方法分析一下吗?
    #确实是计算出了平方根的倒数。 发表于2006-05-13 23:54:00  IP: 221.232.32.*
    //测试代码如下:
    #include<iostream>
    using namespace std;

    float Q_rsqrt( float number );

    void main()
    {
    float y;
    y = Q_rsqrt(4);
    printf( "y = %f", y);
    }

    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

    #ifndef Q3_VM
    #ifdef __linux__
    assert( !isnan(y) ); // bk010122 - FPE?
    #endif
    #endif

    // add by huanliang89@hotmail.com :watch out here!
    return number*y;
    }
    #yl 发表于2006-06-23 14:17:00  IP: 218.249.66.*
    服了。
    都是超强人。
    #chinadev 发表于2006-06-27 10:10:00  IP: 210.83.202.*
    这个函数不是卡玛克写的,他曾经承认过~~~~
    #jianburufei9133 发表于2007-12-03 21:23:10  IP: 218.67.135.*
    各位大侠,请问“const float threehalfs = 1.5F;“中的"F"代表什么?谢谢。
    2007-12-04 10:11:35作者回复
    1.5F表示一个类型为const float的浮点数1.5。C里1.5这类常数的类型是const double。如果你不加F,编译器会认为你把一个const double赋给一个const float,多半会生成警告信息。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © g9