漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3?( 二 )
所以 , 十进制的0.625对应的二进制就是0.101 。
文章插图
文章插图
文章插图
不是所有数都能用二进制表示
我们知道了如何将一个十进制小数转换成二进制 , 那么是不是计算就可以直接用二进制表示小数了呢?
前面我们的例子中0.625是一个特列 , 那么还是用同样的算法 , 请计算下0.1对应的二进制是多少?
文章插图
我们发现 , 0.1的二进制表示中出现了无限循环的情况 , 也就是(0.1)10 = (0.000110011001100…)2
这种情况 , 计算机就没办法用二进制精确的表示0.1了 。
也就是说 , 对于像0.1这种数字 , 我们是没办法将他转换成一个确定的二进制数的 。
文章插图
文章插图
文章插图
文章插图
文章插图
IEEE 754
为了解决部分小数无法使用二进制精确表示的问题 , 于是就有了IEEE 754规范 。
IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准 , 为许多CPU与浮点运算器所采用 。
浮点数和小数并不是完全一样的 , 计算机中小数的表示法 , 其实有定点和浮点两种 。 因为在位数相同的情况下 , 定点数的表示范围要比浮点数小 。 所以在计算机科学中 , 使用浮点数来表示实数的近似值 。
IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上 , 很少使用)与延伸双精确度(79比特以上 , 通常以80位实现) 。
其中最常用的就是32位单精度浮点数和64位双精度浮点数 。
IEEE并没有解决小数无法精确表示的问题 , 只是提出了一种使用近似值表示小数的方式 , 并且引入了精度的概念 。
浮点数是一串0和1构成的位序列(bit sequence) , 从逻辑上用三元组{S,E,M}表示一个数N,如下图所示:
文章插图
- S(sign)表示N的符号位 。 对应值s满足:n>0时 , s=0; n≤0时 , s=1 。
- E(exponent)表示N的指数位 , 位于S和M之间的若干位 。 对应值e值也可正可负 。
- M(mantissa)表示N的尾数位 , 恰好 , 它位于N末尾 。 M也叫有效数字位(significand)、系数位(coefficient), 甚至被称作"小数" 。
文章插图
上面这个公式看起来很复杂 , 其中符号位和尾数位还比较容易理解 , 但是这个指数位就不是那么容易理解了 。
其实 , 大家也不用太过于纠结这个公式 , 大家只需要知道对于单精度浮点数 , 最多只能用32位字符表示一个数字 , 双精度浮点数最多只能用64位来表示一个数字 。
而对于那些无限循环的二进制数来说 , 计算机采用浮点数的方式保留了一定的有效数字 , 那么这个值只能是近似值 , 不可能是真实值 。
至于一个数对应的IEEE 754浮点数应该如何计算 , 不是本文的重点 , 这里就不再赘述了 , 过程还是比较复杂的 , 需要进行对阶、尾数求和、规格化、舍入以及溢出判断等 。
但是这些其实不需要了解的太详细 , 我们只需要知道 , 小数在计算机中的表示是近似数 , 并不是真实值 。 根据精度不同 , 近似程度也有所不同 。
如0.1这个小数 , 他对应的在双精度浮点数的二进制为:0.00011001100110011001100110011001100110011001100110011001。
0.2这个小数0.00110011001100110011001100110011001100110011001100110011。
所以两者相加:
文章插图
转换成10进制之后得到:0.30000000000000004!
文章插图
文章插图
- 会员|美容院使用会员管理软件给顾客更好的消费体验!
- 页面|如何简单、快速制作流程图?上班族的画图技巧get
- 培育|跨境电商人才如何培育,长沙有“谱”了
- 抖音小店|抖音进军电商,短视频的商业模式与变现,创业者该如何抓住机遇?
- 计费|5G是如何计费的?
- Win10系统桌面|手机桌面秒变Win10电脑系统,这波操作太给力了!
- 车轮旋转|牵引力控制系统是如何工作的?它有什么作用?
- 发生|差评遭外卖员上门辱骂拍摄?不给差评是善解人意,不是理所当然!
- 视频|短视频如何在前3秒吸引用户眼球?
- Vlog|中国Vlog|中国基建如何升级?看5G+智慧工地