《程序是怎么跑起来的》第三章学习笔记

第一章笔记传送门 👉 点击这里
第二章笔记传送门 👉 点击这里
第三章笔记传送门 👉 点击这里
第四章笔记传送门 👉 点击这里
第五章笔记传送门 👉 点击这里
第六章笔记传送门 👉 点击这里
第七章笔记传送门 👉 点击这里
第八章笔记传送门 👉 点击这里
第九章笔记传送门 👉 点击这里

第三章:计算机进行小数运算时出错的原因

  • 二进制数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填补低位即可。
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值