java和C都遵循IEEE 754浮点数标准wiki介绍. 先来回顾一下科学记数法, 比如123
这个数字, 使用科学记数法, 可以写作:
1.23 x 102
计算机的世界都是二进制的, 123的二进制为1111011, 可以记为:
1.111011 x 26
其中整数位1为固定值, 有效信息有小数位0.111011和指数6
双精度的浮点数的表示方式为:
63 62 .... 52 51 ...... 0
符号位sign 指数偏移exp(11bit) 小数fraction(52bit)
区域 | 说明 |
---|---|
符号位 | 0为正数, 1表示负数 |
指数偏移 | 实际指数+1023, 这么做是为了将负指数转换成正值; 对于数字0, 这个值为0 |
小数 | 小数点后面的二进制; 对于数字0, 则全为0 |
继续以double
类型的123举例
sign = 0
exp = 1023 + 6 = 1029 = 10000000101B, 不足11bit, 则在前面补0
fraction = 111011, 不足52bit, 则在后面补0
完整的二进制形式为
0 1000000 0101 1110 11 00 00000000000000000000000000000000000000000000
转换成16进制为 40 5E C0 00 00 00 00 00
在小端字节序的系统上(低位存放在低字节上), 显示为 00 00 00 00 00 C0 5E 40
计算double能表达的最大值
指数能达到的最大值为211-1023 = 1024,
因此double最大值为1.fffffffffffff x 21024 = 1.7976931348623157e+308