第三章:计算机进行小数运算时出错的原因
二进制数0.1,用十进制数表示的话是多少
0.5
用小数点后3位的二进制数,能表示十进制数0.625吗
能表示(即0.101)
将小数分为符号、尾数、基数、指数4部分进行表现的形式称为什么
浮点数 “符号 尾数 x 基数的指数次幂”
二进制数的基数是多少
2
通过把0作为数值范围的中间值,从而在不使用符号位的情况下来表示负数的表示方法称为什么
EXCESS系统表现(例如把01111111看作是0的话,比这个数小1 的01111110就是-1)
10101100.01010011这个二进制数,用十六进制数表示的话是多少
AC.53
3.1 将0.1累加100次也得不到10
3.2 用二进制数表示小数
小数点后面的二进制转化为十进制数,不再赘述。
3.3 计算机运算出错的原因
有一些十进制的小数无法转化成二进制数(例如:0.1)
原因:小数点后面四位用二进制数表示时的数值范围为0.0000 ~ 0.1111。因此,这里只能表示0.5,0.25,0.125,0.0625这四个二进制小数点后面的位权组合组成的小数。
3.4 什么是浮点数
像1011.0011这样的带小数点的表现形式,完全是纸面上二进制数表现行式,在计算机内部是无法使用的。
浮点数:用符号,尾数,基数和指数这四个部分来表示的小数。
(其中因为计算机内部使用的是二进制数,所以基数自然就是2.因此,实际的数据往往不考虑基数,只用符号、尾数、指数这三个部分即可表示浮点数)
符号部分:用一个数据位表示数值的符号
数据的大小由尾数部分和指数部分来表示
尾数部分:用的是将小数点前面的值固定为1的正则表达式
指数部分:用的是EXCESS系统表现
3.5 正则表达式和EXCESS系统
尾数部分使用正则表达式,可以将表现形式多样的浮点数统一为一种表现行式。
十进制数的浮点数应该遵循“小数点前面是0,小数点后面第一位不能是0”这样的规则
二进制中使用的是:“将小数点前面的值固定为1的正则表达式”
(将二进制数表示的小数左移或者右移(这里指逻辑移位,因为符号位是独立的)数次后,整数部分的第一位变为1,第二位之后都变为0(这样是为了消除第2位以上的数位),而且第1位的1在实际的数据中不保存。由于第一位必须是1,因此,省略该部分后就省略了一个数据位,从而也就可以表示更多的数据范围)
下图是单精度浮点数尾数部分正则表达式的举例
指数部分中使用的EXCESS系统:
是为了表示负数时不使用符号位
含义:通过将指数部分表示范围的中间值设置为0,使得负数不需要用符号来表示
(例如:当指数部分是8位单精度浮点数时,最大值11111111=255的1/2,即01111111=127(小数部分舍弃)来表示0.同理,指数部分是11位双精度浮点数时,11111111111=2047的1/2,即01111111111=1023(小数部分舍弃)表示的是0)
3.6 在实际的程序中进行确认
举例1:0.75
0-01111110-10000000000000000000000(加-是为了区分符号部分、指数部分、尾数部分)
符号部分0表示该数是正数
指数部分01111110是十进制的126,在EXCESS系统中表现的是-1
尾数部分10000000000000000000000实际上是1.10000000000000000000000,将1.10000000000000000000000转化为十进制数是1x20+1x2-1=1.5
所以最后的结果就是1.5 x 2^-1 = 0.75
举例2:0.1
0-01111011-10011001100110011001101
符号部分0表示该数是正数
指数部分01111110是十进制的123,在EXCESS系统中表现的是-4
尾数部分10011001100110011001101实际上是1.10011001100110011001101,将1.10011001100110011001101转化为十进制数是M(字母表示)
所以最后的结果就是M x 2^-4 != 0.1
3.7 如何避免计算机计算出错
一:回避
根据程序目的不同,有时一些微小的偏差不会造成什么问题
二:将小数转化为正数
进行正数运算只要不超过可处理的数值范围,就一定不会出现问题
BCD编码也是一种使用二进制表示十进制的方法
(用4位来表示0-9的一位数字)
(在设计财务计算等不允许出现误差的情况,一定要将小数转化成整数或者BCD方法,以确保最终得到准确的数值)
3.8 二进制数和十六进制数
用十六进制来表示二进制小数时,小数点后的二进制数的4位同样相当于十六进制的1位。不够4位时用0填补低位即可。
标签:第三章,二进制,浮点数,程序,尾数,怎样,部分,十进制,小数 From: https://www.cnblogs.com/wcpp/p/18006711