底层架构 IntelliJ IDEA教程 Quartz centos7安装 分布式服务 金融信贷 json xml replace import jestjs mui lazyloadjs vue安装 vue组件注册 后台管理系统模板 git视频 oracle修改字段默认值 lora开发 matlab不等于怎么表示 表白网页源码 python零基础教程 python函数大全 javatrim java实现接口 java语言基础教程 java初级入门教程 java文件重命名 java获取数据类型 java声明变量 java获取本地时间 java的集合 java学习流程 java的多线程 linux系统安装步骤 linux系统命令大全 sql综合利用工具 微信python退出程序 din字体下载 复制到剪贴板
当前位置: 首页 > 学习教程  > python

《深入理解计算机系统》第二章:浮点数的表示

2021/2/7 11:24:40 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

《深入理解计算机系统》第二章:浮点数的表示 文章目录《深入理解计算机系统》第二章:浮点数的表示前言一、浮点数二、浮点数的表示2.1 浮点数的表示类型2.1.1 规格化的表示2.1.2 非规格化2.1.3 特殊值2.2 八比特浮点数2.3 整数转浮点数三、浮点数的舍入四…

《深入理解计算机系统》第二章:浮点数的表示


文章目录

  • 《深入理解计算机系统》第二章:浮点数的表示
  • 前言
  • 一、浮点数
  • 二、浮点数的表示
    • 2.1 浮点数的表示类型
      • 2.1.1 规格化的表示
      • 2.1.2 非规格化
      • 2.1.3 特殊值
    • 2.2 八比特浮点数
    • 2.3 整数转浮点数
  • 三、浮点数的舍入
  • 四、浮点数的运算
    • 4.1 不满足结合律和分配率
    • 4.2 强制转换可能超预期
  • 总结


前言

浮点数我觉得还是比较难的,一开始感觉很迷糊。


一、浮点数

在这里插入图片描述
小数点左侧是2的正幂,右侧是2的负幂。
在这里插入图片描述
上边让我想起了泰勒公式:
e^0 + 1 = 1 + 1/2 + 1/3 + 1/4 + 1/5 +…+ 1/n
浮点数小数点右边的所有位加和的极限等于1。

二、浮点数的表示

在这里插入图片描述
在这里插入图片描述

2.1 浮点数的表示类型

浮点数的类型,一共有三种:
1、Normalized Values (规格化的值)
2、Denormalized Values (非规格化的值)
3、Special Values(特殊值)
其中阶码的值决定了这个数是属于其中哪一类:
1、阶码字段的二进制不全为0,且不全为1时,此时表示规格化的值
2、阶码字段的二进制位全为0时,此时表示的数值是非规格话的值
3、阶码字段的二进制位全为1时,表示的数值为特殊值。特殊值分为两类,一类表示无穷大或者无穷小;另外一类表示“不是一个数”。
在这里插入图片描述

2.1.1 规格化的表示

E = e + Bias;
Bias = 2^(k-1) - 1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1.2 非规格化

在这里插入图片描述

2.1.3 特殊值

在这里插入图片描述

2.2 八比特浮点数

下面通过一个8比特的浮点数来演示一下浮点数的表示:
在这里插入图片描述
在这里插入图片描述
1、当exp全为0时,代表非规格化的数,E = 1- bias,因为bias = 2^(4-1) - 1 = 7,所以在非规格化的表示范围内,E = 1 - 7 = -1,M = f,所以按照公式就可以计算出结果。
2、当exp不全为0且不全为1时,表示规格化的数据,此时,E = Exp - bias(1),M = 1 + frac(2);根据公式(1)和(2)即可算出E和M的值;
3、当exp全为1时,代表特殊值;frac = 0 并且 exp = 1 时,代表无穷大的情况;s = 1代表负无穷大,s = 0代表正无穷大。

2.3 整数转浮点数

我们来看一个例子,将整数12345转成浮点数。
首先12345肯定是规格化数公式如下
(1)E = e - bias;
(2)bias = 2^(k-1) - 1;
(3)k = 8;
(4)frac = M - 1;
根据上边的四个公式,即可计算出12345的浮点数表示。
在这里插入图片描述

三、浮点数的舍入

浮点数的舍入方式一共有四种,其中向偶数舍入是最难懂的:
在这里插入图片描述
在这里插入图片描述
下面我们来看一下最难的向偶数舍入,偶数舍入的原理是:四舍六入五求偶,就是将舍入的数字是4或者6的时候,直接按照正常的舍入规则进行舍入,当数字是5的时候,按照下面的方式进行舍入:
在这里插入图片描述
为什么是向偶舍入?
如果采用向上舍入,那么会导致结果的平均值略高于真实值;如果采用向下舍入,会导致结果的平均值略低于真实值,采用向偶数舍入就避免了这种统计学偏差,使得一半的情况向下舍入,一半的情况向上舍入。向偶数舍入适用于小数的情况:
在这里插入图片描述
其中10.11100,保留小数点后两位小数的情况,第三位是1,代表位于数字中间,则向偶数舍入,即去掉三位以及之后的数字,然后加0.01,得到最后舍入的结果11.00。
关于更多二进制小数向零舍入的例子: 这篇博客分析的比较好。

四、浮点数的运算

4.1 不满足结合律和分配率

在这里插入图片描述
上面的例子(1)中,3.14 和 1e10相加,3.14会被舍入,所以(1)和(2)的结果是不一样的,说明浮点数的运算是不满足结合率;同理(5)和(6)说明,浮点数的运算不满足分配率

4.2 强制转换可能超预期

1、当int转换成float类型的时,不会发生溢出,但是会被舍入。因为单精度的小数字段的表示范围是23位,可能会出现无法保存精度的情况。
2、当float或者int类型转换成double类型的时候,不会发生舍入,也不会溢出。因为doubl具有更大的范围,可以保留更精确的数值。
3、当double转换成int或者float的时候,会发生溢出,因为double的范围更大,此外float的范围小,转换后还会发生舍入的情况,
4、float/double转成int的时候,会发生舍入,比如1.9会变成1。
在这里插入图片描述


总结

浮点数的表示,比整数的表示略微复杂,表示类型,分为三种,分别是规范化、非规范化和特殊值;而且浮点数的运算是不满足结合律和分配率的,这一点需要特别注意。


本文链接: http://www.dtmao.cc/news_show_2000277.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?