左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家
175859 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 119 讲
左耳听风
15
15
1.0x
00:00/00:00
登录|注册

13 | 魔数0x5f3759df

你好,我是陈皓,网名左耳朵耗子。
下列代码是在《雷神之锤 III 竞技场》源代码中的一个函数(已经剥离了 C 语言预处理器的指令)。其实,最早在 2002 年(或 2003 年)时,这段平方根倒数速算法的代码就已经出现在 Usenet 与其他论坛上了,并且也在程序员圈子里引起了热烈的讨论。
我先把这段代码贴出来,具体如下:
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
// 2nd iteration, this can be removed
// y = y * ( threehalfs - ( x2 * y * y ) );
return y;
}
这段代码初读起来,我是完全不知所云,尤其是那个魔数 0x5f3759df,根本不知道它是什么意思,所以,注释里也是 What the fuck。今天这节课,我主要就是想带你来了解一下这个函数中的代码究竟是怎样出来的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(73)

  • 最新
  • 精选
  • 路西法
    耗子为啥这么牛逼

    作者回复: 不牛不牛

    25
  • 有咸鱼的梦想
    没有理解为什么浮点数3.14那里,小数部分需要进行这个处理(3.14-2)/(4-2)=0.57,希望皓叔能讲解一下

    作者回复: 文中已讲了,你再仔细看看🙂

    5
    6
  • imuyang
    脑子太笨了,愣是看了两遍才弄清楚

    作者回复: 那很不错了

    5
  • OutOfMemory1024
    曾经在知乎的一个100行内有哪些给力代码回答中引用了这段程序,但是远没有今天看完这篇文章理解更深刻,谢谢皓哥
    90
  • Eben
    看了两遍,终于看懂了,就是利用那个魔数先求一个近似值,然后利用牛顿求根法再去逼近真实值
    25
  • coderliang
    非常好。当初读 CSAPP 那本书时,读到第二章浮点数部分着实花了好久没没完全get到书中的逻辑……
    1
    17
  • Smallfly
    不知道耗子叔还看不看留言,关于浮点数的公式,我有一个疑问,其中 M/2^23 的部分是一个浮点数,我们在定义浮点数公式的时候,用了浮点数,这个公式都还没定义,这个浮点数是怎么表示的呢,会不会有一种鸡生蛋,蛋生鸡问题……
    2
    8
  • 飘过雪域的风
    看了《深入理解计算机原理》里面对浮点数二进制表示的描述,感觉不是很理解,看这里的解释秒懂啊
    8
  • 王彤
    此算法首先接收一个32位带符浮点数,然后将之作为一个32位整数看待,以将其向右进行一次逻辑移位的方式将之取半,并用十六进制“魔术数字”0x5f3759df减之,如此即可得对输入的浮点数的平方根倒数的首次近似值;而后重新将其作为浮点数,以牛顿法反复迭代,以求出更精确的近似值,直至求出符合精确度要求的近似值。在计算浮点数的平方根倒数的同一精度的近似值时,此算法比直接使用浮点数除法要快四倍。 from 百科
    5
  • 壹雁🌟
    几年前看过魔数,觉得很神奇,不明觉厉。今天看后半部分推导出魔数的逻辑,还看得不是很明白,还得看多几遍
    1
    5
收起评论
显示
设置
留言
73
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部