float 精度怎么算
float 英文中意为悬浮,在计算机领域叫做单精度浮点数。计算机中一种变量类型所能存储的数据范围和精度大小主要受以下因素影响:①变量类型所用内存长度。②存储方式(和编程语言种类有关)。其实,几乎所有编程语言(包括主流的C,C++,Java,C#等)的浮点数都是遵循IEEE 754-2008 标准来计算和存储的,因此其实我们只要搞懂IEEE标准对Float的相关规定即可。
IEEE 754标准
1、IEEE 754规定了四种表示浮点数值的方式: 单精确度(32位 -> 4字节)、 双精确度(64位)、 延伸单精确度(43位以上,很少使用)、 延伸双精确度(79位元以上)。
2、二进制浮点数是以 符号+数值表示法 储存: 将最高位指定为符号位(sign bit);“指数部份”:即次高的e位 - 决定数值的数量级“小数部份”:即余下的f位 - 决定数值的浮动范围
3、最终数值计算公式: V=(-1)^s*(1+f)*2^E其中Value: float变量值 【32 位】sign:符号位 【1 位】Exponent:指数部分【 8位】fraction:尾数部分,小数点后的部分【23 位】
4、需要注意的地方:1、2作为幂底数,不是102、常用Mantissa表示 1+f 整体3、尾数中的1 和 底数2 是隐含在算法中的,并不会出现在变量中4、指数是有符号的,但并不是使用有符号整形(int)的存储方式,而是使用偏移(Offset)算法,对于单精度浮点数来说记住这个结论即可【指数值 = 指数部分二进制值 -127】5、一种比较好理解的方式: 我们试想将一个十进制数1.25 转化为浮点数,首先我们 将其转化为二进制形式 1.01
5、float精度墙绅褡孛数学领域中的精度一般指有效数字,是十进制位数,而计算机中的精度通常是指 二进制位数。一个前提:进制转换不会导致精度变化。浮点数的精度决定于尾数部分,而尾数占了23个二进制位,2^23转化为十进制数为 8388608(8个十进制位),因此有一种说法是float的十进制精度为 8 位,但是由于其并不能表示所有8位十进制数,因此也有种说法是其精度为7位。如果考虑得更周全一些的话,我们还忽略了尾数部分前默认接上的整数部分1,因此实际精度应该在刚刚的结论上+1.
特殊值的存储
1、0float类型中 0 有两种,即±0,且表现形式如下:sign = 0或1fraction = 0Exponent = 0
2、∞ - 无穷sign = 0或1 【分别表示正负无穷】fraction = 0Exponent = MAX 【十六进制下全为F】
3、NaN- 【Not a Number】在数学中没有这个概念,但是在计算机中这个值用来表示未定义或是无意义。sign = 0或1fraction = <任意非0值>Exponent =MAX 【十六进制下全为F】