Yannick:Introduction to CSAPP(六)浮点数表示zhuanlan.zhihu.com
6位浮点数示例
各种情况对应到数轴的样子
![53e8891a5745081d5e11bda525e806c8.png](https://i-blog.csdnimg.cn/blog_migrate/98526786bfc3dbf975c002243174f3e3.jpeg)
我们在上一篇中说明了浮点数表示的定义规范,这样看上去可能不够直观,这篇配合图片和例子,进行说明。
6位与8位浮点数实例
![e56f77f621c2fe6d72abc9214b1d77bf.png](https://i-blog.csdnimg.cn/blog_migrate/9c25d15bef2f5fe8a977a6b1a139aafb.png)
为了直观地展示浮点数的分布情况,我们假定用6位格式来表示浮点数,其中1位表示符号,3位表示阶码,2位表示尾数。如上图。我们可以看到如下图的浮点数在枢轴上的分布:
![0a28e975e9f91f67f749bc4bcae25dfb.png](https://i-blog.csdnimg.cn/blog_migrate/a3f76f4f0ccfab11f9be14b93c0d366a.jpeg)
![3f58dc83fe29ff9c24ad206ea8f26656.png](https://i-blog.csdnimg.cn/blog_migrate/060d4ae35bdc9fdbfc377361615daca9.jpeg)
- 从图a)中可以看出,可表示的数不是均匀分布的——越靠近原点越稠密
- 我们可以大致数出,6位可表示的浮点数是要比整型定点数个数要少的——因为NaN的存在
我们再假定用8位格式来表示浮点数,其中1位表示符号,4位表示阶码,3位表示尾数。可以得到下表:
![1153094f034718615b1ca6254ea46b10.png](https://i-blog.csdnimg.cn/blog_migrate/c002dfe9b5ab63971ce54dd13424db5f.jpeg)
我们可以看到:
- 最大非规格化数
与
之间是平滑过度的——因为偏置常数选择是7而不是8
- 将浮点数的位表示按无符号整数解释,会发现他们是升序排列的,这是IEEE有意为之的
- 处理负数时,他们开头为1为降序排列,但是进行比较时只需要位运算进行判断即可。
浮点数的舍入与运算
以下参考【读薄 CSAPP】壹 数据表示wdxtub.com
![10354090e4b5f86911201a170aafffb2.png](https://i-blog.csdnimg.cn/blog_migrate/12c159614d96220c92ee3127e3582d39.jpeg)
对于浮点数的加法和乘法来说,我们可以先计算出准确值,然后转换到合适的精度。在这个过程中,既可能会溢出,也可能需要舍入来满足 frac 的精度。
任何有效数上的运算结果,通常都存放在较长的寄存器中,当结果被放回浮点格式时,必须将多出来的比特丢弃。 有多种方法可以用来运行舍入作业,实际上IEEE标准列出4种不同的方法:
- 舍入到最接近:舍入到最接近,在一样接近的情况下偶数优先(Ties To Even,这是默认的舍入方式):会将结果舍入为最接近且可以表示的值,但是当存在两个数一样接近的时候,则取其中的偶数(在二进制中是以0结尾的)。
- 朝+∞方向舍入:会将结果朝正无限大的方向舍入。
- 朝-∞方向舍入:会将结果朝负无限大的方向舍入。
- 朝0方向舍入:会将结果朝0的方向舍入。
其中舍入到最接近的算法步骤是:
- 首先是向最近的有效数舍入
- 如果它与两个相邻的有效数距离一样时(即它是中间数,halfway),那么舍入到最近的偶数有效数。
几个小栗子
对于保留到百分位的十进制数字:
- 十进制的1.234999的最近的有效数是1.23,所以它舍入到1.23
- 十进制的1.235001的最近的有效数是1.24,所以它舍入到1.24
- 十进制的1.235000的最近的有效数是1.24和1.23,偶数优先所以它舍入到1.24
- 十进制的1.245000的最近的有效数是1.24和1.25,偶数优先所以它舍入到1.24
对于保留到小数点右边2位的二进制数字:
- 10.00011(B)的最近有效数是10.00(B),所以它舍入到10.00(B)
- 10.00110(B)的最近有效数是10.00(B),所以它舍入到10.01(B)
- 10.11100(B)的最近有效数是11.00(B)和10.11(B),偶数优先所以它舍入到11.00(B)
- 10.10100(B)的最近有效数是10.10(B)和10.11(B),偶数优先所以它舍入到10.10(B)
那么我们为什么选择偶数优先(又叫作银行家舍入)呢?可以看下面这个回答
为什么是4舍5入?4舍6入5取偶又是什么样的机制?www.zhihu.com写到这里,关于浮点数的表示、运算的部分就已经写完了,我们也可以解释Introduction to CSAPP(六)浮点数表示 - Yannick的文章 - 知乎 中提出的问题了。
这篇文章涉及到的概念有很多,看完这两篇文章我们可以尝试思考这几个论断:
1. 由于 0 的存在, 定点数中负数比正数多一个。在很多语言(比如C、Java)中最小的负数的绝对值还是一个负数,就是它自己。有哪些事实没有一定计算机知识的人不会相信?www.zhihu.com
2. 浮点数比定点数少。64 位定点数可以表示 2^64 个数,而 64 位双精度浮点数只能表示 2^64-2^53 +3 个值。
3. 浮点数的分布是不均匀的,[0, 2) 区间的浮点数个数比 [2, ∞) 还要多。