本帖最后由 lrtlrt 于 2022-7-12 23:02 编辑
游戏大神卡马克在Quake-III Arena里面有一个闻名游戏界的开平方根取倒函数
如果你能看懂下面的程序,那么你对C语言中指针的理解将进入一个新的境界
[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语言中的指针操作,答案是:可以
[Java] 纯文本查看 复制代码 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也挺牛,库函数考虑的很全面,程序的世界里面就是这么神奇。
|