首页 > 科技 >

为什么计算机无法准确存储0.1

2019-06-22 03:18:20 暂无 阅读:980 评论:0

在人们的印象中,较量机是非常正确的机械,若是不出bug,法式总能给出准确的究竟.像网银/支出宝这些软件,一分一厘都算得清清楚楚.但其实在较量机内部,很多运算并不是100%正确,而是用近似的手段完成的,因为较量机并不克正确存储小数,这是较量机的"原罪",所以在应用中,只能经由掌握误差充沛小来包管获得一个合理的究竟.举个例子,在实际生活中,人民币结算只需要两位小数,分是最小的单元单子.一分钱,0.01元,或者用0.010009765625来近似.

为什么较量机存禁绝小数呢?

简洁地说,较量机内部使用二进制,在处理整数的时候,没有问题:

好比十进制的108,能够写成108=64+32+8+4,即 108 = 2^6 + 2^5 + 2^3 + 2^2, 二进制透露为 01101100.2^n是构建一个整数的要素.

响应地,在处理小数的时候,这些要素酿成了1/2,1/4,1/8,1/16...即2^-1,2^-2,2^-3,2^-4...

好比0.3125 = 1/4 + 1/16,0.3125是能够存准的,然则0.1这种,就只能近似透露了.

以双精度浮点数(double)为例,double类型具有64个二进制位,凭据以下划定较量:

为什么计算机无法准确存储0.1

数值=(-1)^sign * 2^(exponent-1023) * 1.mantissa

个中1.mantissa是二进制透露的小数.譬如二进制1.1换成十进制是1+2^-1 = 1.5; 二进制1.011换成十进制是 1+2^-2 + 2^-3 = 1.375.

笔者做了一个实验来解说0.1的存储景遇.

#include

void bin(unsigned n)

{

unsigned i;

for (i = 1 <

0; i = i / 2)

(n & i)? printf("1"): printf("0");

printf("\n");

}

int main()

{

double d = 0.1;

unsigned * up =(unsigned *) &d;

unsigned int i = 0;

bin(*up);

bin(*(up+1) );

for(i = 1; i <= 128; i = i<<1)

{

printf("%.*2$f\n", d,i);

}

return 0;

}

输出:

10011001100110011001100110011010

00111111101110011001100110011001

0.1

0.10

0.1000

0.10000000

0.1000000000000000

0.10000000000000000555111512312578

0.1000000000000000055511151231257827021181583404541015625000000000 <---

0.10000000000000000555111512312578270211815834045410156250000000000000000000000000000000000000000000000000000000000000000000000000

在较量机内部,实际上存的是这个数:

0.1000000000000000055511151231257827021181583404541015625.

这个数二进制位的情形:

为什么计算机无法准确存储0.1

验证一下上面的数值较量划定:

数值 = (-1)^0 * 2^(1019-1023) * (1 + 2^-1+2^-4+2^-5+2^-8+2^-9+2^-12+2^-13+2^-16+2^-17+2^-20+2^-21+2^-24+2^-25+2^-28+2^-29+2^-32+2^-33+2^-36+2^-37+2^-40+2^-41+2^-44+2^-45+2^-48+2^-49+2^-51)

为什么计算机无法准确存储0.1

(1 + 2^-1+2^-4+2^-5+2^-8+2^-9+2^-12+2^-13+2^-16+2^-17+2^-20+2^-21+2^-24+2^-25+2^-28+2^-29+2^-32+2^-33+2^-36+2^-37+2^-40+2^-41+2^-44+2^-45+2^-48+2^-49+2^-51) 较量究竟为:

1.600000000000000088817841970012523233890533447265625

乘以第二项 2^-4 即 1/16. 究竟为:

0.1000000000000000055511151231257827021181583404541015625

为什么计算机无法准确存储0.1

和法式打印的究竟一致.

相关文章