Tan's Blog.

CSAPP浮点数

字数统计: 881阅读时长: 3 min
2019/05/08 Share

计算机系统学习

浮点数

为了让数值的表示更加精确,或者表示一些整数无法达到的数字,比如一些接近于0的数字,或者一些非常大的数值就需要用到浮点数了。浮点数对于计算机的意义,可以说是相当之大。
IEEE标准采用类似于科学计数法的方式表示浮点小数,即我们将每一个浮点数表示为 V = (-1)^s*M*2^E 。
这其中s为符号位,为0时为正,为1时为负。M为尾数,是一个二进制小数,它的范围是0至1-ε,或者1至2-ε(。E为阶码,是一个二进制整数,可正可负,为了给尾数加权。
浮点格式分为两种,一种是单精度,一种是双精度。单双精度分别对应于编程语言当中的float和double类型。其中float是单精度的,采用32位二进制表示,其中1位符号位,8位阶码以及23位尾数。double是双精度的,采用64位二进制表示,其中1位符号位,11位阶码以及52位尾数。
针对阶码E的值,浮点数的值可以分为三种不同的情况,分别是规格化的,非规格化的以及特殊值。我记得之前在上计算机组成原理课的时候,老师比较年轻生怕我们听不懂,就总让我提问,我曾经就提了一个关于规格化的问题,但具体是什么忘了,人上了岁数总容易忘事。所谓规格化就是E不为0也不为全1,当E为0时就是非规格化,特殊值就是无穷大或者不能表示的数。
计算浮点格式的数的值,过程比较简单,按照书上的过程直接算就行,这里就不再写了。

浮点数的舍入

针对浮点数来说,我们的舍入方式有四种方式,分别是向偶数舍入、向零舍入、向上舍入以及向下舍入。通常情况下我们采取的舍入规则是在原来的值是舍入值的中间值时,采取向偶数舍入,在二进制中,偶数我们认为是末尾为0的数。而倘若不是这种情况的话,则一般会有选择性的使用向上和向下舍入,但总是会向最接近的值舍入。其实这正是IEEE采取的默认的舍入方式,这种方式在进行数据统计的时候,更加科学一些,50%的概率嘛。

浮点数的运算

浮点数的运算比较特殊,不支持加法的结合律,(3.14+1e10)-1e10!=3.14+(1e10-1e10);也不支持乘法的结合律和分配律,(1e20*1e20)*1e-20!=1e20*(1e20*1e-20),1e20*(1e20-1e20)!=1e20*1e20 +1e20*1e20

本章小结

通过本章的学习,了解计算机中对数的表示,不同类型的数有不同的性质。在今后写程序中,也会注意不同类型的数在转换时,运算时的表达形式,尽量避免由于数的某些错误而导致整个程序意想不到的结果。

今日总结

今天在另一台电脑上重新搭静态博客,真是一把辛酸泪,碰到的问题很多,比如图床的问题,还有gitalk的一些问题。等我解决好这些问题,再进行个整理。

CATALOG
  1. 1. 计算机系统学习
    1. 1.1. 浮点数
    2. 1.2. 浮点数的舍入
    3. 1.3. 浮点数的运算
    4. 1.4. 本章小结
  2. 2. 今日总结