2.4 浮点数
浮点数对于设计非常大的数字以及非常接近0数字有很大的意义, 但最早的浮点数并没有一个统一的标准, 之后IEEE 754的标准出现了, 该标准直到现在还在使用, 我们接下来要将的就是IEEE标准中的浮点格式... 因为这一部分我大一上学期的时候学过一些, 所以可能会比较简略...
2.41 二进制小数
当然你会发现我们并没有办法表示一些不由二的幂的和组成的小数( 比如三分之一), 我们只能通过增加二进制的长度来提高精度.
2.42 IEEE浮点表示
书上这一段讲的很好, 我就不表了, 直接抄书了 :
2.43 数字实例
这几节别怪我图我, 真的, 自己说很难说清楚, 书上图文并茂很好理解...
图有问题(菱形表示的应该是非规格化的值), 非规格化的值特别适合来表示十分接近0的数, 而特殊值用来表示无穷...
感觉这一部分重点在于了解浮点数的机器表示, 只要清楚转换规则, 能完成浮点数与十进制小数的转换就行了... 另外还有一点, 学到这里我们可以看到整数与浮点数的联系了...
2.44 舍入
舍入这里默认的是向偶数舍入, 也称之为最接近舍入, 个人认为书这个地方的阐述是很有问题, 是书中为数不多的败笔之一(别和我说英文版, 我英文版也看了, 一样有歧义)... 这个舍入其实很简单, 比如我们想要把一个浮点数舍入为整数, 比如说对于1.1, 我们肯定会得到结果1, 这种情况下叫做最近舍入, 如果碰到1.5, 那么它距离1和2一样的话, 这时候就要考虑偶数舍入, 也就是说如果不是这种和两边的边界都距离相同的情况下, 只需要最近舍入就行了...(二进制而言0是偶数) 其他三种向0, 向上 或者向下舍入就不多说了...
2.4.5 浮点运算
IEEE标准使用了简单的规则用来确定. 浮点单元设计者使用了一些技巧来避免精确的计算, 只保证必要的正确舍入, 同时对参数中带特殊值得浮点数运算定义了更合理的规则, 比如1除以0得到正无穷等等... 同时, 正因为引入了舍入机制, 浮点数的计算是可交换而不可以结合的(符合交换律而不符合结合律)... 比如 x + y 一定等于 y + x, 但是 (3.14 + le10) - le10 和 3.14 + (le10 - le10) 的结果分别是 0 和 3.14...
正因为浮点数的加法不符合结合律, 这对于编译器的编写会造成一些影响.
比如对下列浮点数的运算 :
x = a + b + c;
y = b + c + d;
编译器如果希望减少一次浮点数加法而进行如下优化 :
t = b + c;
x = a + t;
y = t + d;
那么结果就可能会不同, 所以编译器会尽量避免这种功能产生影响的优化...(写编译器的时候要记住啊...)
同时浮点数加法满足单调性 : 比如 a >= b, 那么对于任何a, b, x(NaN不算), 都有 x + a >= x + b... (整数运算会溢出, 所以不满足)...
浮点数乘法同样具有交换性和单调性但是不具有结合性, 同时也没有分配性... (这些东西感觉也记不住, 只要以后想到在博客里面记了再过来查就行了)
2.46 C语言中的浮点数
C语言的标准中并没有规定浮点数必须使用IEEE标准, 但是一般用float, double对于IEEE中的单精度和双精度浮点数, 对于无穷这样的, 一般在头文件中定义, 不同的系统平台不一样... 这里给出一些C语言中int, float, double的转换规则 :
对于练习题 2.54 :
A : 对(要记住一点, int 和 float 转 double 无丢失) ...
B : 错误 (某些较大的int 虽然float可以表示的范围足够, 但是往往精度不足)
C : 错误
D : 对
E : 正确
F : 正确
G : 正确 (记住浮点数溢出不像整数, 这个式子最多也就溢出到正无穷)
H : 如果 (记住如果有一个数接近极限, 那么与它做加法的结果就是某个数直接被舍去, 比如当 f 很大, 而 d = 1.0, 那么 f + d 就是 f, f - f 等于 0. 0 , 而右边等于 1.0)
2.5 小结
我自己来总结一下, 这一章其实就两点 :
1. 整数以及整数的溢出...
1. 加法运算的溢出问题
1. 无符号数发生溢出, 结果小于任何一个数
2. 补码数发生溢出, 要么两正的一负, 要么两负的一正.
2. 乘法运算的溢出问题
结果超过了32位就溢出, 没有规律可循.
3. 无论溢出与否, 符合交换律, 结合律, 分配律.
2. 浮点数以及浮点数的舍入与溢出...
1. 浮点数的表示符合IEEE 标准...
2. 浮点数默认向近向偶舍入
3. 浮点数很大时向正无穷溢出, 很小时向负无穷溢出, 接近0时向0溢出.
4. 由于舍入的存在, 导致浮点数运算不符合分配律和结合律, 只符合交换律和单调性, 这一点要特别小心.