左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家,骨灰级程序员
立即订阅
40357 人已学习
课程目录
已完结 108 讲
0/6登录后,你可以任选6讲全文学习。
开篇词 | 洞悉技术的本质,享受科技的乐趣
免费
01 | 程序员如何用技术变现(上)
02 | 程序员如何用技术变现(下)
03 | Equifax信息泄露始末
04 | 从Equifax信息泄露看数据安全
05 | 何为技术领导力?
06 | 如何才能拥有技术领导力?
07 | 推荐阅读:每个程序员都该知道的知识
08 | Go语言,Docker和新技术
09 | 答疑解惑:渴望、热情和选择
10 | 如何成为一个大家愿意追随的Leader?
11 | 程序中的错误处理:错误返回码和异常捕捉
12 | 程序中的错误处理:异步编程以及我的最佳实践
13 | 魔数 0x5f3759df
14 | 推荐阅读:机器学习101
15 | 时间管理:同扭曲时间的事儿抗争
16 | 时间管理:如何利用好自己的时间?
17 | 故障处理最佳实践:应对故障
18 | 故障处理最佳实践:故障改进
19 | 答疑解惑:我们应该能够识别的表象和本质
20 | Git协同工作流,你该怎么选?
21 | 分布式系统架构的冰与火
22 | 从亚马逊的实践,谈分布式系统的难点
23 | 分布式系统的技术栈
24 | 分布式系统关键技术:全栈监控
25 | 分布式系统关键技术:服务调度
26 | 分布式系统关键技术:流量与数据调度
27 | 洞悉PaaS平台的本质
28 | 推荐阅读:分布式系统架构经典资料
29 | 推荐阅读:分布式数据调度相关论文
30 | 编程范式游记(1)- 起源
31 | 编程范式游记(2)- 泛型编程
32 | 编程范式游记(3) - 类型系统和泛型的本质
33 | 编程范式游记(4)- 函数式编程
34 | 编程范式游记(5)- 修饰器模式
35 | 编程范式游记(6)- 面向对象编程
36 | 编程范式游记(7)- 基于原型的编程范式
37 | 编程范式游记(8)- Go 语言的委托模式
38 | 编程范式游记(9)- 编程的本质
39 | 编程范式游记(10)- 逻辑编程范式
40 | 编程范式游记(11)- 程序世界里的编程范式
41 | 弹力设计篇之“认识故障和弹力设计”
42 | 弹力设计篇之“隔离设计”
43 | 弹力设计篇之“异步通讯设计”
44 | 弹力设计篇之“幂等性设计”
45 | 弹力设计篇之“服务的状态”
46 | 弹力设计篇之“补偿事务”
47 | 弹力设计篇之“重试设计”
48 | 弹力设计篇之“熔断设计”
49 | 弹力设计篇之“限流设计”
50 | 弹力设计篇之“降级设计”
51 | 弹力设计篇之“弹力设计总结”
52 | 管理设计篇之“分布式锁”
53 | 管理设计篇之“配置中心”
54 | 管理设计篇之“边车模式”
55 | 管理设计篇之“服务网格”
56 | 管理设计篇之“网关模式”
57 | 管理设计篇之“部署升级策略”
58 | 性能设计篇之“缓存”
59 | 性能设计篇之“异步处理”
60 | 性能设计篇之“数据库扩展”
61 | 性能设计篇之“秒杀”
62 | 性能设计篇之“边缘计算”
63 | 区块链技术的本质
64 | 区块链技术细节:哈希算法
65 | 区块链技术细节:加密和挖矿
66 | 区块链技术细节:去中心化的共识机制
67 | 区块链技术细节:智能合约
68 | 区块链技术 - 传统金融和虚拟货币
69 | 程序员练级攻略:开篇词
70 | 程序员练级攻略:零基础启蒙
71 | 程序员练级攻略:正式入门
72 | 程序员练级攻略:程序员修养
73 | 程序员练级攻略:编程语言
74 | 程序员练级攻略:理论学科
75 | 程序员练级攻略:系统知识
76 | 程序员练级攻略:软件设计
77 | 程序员练级攻略:Linux系统、内存和网络
78 | 程序员练级攻略:异步I/O模型和Lock-Free编程
79 | 程序员练级攻略:Java底层知识
80 | 程序员练级攻略:数据库
81 | 程序员练级攻略:分布式架构入门
82 | 程序员练级攻略:分布式架构经典图书和论文
83 | 程序员练级攻略:分布式架构工程设计
84 | 程序员练级攻略:微服务
85 | 程序员练级攻略:容器化和自动化运维
86 | 程序员练级攻略:机器学习和人工智能
87 | 程序员练级攻略:前端基础和底层原理
88 | 程序员练级攻略:前端性能优化和框架
89 | 程序员练级攻略:UI/UX设计
90 | 程序员练级攻略:技术资源集散地
91 | 程序员面试攻略:面试前的准备
92 | 程序员面试攻略:面试中的技巧
93 | 程序员面试攻略:面试风格
94 | 程序员面试攻略:实力才是王中王
95 | 高效学习:端正学习态度
96 | 高效学习:源头、原理和知识地图
97 | 高效学习:深度,归纳和坚持实践
98 | 高效学习:如何学习和阅读代码
99 | 高效学习:面对枯燥和量大的知识
左耳听风
登录|注册

13 | 魔数 0x5f3759df

陈皓 2017-11-14
下列代码是在《雷神之锤 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《左耳听风》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(41)

  • Casey
    曾经在知乎的一个100行内有哪些给力代码回答中引用了这段程序,但是远没有今天看完这篇文章理解更深刻,谢谢皓哥
    2017-11-15
    37
  • 路西法
    耗子为啥这么牛逼

    作者回复: 不牛不牛

    2018-03-28
    10
  • coderliang
    非常好。当初读 CSAPP 那本书时,读到第二章浮点数部分着实花了好久没没完全get到书中的逻辑……
    2017-11-16
    8
  • 有咸鱼的梦想
    没有理解为什么浮点数3.14那里,小数部分需要进行这个处理(3.14-2)/(4-2)=0.57,希望皓叔能讲解一下

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

    2018-05-14
    5
  • Smallfly
    不知道耗子叔还看不看留言,关于浮点数的公式,我有一个疑问,其中 M/2^23 的部分是一个浮点数,我们在定义浮点数公式的时候,用了浮点数,这个公式都还没定义,这个浮点数是怎么表示的呢,会不会有一种鸡生蛋,蛋生鸡问题……
    2019-07-02
    4
  • imuyang
    脑子太笨了,愣是看了两遍才弄清楚

    作者回复: 那很不错了

    2018-05-08
    3
  • Greybunny
    那个常数感觉和欧拉常数的计算原理类似
    2017-11-17
    3
  • Chn.K
    自己能推导一遍那才叫真看懂了,好长时间没这么推导公式了,瞬间回到大学时代。
    2019-03-14
    2
  • 飘过雪域的风
    看了《深入理解计算机原理》里面对浮点数二进制表示的描述,感觉不是很理解,看这里的解释秒懂啊
    2018-08-29
    2
  • newming
    非常好的文章,烧脑哈哈
    2017-11-27
    2
  • yao
    http://www.sandaoge.com/info/new_id/30.html?author=1
    这篇文章也有相关内容,是谁抄袭谁?
    2019-05-28
    5
    1
  • 胡红伟
    由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
    1
  • fpjoy
    log2(1+m) 约等于 m + δ 这样简化的精度是多少呢,会不会有较大误差啊
    2019-04-12
    1
  • 可达鸭
    what the fuck!
    哈哈,莫名想笑!
    算法牛逼,耗哥解读,也很细致入微
    2018-11-12
    1
  • 壹雁🌟
    几年前看过魔数,觉得很神奇,不明觉厉。今天看后半部分推导出魔数的逻辑,还看得不是很明白,还得看多几遍
    2018-08-12
    1
  • 星坠
    原来这才是代码。
    2019-12-09
  • chuwujun
    唯一的感觉。。。我该补数学了。啊啊啊高考之后不应该把数学都还了啊!
    2019-11-11
  • 子郁
    有点厉害。
    2019-09-16
  • ll
    读这篇文章让我想起了电影黑客帝国中,在造物主给尼奥说明他是怎么来的,根本原理就是这个吧
    2019-09-02
  • 郭登鹏
    IEEE 754 应该还有非规格化数的定义 第一部分讲 这个的时候 好像没太多涉及
    2019-07-04
收起评论
41
返回
顶部