4
回答
为何599,999,999,999,999-599,999,999,999,998=0
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

在Google搜索“599,999,999,999,999-599,999,999,999,998”返回的结果是“0”;在在线计算器上输入“1.0 - 0.9 - 0.1”得到结果是“-2.77555756 E-17”——-0.0000000000000000277555756的科学计数法。得到上面错误计算结果的原因与浮点运算有关。 由于计算机的工作是采用二进制形式,它只能以近似的方法表达某个十进制实数,这个实数由一个整数或定点数(即尾数)乘以2的整数次幂得到。以双精度浮点运 算为例,64位存储空间能表达的实数范围为-2^63+1到+2^63-1。64位中52位代表尾数(实际的数),11位代表指数(有多少个零)。 Google的错误显示它的计算器实际使用的尾数比正常的52位尾数要少。TechRadar举了一个例子来说明简单的计算,误差的累积如何演变成生死攸关的灾难。

1991年2月25日,海湾战争结束前三天,伊拉克发射了飞毛腿导弹袭击美国在沙特阿拉伯的飞机场。为了计算导弹将飞往何处,美军的爱国者导弹防御 系统需要知道系统时间。在启动之后,系统是以0.1秒间隔储存数据。但不幸的是,0.1秒不能精确的表示成二进制数。因此在爱国者导弹系统使用的24位寄 存器中它会溢出一个小数。在导弹攻击时,系统已运行了100小时,或3,600,000嘀嗒,微小的错误逐渐累积成0.3433秒的误差,这段时间内飞毛 腿导弹可以飞行687米。爱国者的雷达指向了错误的方向,没有发现目标,因此没有发射导弹拦截,导致28人付出了生命。

举报
红薯
发帖于8年前 4回/545阅
共有4个回帖 最后回答: 6年前

这也是为何在判断浮点数是否为0不能使用“==”而是使用判断是否在一个小范围内的原因。

而楼主的故事似乎有点不可信,因为如此高科技的东西不可能犯如此幼稚的错误,而且如此需要精度的东西或者人家根本就是使用微秒为单位的,而不会是秒为单位。要减小浮点数的误差一般情况是会换算成整形数计算(超范围就要复杂点)。

引用来自“task555”的帖子

这也是为何在判断浮点数是否为0不能使用“==”而是使用判断是否在一个小范围内的原因。

而楼主的故事似乎有点不可信,因为如此高科技的东西不可能犯如此幼稚的错误,而且如此需要精度的东西或者人家根本就是使用微秒为单位的,而不会是秒为单位。要减小浮点数的误差一般情况是会换算成整形数计算(超范围就要复杂点)。

 赞成。。。。。。。。。。。。。。

顶部