Java浮点数使用的是IEEE二进制浮点数算术标准。
浮点数分为符号,指数,分数三部分。以32位浮点数为例,分为1符号位+8指数位+23分数位。
1(bit) | 8(bit) | 23(bit) |
---|---|---|
符号 | 指数 | 分数 |
以173.7为例:
173.7为正数,故符号位为0
0 00000000 00000000000000000000000
将其转换成1.??? * 2^?形式
1 | 173.7/2=86.85 2^1 |
最终格式为1.35703125*2^7 ,指数位的值为7,由于指数部分是由Bias偏移量来表示的,float的偏移量为Bias=2^k-1 -1=2^8-1 -1=127,做指数部分的值为127+7=134,134的二进制值为 1000 0110,则符号位+指数为存储格式如下:
0 1000 0110 00000000000000000000000
计算尾数部分,由于浮点数最终都是以1.??? * 2^?的形式保存的,小数点左边永远是1,所以我们只需关心小数点后面部分
Number | X2 | 1/0 |
---|---|---|
0.35703125 | 0.7140625 | 0 |
0.7140625 | 1.428125 | 1 |
0.428125 | 0.85625 | 0 |
0.85625 | 1.7125 | 1 |
0.7125 | 1.425 | 1 |
0.425 | 0.85 | 0 |
0.85 | 1.7 | 1 |
0.7 | 1.4 | 1 |
0.4 | 0.8 | 0 |
0.8 | 1.6 | 1 |
0.6 | 1.2 | 1 |
0.2 | 0.4 | 0 |
0.4 | 0.8 | 0 |
由于到了0.4这一步这边是会个循环,0110 0110 …
加上尾数部分,最终存储格式如下:
0 1000 0110 01011011011001100110011
我们可以通过Float.floatToIntBits(173.7)
来验证结果:
1 | Float.floatToIntBits(173.7) = 1127068467 |