1,三个部分
4字节的单精度浮点数32个位分3个部分:
1.1,从左往右第一位是符号位,0正1负;
1.2,紧接的8个位是指数部分,不要纠结是原码,反码还是补码,只是一个不带符号位的二进制数,都一样。取值区间是[0,255],0和255有特殊含义;取值在[1,254]的情况下,需要减去127才是真正的指数值,这时指数取值是[-126,127]。
1.3,剩余的23位是尾数部分,用于表示浮点数的小数部分;也是一个不带符号位的二进制数。
2,指数部分
2.1,当指数部分是0,且尾数部分为全0的情况,这表示浮点数0;加上符号位表示正负0。
2.2,当指数部分是0,且尾数部分不为0的情况,其实际指数是-126,二进制表示的科学计数法的浮点数的整数部分按0解析。
2.3,当指数部分是255,且尾数部分为全0的情况,表示一个无穷数;加上符号位表示正反无穷。
2.4,当指数部分是255,且尾数部分不为0的情况,表示不是一个有效数字,NaN。
2.5,当指数部分取值为[1,254]的情况,需要减去127才是实际指数值,二进制表示的科学计数法的浮点数的整数部分按1解析。
3,浮点书的规约形式与非规约形式
3.1,上述的第二种情况的浮点数称为非规约浮点数;上述的第五种情况的浮点数称为规约浮点数。
3.2,最小的规约浮点数是指数部分是1(实际指数是-126),尾数部分为全0的时候,绝对值为1 * 2 ^ -126 ;
次小的规约浮点数是指数部分为1,尾数部分最低位为1其余位为0的时候,绝对值为1.000...1 * 2 ^ -126;
它们之间的绝对差值为(1.000...1 - 1) * 2 ^ -126 = 2 ^ -23 * 2 ^ -126 = 2 ^ -149;
而最小规约数与0的绝对差值是1 * 2 ^ -126 = 2 ^ -126。
在坐标轴的表现是,两个非0的规范浮点数的间隔很小,而最小规约浮点数与0的间隔很大,差距是23倍。
3.3,引入非规约形式的浮点数,可以使得0与最小规约浮点数的间隔变得均匀起来,并且间隔与两个相邻规约浮点数的间隔一致。
两个非规约浮点数的间隔都是0.000...1 * 2 ^ -126 = 2 ^ -149。
3.4,最大的非规约数是0.111...111 * 2 ^ -126,最小的规约数是1.000..0 * 2 ^ -126;
最大的非规约总是小于最小的规约数,也可以认识近似相等。
4,浮点数舍入
4.1,四舍六入五成双。
Math.Round()
4.2,向0(截断)舍入
整型强制转换
4.3,向负无穷大
Math.Floor()
4.4,向正无穷大
Math.Ceiling()