深入理解计算机系统(2.7)------浮点数舍入以及运算
上一篇博客我们讲解了二进制小数如何表示以及IEEE浮点标准。而且我们也提到过因为这种表示方法限制了浮点数的范围和精度,浮点数只能近似的表示一个数。
比如 数字1/5,我们能用十进制小数 0.2 准确的表示,但是我们却不能把它准确的表示为一个二进制小数,我们只能通过增加二进制表示的长度来提高表示的精度。如下:
那我们该怎么办呢?
1、舍入
对于不能精确的表示的数,我们采取一种系统的方法,找到“最接近”的匹配值,它可以用期望的浮点形式表现出来,这就是舍入。
舍入一共有四种方式,分别是向偶数舍入、向零舍入、向上舍入以及向下舍入。
可以看下面的例子:
向偶数舍入,是将数字向上或向下舍入,使得结果的最低有效数字是偶数;而向零舍入则是向靠近零的值舍入;向上舍入则是向比它大的方向靠近;向下舍入则是向比它小的方向靠近。
这四个我们可以用一个直角坐标系来理解:
除了向偶数舍入以外,其它三种方式都会有明确的边界。这里的含义是指这三种方式舍入后的值x'与舍入之前的值x会有一个明确的大小关系,比如对于向上舍入来说,则一定有x <= x'。对于向零舍入来说,则一定有|x| >= |x'|。
那么我们什么时候会使用向偶数舍入呢?
1、比如舍入一组数值,计算这些值的平均数中引入统计偏差,如果向上舍入,那么得到的平均值会比这些数本身的平均值略高;向下舍入,则会偏低。而向偶数舍入则会避免这种偏差,在50%的时间内,它向上舍入,剩下50%的时间内,它向下舍入。
2、在我们不想舍入到整数时,我们只是简单的考虑最低有效数字是奇数还是偶数。
通常情况下我们采取的舍入规则是在原来的值是舍入值的中间值时,采取向偶数舍入,在二进制中,偶数我们认为是末尾为0的数。而倘若不是这种情况的话,则一般会有选择性的使用向上和向下舍入,但总是会向最接近的值舍入。其实这正是IEEE采取的默认的舍入方式,因为这种舍入方式总是企图向最近的值的舍入。
2、浮点运算
在IEEE标准中,制定了关于浮点数的运算规则,就是我们将把两个浮点数运算后的精确结果的舍入值,作为我们最终的运算结果。正是因为有了这一个特殊点,就会造成浮点数当中,很多运算不满足我们平时熟知的一些运算特性。
我们可以先看下面这段程序输出结果:
1
2
3
4
5
6
7
|
public void testFloat(){
float f1 = 3 .14f + 10000000000f - 10000000000f;
float f2 = 3 .14f + (10000000000f - 10000000000f);
System.out.println(f1);
System.out.println(f2);
}
|
结果都是 3.14 吗?
我们看到 f1 的值是0,f2的值才是3.14。为什么呢?这是因为前面3.14f+10000000000f 时,会将 3.14 这个有效数值舍入掉,而导致最终结果为0.0
f2 由于括号的存在,会先进行括号里面的运算,结果是0,然后在与3.14相加。
也就是浮点运算不满足加法的结合律 a + b + c != a + (b + c)。同时乘法结合律也不满足:a * b * c != a * (b * c);还要分配律也不满足: a * (b + c) != a * b + a * c
浮点数失去了很多运算方面的特性,因此也导致很多优化手段无法进行,比如我们试图优化下面这样一段程序。
1
2
3
4
5
6
7
|
/* 优化前 */
float x = a + b + c;
float y = b + c + d;
/* 编译器试图省去一个浮点加法 */
float t = b + c;
float x = a + t;
float y = t + d;
|
上面优化前是进行了四次浮点运算,而编译器优化后只需要进行三次浮点运算。但是这中间的 x 可能回产生与原始值不同的值,因为它使用了加法运算不同的结合方式。所以现在的编译器都倾向于保守的方式,避免任何对功能产生的优化,即使是很轻微的影响。
另外,浮点加法满足单调性属性:如果 a>=b,那么对于任何a、b以及 x 的值,除了 NaN,都有 x+a >= x+b。无符号或者补码加法不具有这个实数(和整数)加法的属性。
3、总结
好了,那么到此《深入理解计算机系统》前面两章的内容我们就结束了,这里我们主要需要了解无符号和补码编码格式,以及它们的运算。然后扩展到整数的表示和运算,实数的表示和运算,在实际编程中,我们会经常和数打交道,如何避免一些错误,相信看完后会有个大概的了解了。那么接下来我们将学习第三章,这将是一个全新的世界——汇编语言。这肯定比我们前面讲的要有趣多了,前面都是和0或者1这样的数字打交道,后面至少是一种编程语言,相信会更加有趣。
转载于:https://www.cnblogs.com/ghjbk/p/7602919.html
深入理解计算机系统(2.7)------浮点数舍入以及运算相关推荐
- 计算机运算基础定点数表示,深入理解计算机系统:定点数的表示和运算
最近学习计算机组成原理时,结合视频和个人理解做的一些笔记.可能文中有错误或者描述不恰当的地方,欢迎评论区指出. 1.定点数的表示 1.1 无符号数 定义:无符号数就是没有体现正负号的数(这意味着所有的 ...
- 深入理解计算机系统(2.8)---浮点数的舍入,Java中的舍入例子以及浮点数运算(重要)
https://www.cnblogs.com/zuoxiaolong/p/computer12.html 前言 上一章我们简单介绍了IEEE浮点标准,本次我们主要讲解一下浮点运算舍入的问题,以及简单 ...
- java浮点数数转二进制的数吗_深入理解计算机系统(2.7)-二进制小数和IEEE浮点标准 - Java 技术驿站-Java 技术驿站...
整数的表示和运算我们已经讲完了,在实际应用中,整数能够解决我们大部分问题.但是某些需要精确表示的数,比如某件商品的价格,某两地之间的距离等等,我们如果用整数表示将会有很大的出入,这时候浮点数就产生了. ...
- 《深入理解计算机系统-程序结构》读书笔记
1.计算机系统漫游 计算机系统是由硬件和系统软件组成的,他们共同工作来运行应用程序.在<深入理解计算机系统>一书中将会学到很多实践的技巧.例如:了解编译器是如何实现过程调用的.避免缓冲区溢 ...
- 《深入理解计算机系统》读书笔记
<深入理解计算机系统>读书笔记 注:<深入理解计算机系统>是我们<系统级编程>课程的参考书.这里主要记载的是在看<深入理解计算机系统>这本书的过程中,遇 ...
- 《深入理解计算机系统》CSAPP第3版术语索引表
<深入理解计算机系统>几乎做到了只讲对程序员"有用的"原理,所以这本书性价比非常高.并没有在体系结构和操作系统的许多实现问题上纠缠. 第三版的英文原版是有index表的 ...
- 《深入理解计算机系统》chapter2读书笔记
2.1 2.1.6 bool代数简介 not ~ and & or | exclusive-or ^ 我们可以将四个bool运算扩展到位相量的运算 `a = [a_w-1, a_w-2, a_ ...
- 【收藏】CSAPP深入理解计算机系统三万字长文解析
CSAPP深入理解计算机系统 文章目录 CSAPP深入理解计算机系统 信息 信息存储 字长 字节序 位运算 位运算符 逻辑运算 移位运算 整数 补码规则 表示范围 整数运算 浮点数 编码 规格化数 阶 ...
- 吾读 - 《深入理解计算机系统》第二章 信息的表示与处理 (二)浮点
浮点数绝对是计算机系统里最神秘的一种数值.在不了解它之前,很难想象同样是32位数值,int只能表示最大2的31次方,而浮点的表示范围却是-126到正的127次方. 以及浮点还能表示无穷大,NaN等特殊 ...
最新文章
- FPGA 时序约束系列之周期约束
- runtime error: invalid memory address or nil pointer dereference
- python爬虫——web前端基础(1)
- CreateEvent创建事件对象
- numpy np.polyfit()(最小二乘多项式拟合曲线)(有待进一步研究)
- Java操作MySQL的中文处理方法
- 【跟踪算法】MOSSE论文翻译
- SQL SERVER 2000数据库置疑处理
- java本地文件上传
- 苹果唯冠邮件背后的隐情
- 点击链接元素出现蓝色边框或者出现半透明蓝色背景
- adb devices后出现设备offline的解决方法
- 笔记本电脑WIFI图标消失解决方案大全,无WIFI图标也能自由连WIFI上网。
- 编程实现计算n!,键盘输入n
- Excel导入,一般会遇到的一些问题
- js的NaN和isNaN
- or在python中是什么意思_Python中and和or的用法
- OKCC呼叫中心系统的CRM介绍
- VOBSub字幕合并命令行的实现
- 51单片机串口通信模板_51单片机串口通信实例
热门文章
- 笔记 - Ali Cloud 块存储简介
- linux 编译内核几个常见问题解决方法
- Gentoo 安装日记 10 (配置内核 :General setup)
- 项目实战丨某高校校园网络升级改造方案
- 深入剖析全链路灰度技术
- Grafana Labs 携手阿里云,将提供国内首款 Grafana 托管服务
- html 5 gif手机版,动画GIF在HTML5画布
- 多少分才能考上重庆计算机学校,重庆多少分能上985大学?重庆985院校分数线是多少?(2021年参考)...
- cfile清空文件内容_电脑C盘文件夹哪些可以删除?教你如何快速清理,旧电脑还能用3年...
- 3 v4 中心节点固定_科研人员提出新型水声网络移动节点接入协议