漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?( 二 )


漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?文章插图
漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?文章插图
十进制转二进制
首先我们看一下 , 如何把十进制整数转换成二进制整数?
十进制整数转换为二进制整数采用"除2取余 , 逆序排列"法 。
具体做法是:

  • 用2整除十进制整数 , 可以得到一个商和余数;
  • 再用2去除商 , 又会得到一个商和余数 , 如此进行 , 直到商为小于1时为止
  • 然后把先得到的余数作为二进制数的低位有效位 , 后得到的余数作为二进制数的高位有效位 , 依次排列起来 。
如 , 我们想要把127转换成二进制 , 做法如下:
漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?文章插图
那么 , 十进制小数转换成二进制小数 , 又该如何计算呢?
十进制小数转换成二进制小数采用"乘2取整 , 顺序排列"法 。
具体做法是:* 用2乘十进制小数 , 可以得到积 * 将积的整数部分取出 , 再用2乘余下的小数部分 , 又得到一个积 * 再将积的整数部分取出 , 如此进行 , 直到积中的小数部分为零 , 此时0或1为二进制的最后一位 。 或者达到所要求的精度为止 。
漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?文章插图
所以 , 十进制的0.625对应的二进制就是0.101 。
漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?文章插图
漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?文章插图
漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?文章插图
不是所有数都能用二进制表示
我们知道了如何将一个十进制小数转换成二进制 , 那么是不是计算就可以直接用二进制表示小数了呢?
前面我们的例子中0.625是一个特列 , 那么还是用同样的算法 , 请计算下0.1对应的二进制是多少?
漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?文章插图
我们发现 , 0.1的二进制表示中出现了无限循环的情况 , 也就是(0.1)10 = (0.000110011001100…)2
这种情况 , 计算机就没办法用二进制精确的表示0.1了 。
也就是说 , 对于像0.1这种数字 , 我们是没办法将他转换成一个确定的二进制数的 。
漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?文章插图
漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?文章插图
漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?文章插图
漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?文章插图
漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?文章插图
IEEE 754
为了解决部分小数无法使用二进制精确表示的问题 , 于是就有了IEEE 754规范 。
IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准 , 为许多CPU与浮点运算器所采用 。
浮点数和小数并不是完全一样的 , 计算机中小数的表示法 , 其实有定点和浮点两种 。 因为在位数相同的情况下 , 定点数的表示范围要比浮点数小 。 所以在计算机科学中 , 使用浮点数来表示实数的近似值 。