为什么 Visual Studio 2008 告诉我 .9 - .8999999999999995 = 0.00000000000000055511151231257827?

StackOverflow https://stackoverflow.com/questions/1662600

当我在 Visual Studio 2008 即时窗口中输入以下内容时:

? .9 - .8999999999999995

它给了我这个答案:

0.00000000000000055511151231257827

文档说双精度数有 15-16 位精度,但它给我的结果有 32 位精度。这些额外的精度从何而来?

有帮助吗?

解决方案

仅15-16在应答数位。所有这些前导零不计。数实际上更像5.5511151231257827×10 -16 。尾数部分具有在它15-16位。指数(-16)用来将小数点在由16个地方移动,但不改变整体的位数的数目。

修改

得到一些意见后,我现在很好奇究竟发生了什么事情。我插在讨论的数字到这个 IEEE-754转换器。它采取了四舍五入最后的“27”到“30”的自由,但我不认为改变了结果。

转换器的数量分解为它的三个二进制部分:

星座:0(正),点击 指数:-51点击 有效数:1.0100000000000000000000000000000000000000000000000000(二进制1.25 <子> 10

因此,这数为1.01 <子> 2 ×2 -51 ,或1.25 <子> 10 ×2 -51 。既然有存储只有三个显著二进制数字,这将表明,拉尔斯可能会到一些东西。它们不能是“随机噪声”,因为它们是相同的数目被转换各一次。

在数据表明,只存储位为“5”。来自指数和看似随机数字的其余部分的前导零是从计算2 -51

其他提示

你应该阅读: 每个计算机科学家对浮点算术都应了解什么.

基本上,它归结为以有限精度存储的浮点数。你必须与一些三角洲进行比较。

if(.9 - .8999999999999995 <= 0.0001)
  //close enough to be equal

在前导零不显著的精度/部分(只要浮点数而言 - 从数学上讲,它们显著)。前导零是由于浮点数的内部表示的指数部分。

的部分55511151231257827(其是有效数尾数)具有17位十进制数字,这是足够接近15-16位。

@Lars d:你认为什么是正确的,是唯一正确的的范围内的问题的。 .9 - .8999999999999995工程以一个浮球随尾数0.625和-50指数。以0.625 * 2 -50 导致5.5511151231257827e-16。现在,超出原质询的背景下,我们有17的显著位的数字确实的恰好是我们最好的0.0000000000000005二进制近似。然而,这些前导零仍不显著只要浮点数的表示关注。

  

? 0.9 - 0.8999999999999995

此减法处理,用15-16显著数字,给出了

  

0.0000000000000005

的数字的其余只是舍入误差。然而,由于计算机总是存储第一个非零数字后15-16显著数字,舍入误差显示,你会得到大量结尾的舍入误差产生的随机数的。所以结果具有从减法操作从所述存储的结果的,这给32个位数16个显著位数加16位。

"浮动"的一部分"浮点"意味着你得到的东西更接近5.5511151231257827*10^(-16).这不正是它是如何表示,当然,因为它是所有做二进制的引擎罩下,但有一点是,数量表示的明显的数字,加上这个数字代表如何移动的基数(decimal point)。一如既往,维基百科可以给你更多的细节:

(第二链接,更具体地集中在您的特殊情况。)

我认为它是因为在二元体系;五是周期性的,因为它是不是由2整除然后呢马克Rushakoff说适用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top