32位浮点数16777216.0f 加 1 为什么不是 16777217.0f ?
16777216二进制表示:
<1 00000000 00000000 00000000>
16777217二进制表示:
<1 00000000 00000000 00000001>
32位浮点数其中1位表示符号位,8位表示指数位,23位表示小数位。
加上隐含的1位小数位,隐含的这位总是1,并不存储,所以一共可以表示24位小数位。
16777217一共是25位,就需要进行取舍。这里是舍去末尾的1。
16777216.0f的二进制表示:
<01001011 10000000 00000000 00000000>
16777217.0f的二进制表示同样是:
<01001011 10000000 00000000 00000000>
舍去了末尾的1。
再比如:16777220.0f的二进制表示:
<01001011 10000000 00000000 00000010>
16777221.0f的二进制表示同样也是:
<01001011 10000000 00000000 00000010>
以上是舍弃末尾1的情况。
同样也有进位的情况。
比如:16777218.0f 加 1 结果是 16777220.0f。
16777219的二进制表示:
<1 00000000 00000000 00000011>
末尾的1向前进位:
<1 00000000 00000000 00000100>
末尾的1是否进位,要看它的前一位是1还是0。
如果1的前一位是0,则不进位,如果1的前一位是1,则进位。
这就是所谓的中值取偶原则。
网友评论