float的取值范围的计算
类型 存储需求 取值范围
float 4 字节 大约 ±3.40282347E+38F(有效位数为6-7位)
任意一个二进制浮点数V可表示成下面形式:
S表示符号位,E为指数为,M表示尾数
符号位1位
指数位8位
尾数为23位
根据IEEE float类型一共占4个字节共32位
最高位符号通过0/1来区分S为0时为正数,S为1时为负数。
E指数为8位,对于8位补码-128~127,可得到对应的阶码表示为0~255,其中0和255分别用来表示0和无穷大,1~254用来表示规范数字,即指数范围从-126到127,也就是说实际的指数等于指数位表示的数值减127;
M在计算机内部保存时整数部分固定为1,M的范围是[1.0,2.0)之间默认这个数的第一位可以被舍弃,所以float尾数其实不是23位而是24位
M尾数为为23位则取二进制1.1......1(小数点23为),则取到2-2^-23 约等于2.
所以V的绝对值最大为2^127*(2-2^-23)约等于2^128=3.4E+38。加上符号之后可表示为(3.4E+38)。
实际上尾数决定了浮点数的精度,尾数只有23位,加上省略的那位就是24位。如果一个int类型的值小于224,那么float是完全可以表示的。如果int类型大于224就不一定能表示了。假如一个int数值的二进制表示形式是100000000000000000000000,表示成指数形式是1.00000000000000000000000*223,对应的float的类型,尾数位全部为0,指数位是23+127=150,这样完全没有问题。假如一个int数值的二进制表示形式是1000000000000000000000001,表示成指数形式是1.000000000000000000000001*224,对应的float的类型尾数位是000000000000000000000001一共24位,这样就完全超出了float最多容纳23位尾数的能力。所以就不能正确表达这个int值了。由此也可以得出不能被float准确表达的最小int值是224+1。我们再将1000000000000000000000001的值加1,变成了1000000000000000000000010,这样变换为指数形式可以看出尾数又变为了23位,也就是说25位的二进制整数最后一位是0才能被float准确表示,每2个数就有一个不能被准确表示。如果是26位的二进制整数最后两位都是0才可以被float准确表达,每4个数就有3个不能被准确表示,以此类推。
现在再来回答为什么在编程的过程中似乎没怎么引起注意,这是因为,我们平时用的数值基本都小于224+1=16777217。
转自博客:https://www.cnblogs.com/LittleTiger/p/3969562.html(仅上面一段)
float和int数值差别大的原因:首先int类型在内存中存储是连续的差为1 例如 -1 0 1 2 3
而float在内存中存储并不是间隔固定的
并且float有8位指数位范围所以表示范围大。
float的有效位数是6-7位:10进制到2进制,2进制到10进制 转换,化得净的效数字7位,化不净的效数字6位,因为最后一位有舍入误差。