《程序是怎么跑起来的》第三章 计算机进行小数运算出错的原因

3.1 将0.1累加100次得不到100

理想的结果是整数10,但结果却并不准确
在这里插入图片描述

3.2 用二进制数表示小数

将二进制小数1011.0011转换成十进制小数:
在这里插入图片描述

3.3 计算机出错的原因

计算机之所以出现错误,是因为有一些十进制的小数无法转换成二进制数,如十进制0.1就无法用二进制数正确表示,小数点后面即使有几百位也正确表示不了

小数点后4位用二进制数表示时的数值范围为0.0000-0.1111,因此只能表示有限的十进制小数
在这里插入图片描述
如上图,十进制数0的下一位是0.0625,这中间的小数就无法用小数点后四位数来表示。实际上,十进制数0.1转换成二进制后,会变0.00011001100…(1,0循环)这样的循环小数,计算机无法处理循环小数,只能取近似值。这就是计算机运算小数时出错的原因

3.4 什么是浮点数

像1011.0011这样带小数点的表现形式,完全是纸面上的二进制数,在计算机内部是无法使用的

很多语言提供float和double来表示数据,float占32位,double占32位来表示小数。浮点数是指用符号,尾数,基数,指数这四部分表示的小数。由于计算机内部用二进制处理数据,所以基数都为2
在这里插入图片描述
符号部分用1表示负数,0表示正数。数值的大小用尾数部分和指数部分来表示。尾数部分用将小数点前面的值固定为1的正则表达式,而指数部分用的则是EXCESS系统表现

3.5 正则表达式和 EXCESS系统

尾数部分使用正则表达式(按照特定的规则来表示数据的形式),可以将表现形式多种的浮点数统一为一种表现形式。如十进制小数0.75就有多种表现形式。为了方便计算机的处理,需要制定一个统一的规则

将小数点前面的值固定为1的正则表达式处理方法:
在这里插入图片描述

指数部分使用EXCESS系统,使用这种方式主要为了表示负数时不使用符号位。EXCESS系统指通过将指数部分表示范围的中间值设为0,使得负数不需要用符号来表示

在这里插入图片描述

3.6 在程序中得到确认

将十进制小数0.75用单精度浮点数分隔表示为
0(符号位)-01111110(指数部分)-10000000000000000000000(尾数部分)
0.75是正数,则符号位为0。指数部分是十进制126,则EXCESS系统表现为-1
根据正则表达式的规定,尾数部分为实际为1.10000000000000000000000这个二进制数。将尾数部分的二进制数转换成十进制数,结果就是1.5(1乘2的0次幂 + 1乘2的-1次幂)
所以结果为1.5*2^-1,刚好是0.75

但对0.1处理时,经过处理后计算
0-01111011-10011001100110011001101的值用十进制表示为1.5*2^-1=0.75这样的结果与0.1相差甚远,这就是计算机处理小数时出现错误的过程

3.7 避免计算机计算出错

计算机出错的原因之一是,采用浮点数来处理小数。作为程序的数据类型,不管是使用单精度浮点数还是双精度浮点数,都存在着出错的可能

避免出错介绍两种方法:
1,回避策略,即无视这些错误。有时一些细小的偏差不会造成什么问题
2,将小数转换成整数计算

3.8 二进制和十六进制数

二进制在以位为单位表示数据时过于冗长,实际程序中常用16进制数来替代二进制数

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值