吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2408|回复: 17
收起左侧

[Java 转载] 游戏大神卡马克用到的神奇数0x5f3759df

  [复制链接]
lrtlrt 发表于 2022-7-12 20:21
本帖最后由 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也挺牛,库函数考虑的很全面,程序的世界里面就是这么神奇。

免费评分

参与人数 3吾爱币 +3 热心值 +2 收起 理由
xzl9552547 + 1 热心回复!
侠骨留香喵 + 1 + 1 我很赞同!
Ajin1989 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 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
我泰勒级数没学好,不会推
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 03:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表