《深入理解计算机系统》2.4浮点数

二进制小数

10进制表示方式

2进制表示方式

可以看出二进制小数的小数点没左移一位,相当于除2

但二进制只能表示能写成x*2^y的小数

对于其他值只能近似的表示

IEEE浮点表示

 IEEE标准采用类似于科学计数法的方式表示浮点小数,即我们将每一个浮点数表示为 V = (-1)s * M * 2E 。

s   符号位

M  尾数,是个二进制小数,取值范围为[1,2)(规格化的值),[0,1)(非规格化的值)

E   阶码

浮点数的位表示被分为三个部分

s            1个符号位

exp       k位的阶码字段 用于表示E

frac        n位的小数字段 用于表示M

浮点数编码分为三种

规格化

规格化

特殊值(无穷大,非数字NaN)

规格化

最常见的格式,这种格式的阶码字段的位模式不是全0也不是全1

上面说了,阶码就是2E的E


是2的指数,所以E可正可负

阶码的值是用移码表示的,这里实际是想用无符号的值来表示有符号的数.


补充

所谓移码,简单的说就是偏移数的取值范围

补码表示的负数,在比较时候很不直观。

比如

010101,101011

容易认为后者较大,但事实相反

所谓移码就是对于w位的补码,给它加上2w。即可,这可以算是用“无符号表示有符号”。这样之后就能很直观的比较两个移码的大小。

移码的缘由是阶码



所以,要给阶码表示的值减去上一个偏移量Bias,使得原本无符号的阶码能够表示有无符号值

Bias=2^(k-1)-1    k为阶码位长度

Bias单精度为127,Bias双精度为1023

这里可以看到阶码字段的取值范围变为了[-126,127]。

那么-127和128去哪了?

取-127代表趋近于0的数,128代表无穷大或溢出的数。

那么现在阶码E=e-Bias,其中e是阶码字段代表的数

另外规格化的数字尾数   M=1.阶码字段   ,即隐含的以1开头的小数,即并未保存这个1,而计算时默认开头有1。

为什么这样做呢?

这样的目的是为了多一个精度位。我们通过阶码调整尾码,使之总是1开头的小数,例如1.01010101......,。但尾码字段却不记录这个开头1,所以我们多了一位去记录小数,这样数字将更精确。


阶码使用移码表示的好处

易比较

可表示特殊值

非规格化

阶码字段全为0

此时尾码开头不再有隐含1。

非格式化的两个用途

  • 提供表示0的方式

由于格式化数的尾码开头默认有个1,所以格式化数不可能表示0

  • 提供表示接近0的方式

但此时阶码值为E=1-Bias,而不会像格式化值一样E=-Bias。

之所以会多加1,是为了非格式化能够平滑地转换为格式化数。

举个例子

假定的8位浮点格式的示例,其中有k=4的阶码位和n=3的小数位。偏置量2^(4-1)-1=7。

由于格式化数硬生生地在尾码的开头加了个1即偏移了一个位,但非格式化却没这个1,于是要给E加一个1。

特殊值

当阶码全为1的时候出现。

当小数域全0时,表示无穷。符号位s为0是正无穷,1是负无穷。

当小数域非0时结果是NAN(非数字)

舍入

IEEE有四种不同的舍入方式

  1. 向偶数舍入(大部分像四舍五入,但.5会偏向偶数,比如4.5-->4,3.5-->4)
  2. 向零舍入
  3. 向下舍入
  4. 向上舍入

除了向偶数舍入,其余三种都产生实际值的确界。即舍入的结果都一定或大于或小于原值。

而向偶数舍入多用于统计。

书上没有具体的实现

浮点运算

浮点加法不具有结合性

a+b+c!=a+(b+c)

对于编译器默认的优化策略,将可能出现问题

x=a+b+c;

y=b+c+d;

优化

t=b+c;

x=a+t;

y=t+d;

案例

把12345[11000000111001]变成IEEE单精度浮点数

  1. 将2进制小数点左13位,12345=1.1000000111001X2^13
  2. 去掉开头1,末尾加10个0,以此构造小数字段,[10000001110010000000000]
  3. 为了构造阶码,13加上偏置量127,得140[10001100]
  4. 加上开头的符号位0
  5. 最后得[0  10001100  10000001110010000000000]
时间: 2024-10-25 20:31:32

《深入理解计算机系统》2.4浮点数的相关文章

深入理解计算机系统(1.1)------Hello World 是如何运行的

上一篇序章我谈了谈 程序员为啥要懂底层计算机结构 ,有人赞同也有人反对,但是这并不影响 LZ 对深入理解计算机系统研究的热情.这篇博客以案例驱动的模式,通过跟踪一个简单 Hello World 程序的生命周期开始系统的学习,包括它被程序员创建,到在系统上运行,输出简单的消息,然后终止.LZ 将沿着这个程序的声明周期,先简要的介绍一些逐步出现的关键概念.专业术语以及组成部分.后面将会详细展开. 1.计算机系统 我们知道计算机系统是由硬件和软件组成的.它们共同工作来运行应用程序.虽然系统的实现方式随

对找工作功不可没——评《深入理解计算机系统》

对找工作功不可没——评<深入理解计算机系统> 引子: 在我刚刚进入中科院计算所读研的时候,同宿舍的师兄便向我推荐了一本<深入理解计算机系统>,这本书从一个程序员的视角详细剖析了整个计算机系统,涵盖了组成原理.汇编语言.体系结构.操作系统.网络等计算机基础知识. 由于时间所限,我并没有立刻阅读,而是将其列入了找工作前的复习书单.2010年8月,我用了一个月的时间读完了这本书的原版<Computer System:A programmer's perspective>.后来

CSAPP深入理解计算机系统第二章荟萃

1.可以利用数字的算数右移,然后利用0XFF这样的数字做掩码运算,可以获取到一个数字的符号位.计算机的移位运算有一种很重要的作用就是利用掩码运算去提取一个位模式的一段信息. 2.在C语言中的条件语句,以及三目的条件运算符,都可以用移位的方式来做. 3.在进行位扩展操作的时候,比较讲一个32位的有符号数扩展到64位,那么在保证原来的值不变的情况下,把31个低位扩展到64位的低位上,而最高的符号位扩展到高33位上. 4.利用位模式仅仅只能表示一些2的n次幂的一些浮点数,其他的比较特殊的有理数,会近似

《深入理解计算机系统(第三版)》第二章 信息的表示和处理

<深入理解计算机系统(第三版)>第二章 信息的表示和处理 ??计算机本身是由处理器和存储器子通过系统组成.在核心部分,我们需要方法来表示基本数据类型,比如整数和实数运算的近似值.然后,我们考虑机器级指令如何操作这样的数据,以及编译器又如何将C程序翻译成这样的指令.接下来,研究几种实现处理器的方法,帮助我们更好的了解硬件资源如何被用来执行指令.理解了编译器和机器级代码,我们就能了解如何通过编写C程序以及编译它们来最大化程序的性能.本章主要使我了解了如何表示和执行应用程序,通过一些技巧,来写出安全

《深入理解计算机系统(第三版)》第三章

3.1 程序编码 1.计算机系统使用了多种不同形式的抽象,对于机器级编程来说,两种抽象尤为重要: 指令集体系结构(ISA):定义了处理器状态.指令的格式,以及每条指令对状态的影响 机器级程序使用的存储器地址是虚拟地址:提供的存储器模型看上去是一个非常大的字节数组 2.反汇编器使用的指令命名规则与GCC生成的汇编代码使用的有区别.反汇编省略了指令结尾的q,给call和ret指令添加了q后缀. 3.可执行程序反汇编和对.c反汇编产生的代码有差别.对于可执行文件的反汇编,链接器将代码的地址移到了一段不

深入理解计算机系统PDF下载

深入理解计算机系统PDF下载 我们这些程序员提升发展的书籍,本人亲自拜读过这本书,内容新颖,仿佛打开了我的另一扇大门,读完获益匪浅,所以拿出来跟老铁们一起分享!!! 链接:https://pan.baidu.com/s/1rVB4BD7USTHN9zfFem7Bww 提取码:n4be 目录 · · · · · · 出版者的话 中文版序一 中文版序二 译者序 前言 关于作者 第1章 计算机系统漫游1 1.1 信息就是位+上下文1 1.2 程序被其他程序翻译成不同的格式3 1.3 了解编译系统如何工

深入理解计算机系统9个重点笔记

引言 深入理解计算机系统,对我来说是部大块头.说实话,我没有从头到尾完完整整的全部看完,而是选择性的看了一些我自认为重要的或感兴趣的章节,也从中获益良多,看清楚了计算机系统的一些本质东西或原理性的内容,这对每个想要深入学习编程的程序员来说都是至关重要的.只有很好的理解了系统到底是如何运行我们代码的,我们才能针对系统的特点写出高质量.高效率的代码来.这本书我以后还需要多研究几遍,今天就先总结下书中我已学到的几点知识. 重点笔记 编写高效的程序需要下面几类活动: 选择一组合适的算法和数据结构.这是很

读书笔记《深入理解计算机系统》(第三版) 概述

<深入理解计算机系统>第三版刚出来不到一周,便买下了这本书:之所以阅读本书,一方面源于网友推荐以及豆瓣不错的评分.评价:另一方面是针对本人非科班出身,计算机系统相关的知识相对比较薄弱,很多情况下此类知识需要工作之外的时间自学.补涨此类知识,而该书从程序员的角度进行阐述.展示了计算机系统的各个层面的知识以及其影响程序的正确性.性能.实用性,更容易引起某些上层和下层的知识接轨理解,以期望可以融汇各方面的知识. 明白程序的运作过程,编写更好的软件程序,对底层过程了解以完善自己知识体系和提高信心.接下

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

<深入理解计算机系统>Chapter 7 读书笔记 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(货被拷贝)到存储器并执行. 链接的时机 编译时,也就是在源代码被翻译成机器代码时 加载时,也就是在程序被加载器加载到存储器并执行时 运行时,由应用程序执行 链接器使分离编译称为可能. 一.编译器驱动程序 大部分编译系统提供编译驱动程序:代表用户在需要时调用语言预处理器.编译器.汇编器和链接器. 1.将示例程序从ASCⅡ码源文件翻译成可执行目标文件的步骤 (1)运

【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的.因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才表现出来.前几天线上模块因堆内存写越界1个字节引起各种诡异崩溃,定位问题过程中的折腾仍历历在目,今天读到<深入理解计算机系统>第9章-虚拟存储器,发现书中总结了C程序中常见的内存操作有