32位浮点类型有效数字
单精度浮点类型有效数字为7位,是指数字存储过大导致尾数位存储溢出而失去精度,成功保留下来的真实数字。例如:存储16777217(2^24+1)时,程序中实际存储的是其实是16777216,而 16777217 与 16777216 只有最后1位数字是不相同的,其余的7位数字都是相同的,这代表单精度浮点类型的有效数字为7位。
精度丢失
存储16777216(2^24)时,尾数位已经达到了24位,超出1位了,而超出的那1位将会被省略掉,但是指数位上却依然记住它的是24位,因此在存储时会将省略掉的尾数当做零处理;即便你存储的是11111111,它也会全部把它当做0处理,即00000000,所以此时就有可能出现存储的数据与实际浮点是的值有差异,但是因为被省略掉的是0的原因,所以 16777216 并没有受到影响。
但是,如果我们存储 16777217 ,此时被省略掉的那一位是1,所以它的值已经发生变化了。
我们用格式化输出方法打印一下,发现它打印出来的值竟然是16777216,最后1位数字的精度已经丢失。
这个原因很简单,不管是16777216还是16777217,它们都被省略掉了最后一位;不管最后一位是1还是0,程序都把它当做0来处理,所以它们在程序中是没有差别的。因此我们得出一个结论,那就是不管是整数还是小数,存储到单精度浮点类型中,只要规范化超过24位,就有可能出现精度丢失的问题。
浮点数间隔
既然我们已经初步了解了精度丢失问题,不妨我们想一下,“这个精度丢失是不是可控的?它会以一个什么样趋势开始丢失精度?这其中有没有规律?”,要解答着这些问题,我们需要了解一些概念,那就是浮点数间隔。浮点数在计算机程序中是有间隔的,这个间隔是指在小数中的某个范围内的两个相邻的小数之间是存在的间隔,我们在计算机中只能存储这间隔之外的小数,无法存储间隔内的小数,例如ÿ