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

13 | 魔数0x5f3759df

IEEE754双精度浮点数
R值的优化
平方根倒数公式推导
浮点数表示法
优化研究
魔数的选择
算法的起源
牛顿迭代法
整数操作
数学基础知识的学习重要性
算法的历史与研究
魔数0x5f3759df的起源
《雷神之锤III竞技场》源代码
浮点数精度问题验证
代码实现
浮点数的计算方式
符号位、指数位、尾数位
IEEE 754标准
数学基础知识
相关历史
代码分析
相关文章与参考资料
代码示例与验证
计算机的浮点数表示
平方根倒数速算法

该思维导图由 AI 生成,仅供参考

你好,我是陈皓,网名左耳朵耗子。
下列代码是在《雷神之锤 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
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

这篇文章深入探讨了一个名为0x5f3759df的魔数在计算平方根倒数的算法中的应用。通过解释算法的代码和计算机浮点数的表示方法,文章深入探讨了浮点数的精度问题,并简化了浮点数的公式以便更好地理解其内部运作。通过对具体小数的二进制编码和验证,读者可以更直观地理解浮点数的表示和精度问题。文章还介绍了代码分析和相关历史,包括该算法的起源和魔数的优化过程。这篇文章提供了深入的技术细节和实例分析,对于对计算机科学感兴趣的读者来说,是一篇值得深入阅读的技术文章。文章内容涉及数学推导、代码分析和历史探讨,展现了作者对技术细节的深入理解和探索精神。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(73)

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

    作者回复: 不牛不牛

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

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

    2018-05-14
    5
    7
  • imuyang
    脑子太笨了,愣是看了两遍才弄清楚

    作者回复: 那很不错了

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