上一篇博客我们讲解了二进制小数如何表示以及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.1 无符号数 定义:无符号数就是没有体现正负号的数(这意味着所有的 ...

  2. 深入理解计算机系统(2.8)---浮点数的舍入,Java中的舍入例子以及浮点数运算(重要)

    https://www.cnblogs.com/zuoxiaolong/p/computer12.html 前言 上一章我们简单介绍了IEEE浮点标准,本次我们主要讲解一下浮点运算舍入的问题,以及简单 ...

  3. java浮点数数转二进制的数吗_深入理解计算机系统(2.7)-二进制小数和IEEE浮点标准 - Java 技术驿站-Java 技术驿站...

    整数的表示和运算我们已经讲完了,在实际应用中,整数能够解决我们大部分问题.但是某些需要精确表示的数,比如某件商品的价格,某两地之间的距离等等,我们如果用整数表示将会有很大的出入,这时候浮点数就产生了. ...

  4. 《深入理解计算机系统-程序结构》读书笔记

    1.计算机系统漫游 计算机系统是由硬件和系统软件组成的,他们共同工作来运行应用程序.在<深入理解计算机系统>一书中将会学到很多实践的技巧.例如:了解编译器是如何实现过程调用的.避免缓冲区溢 ...

  5. 《深入理解计算机系统》读书笔记

    <深入理解计算机系统>读书笔记 注:<深入理解计算机系统>是我们<系统级编程>课程的参考书.这里主要记载的是在看<深入理解计算机系统>这本书的过程中,遇 ...

  6. 《深入理解计算机系统》CSAPP第3版术语索引表

    <深入理解计算机系统>几乎做到了只讲对程序员"有用的"原理,所以这本书性价比非常高.并没有在体系结构和操作系统的许多实现问题上纠缠. 第三版的英文原版是有index表的 ...

  7. 《深入理解计算机系统》chapter2读书笔记

    2.1 2.1.6 bool代数简介 not ~ and & or | exclusive-or ^ 我们可以将四个bool运算扩展到位相量的运算 `a = [a_w-1, a_w-2, a_ ...

  8. 【收藏】CSAPP深入理解计算机系统三万字长文解析

    CSAPP深入理解计算机系统 文章目录 CSAPP深入理解计算机系统 信息 信息存储 字长 字节序 位运算 位运算符 逻辑运算 移位运算 整数 补码规则 表示范围 整数运算 浮点数 编码 规格化数 阶 ...

  9. 吾读 - 《深入理解计算机系统》第二章 信息的表示与处理 (二)浮点

    浮点数绝对是计算机系统里最神秘的一种数值.在不了解它之前,很难想象同样是32位数值,int只能表示最大2的31次方,而浮点的表示范围却是-126到正的127次方. 以及浮点还能表示无穷大,NaN等特殊 ...

最新文章

  1. FPGA 时序约束系列之周期约束
  2. runtime error: invalid memory address or nil pointer dereference
  3. python爬虫——web前端基础(1)
  4. CreateEvent创建事件对象
  5. numpy np.polyfit()(最小二乘多项式拟合曲线)(有待进一步研究)
  6. Java操作MySQL的中文处理方法
  7. 【跟踪算法】MOSSE论文翻译
  8. SQL SERVER 2000数据库置疑处理
  9. java本地文件上传
  10. 苹果唯冠邮件背后的隐情
  11. 点击链接元素出现蓝色边框或者出现半透明蓝色背景
  12. adb devices后出现设备offline的解决方法
  13. 笔记本电脑WIFI图标消失解决方案大全,无WIFI图标也能自由连WIFI上网。
  14. 编程实现计算n!,键盘输入n
  15. Excel导入,一般会遇到的一些问题
  16. js的NaN和isNaN
  17. or在python中是什么意思_Python中and和or的用法
  18. OKCC呼叫中心系统的CRM介绍
  19. VOBSub字幕合并命令行的实现
  20. 51单片机串口通信模板_51单片机串口通信实例

热门文章

  1. 笔记 - Ali Cloud 块存储简介
  2. linux 编译内核几个常见问题解决方法
  3. Gentoo 安装日记 10 (配置内核 :General setup)
  4. 项目实战丨某高校校园网络升级改造方案
  5. 深入剖析全链路灰度技术
  6. Grafana Labs 携手阿里云,将提供国内首款 Grafana 托管服务
  7. html 5 gif手机版,动画GIF在HTML5画布
  8. 多少分才能考上重庆计算机学校,重庆多少分能上985大学?重庆985院校分数线是多少?(2021年参考)...
  9. cfile清空文件内容_电脑C盘文件夹哪些可以删除?教你如何快速清理,旧电脑还能用3年...
  10. 3 v4 中心节点固定_科研人员提出新型水声网络移动节点接入协议