26小数点计算不精确,二进制背后做文章
- 有限增加一位进位
1. AB
1.
1. - -1-2
1.
1. 0.1
1.
爱国者没拦住飞毛腿到底该怪谁?是舍入的误差还是管理的漏洞?
一、缘起:这么著名的案例,需要一个让人满意的解释《全民一起玩Python 提高篇》0.1+0.2不等于0.3未能有效拦截根本就没有发射二进制的舍入误差不足以说明二、直接原因:飞行位置预测失误美国总审计署
- 全方位扫描
- 判断该目标
- 如果确定下一时刻出现在哪
- 聚焦不再理会该区域之外在该区域内搜索出现可以确认
- 未能不符不发射 假如它是飞毛腿、那么它下一时刻应该出现在哪个位置位置A误算位置B什么也没有等到不会启动三、常见解释:计时器出现了二进制舍入误差导弹的速度乘以时间时间计数器0.1 秒增加1米/秒计数器乘以 0.1以秒为单位无限循环24位并非真正的0.1近似值0.1000000954 100小时计数器3600000 乘以 0.1实际上0.1000000954多出了0.34秒2000米680米指向了680米之外等不到无法启动CourseA课程《计算机系统基础》“搜狐科普文章:“海湾战争美军最大的伤亡,只是因为不起眼的误差”百度百科“舍入误差”四、深入思考:绝对时间的误差并不会造成影响不对劲没有任何关系依赖于相对时间Robert Skeel(“Roundoff Error and the Patriot Missile”,SIAM News,1992)两个时间点之差一个采用了24位另一个采用了48位虚构
- 一个函数t1
- 另一个函数预期进入状态的时间点t2
t1 到 t2 之间
函数 f1t1
- 函数 f2 在时间计数为 3600020 时t2
- 2.000001908 秒4000.003 米在时间计数为3600020时
- 真实时间2秒 3毫米 五、真正原因:软件升级不一致某次升级添加了一个48位6个模块只有其中几个仍然在使用函数f1 48位函数f224位
- 函数 f1 t1 0.1
- 函数 f2 t2 0.1000000954
- 2.343441908 秒4686.88米之外
- 真实时间2秒实际飞行4000米686米 无法看到列为误报 六、总结:管理疏漏才是根本原因对于绝大部分人为灾难,看上去是技术问题,深究起来都是管理问题。原子弹工程零点几克为什么假设美军不会把系统连续运行8小时以上?为什么升级时没有把所有用到时间计算的模块都改过来?为什么在通知各单位时不给出一个具体的“长时间运行”的定义?编辑于 2019-09-30