为什么越菜的软件工程师看问题越简单越高级的软件工程师看问题越复杂? (opens in new tab)
chouheiwa,快 10 年开发经验了 查看知乎原文 0.34 秒的浮点精度误差,28 条人命。这段出事的代码没有任何语法错误,逻辑也很清晰,就是一个每 0.1 秒累加一次的计时器。一个刚入行的新手做 code review,大概率会直接跳过这段,觉得没什么好看的。而一个写了十年代码的老兵盯着这个 0.1,脑子里会自动弹出一个问题:0.1 在二进制里是无限循环小数,累加次数多了误差会不会爆? 1991 年海湾战争,沙特达兰,一枚爱国者导弹[1]未能拦截来袭的飞毛腿。根因是系统用 24 位定点寄存器追踪时间,以 0.1 秒为单位累加。0.1 在二进制里是无限循环小数,截断后每个 0.1 秒引入约 0.000000095 秒的误差。系统连续运行 100 小时,误差累积到 0.34 秒,飞毛腿时速 1676 m/s,0.34 秒就是 500 多米的追踪偏差。导弹飞偏了,28 个美国佬没能回家。 五年后,1996 年,阿丽亚娜 5 号火箭[2]首飞爆炸,损失 5 亿美元。根因是 64 位浮点数转 16 位有符号整数溢出。程序员从阿丽亚娜 4 号继承了这段代码,认为"这个值不可能溢出"...
Read the original article