为什么Visual Studio 2008的告诉我0.9 - 0.899999999999999

2019-09-15 23:18发布

当我键入到Visual Studio 2008的直接窗口这样的:

? .9 - .8999999999999995

这使我这个作为答案:

0.00000000000000055511151231257827

该文件说,双具有精度15-16位,但它给我的精度32位的结果。 哪里是所有这些额外的精度是从哪里来的?

Answer 1:

只有 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。



Answer 2:

你应该阅读: 什么每台计算机科学家应该知道关于浮点运算 。

基本上它归结为浮点数存储有限精度。 你必须做一些增量的比较。

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


Answer 3:

前导零不显著的精度/部件(尽可能的浮点数而言-从数学上讲,他们显著)。 前导零是由于浮点数的内部表现的指数部分。

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

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



Answer 4:

? 0.9 - 0.8999999999999995

这个减法的过程,15-16显著数字,给出了

0.0000000000000005

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



Answer 5:

“浮点”的“浮动”的一部分意味着你得到的东西更接近5.5511151231257827 * 10 ^( - 16)。 这并不是它究竟是如何表示的,自然是因为这一切都在二进制完成的引擎盖下,但问题是,这个数字是由显著数字表示,再加上一些代表多远移动的基数(小数点)。 与往常一样,维基百科可以给你更多的细节:

  • http://en.wikipedia.org/wiki/Floating_point
  • http://en.wikipedia.org/wiki/Double_precision

(第二连杆更专门针对你的具体情况。)



Answer 6:

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



文章来源: Why does Visual Studio 2008 tell me .9 - .8999999999999995 = 0.00000000000000055511151231257827?