游戏大神卡马克用到的神奇数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-13 12:00 编辑
如果你不知道卡马克是谁,可以在网上查查《doom传奇》(记错了,应该为《DOOM启示录》多谢提醒)传记,我也是在看了这个以后才了解,文章写的很好,他的搭档叫罗梅洛,可惜他们没有合作到最后,都是游戏界的猛人! lrtlrt 发表于 2022-7-12 20:28
如果你不知道卡马克是谁,可以在网上查查《doom传奇》传记,我也是在看了这个以后才了解,文章写的很好,他 ...
启示录? 虽然看不懂,但看起来很厉害 比较好奇这个 0x5f3759df 是怎么算出来的 0x5f3759df咋来的 太6了吧 游戏大神真是屈才了,摩拜哦了 新的境界 感谢分享 没看懂,到底这个是什么意思 我泰勒级数没学好,不会推
页:
[1]
2