lrtlrt 发表于 2022-7-12 20:21

游戏大神卡马克用到的神奇数0x5f3759df

本帖最后由 lrtlrt 于 2022-7-12 23:02 编辑

游戏大神卡马克在Quake-III Arena里面有一个闻名游戏界的开平方根取倒函数
如果你能看懂下面的程序,那么你对C语言中指针的理解将进入一个新的境界
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;
}
大神写的程序就是牛,指针运用的极其灵活,但是这个程序能在java中实现吗?java可是没有C语言中的指针操作,答案是:可以
class Qsqrt
{
      public static void main(String[] args)
      {
                long i;
                float x2, y, number;
                float threehalfs = 1.5F;
                number = 2;
                x2 = number * 0.5F;
                y= number;
                //i= * ( long * ) &y;                     // evil floating point bit level hacking
                Float tmp = y;
                i = tmp.floatToIntBits(y) ;
                i= 0x5f3759df - ( i >> 1 );               // what the fuck?
                //y= * ( float * ) &i;
                y = Float.intBitsToFloat((int)i);
                y= y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
                //y= y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed
                System.out.println(1/y);
      }
}
我以前一直认为java是无法实现这个函数的,但是最近在写程序的时候突然发现好像可以,于是就写了一下,从这里也可以看出java也挺牛,库函数考虑的很全面,程序的世界里面就是这么神奇。

lrtlrt 发表于 2022-7-12 20:28

本帖最后由 lrtlrt 于 2022-7-13 12:00 编辑

如果你不知道卡马克是谁,可以在网上查查《doom传奇》(记错了,应该为《DOOM启示录》多谢提醒)传记,我也是在看了这个以后才了解,文章写的很好,他的搭档叫罗梅洛,可惜他们没有合作到最后,都是游戏界的猛人!

moshouhun 发表于 2022-7-13 11:16

lrtlrt 发表于 2022-7-12 20:28
如果你不知道卡马克是谁,可以在网上查查《doom传奇》传记,我也是在看了这个以后才了解,文章写的很好,他 ...

启示录?

z51530066 发表于 2022-7-12 22:25

虽然看不懂,但看起来很厉害

SLCoCo 发表于 2022-7-12 23:38

比较好奇这个 0x5f3759df 是怎么算出来的

lx12 发表于 2022-7-12 23:50

0x5f3759df咋来的   太6了吧

bj9ye666 发表于 2022-7-13 05:48

游戏大神真是屈才了,摩拜哦了

zp820710 发表于 2022-7-13 07:16

新的境界

lykenan 发表于 2022-7-13 08:43

感谢分享

xddt666 发表于 2022-7-13 09:00

没看懂,到底这个是什么意思

layuai 发表于 2022-7-13 09:15

我泰勒级数没学好,不会推
页: [1] 2
查看完整版本: 游戏大神卡马克用到的神奇数0x5f3759df