使用 IEEE 754 规定的【双精度浮点数】, 8个字节 64位二进制
一、双精度与单精度浮点数的区别
单精度 4个字节 32位二进制 包括符号位1位,阶码8位,尾数23位
双精度 8个字节 64位二进制 包括符号位1位,阶码11位,尾数52位所存的数值范围不同:
单精度浮点数的数值范围为-3.4E38~3.4E38,而双精度浮点数可以表示的数字的绝对值范围大约是:-2.23E308 ~ 1.79E308。E表示10的多少次方,如3.4E38指的是3.4乘以10的38次方。十进制下的位数不同:
单精度浮点数最多有7位十进制有效数字,如果某个数的有效数字位数超过7位,当把它定义为单精度变量时,超出的部分会自动四舍五入。
双精度浮点数可以表示十进制的15或16位有效数字,超出的部分也会自动四舍五入。
二、8位二进制的的范围
1111 1111 = 无符号 2^8-1 = 255
0111 1111 = 有符号(0代表正数) 最大是127 2^7-1
1000 0000 有符号(1代表负数) 最小是-128
三、64位浮点数存储详解
双精度 8个字节 64位二进制 包括符号位1位,阶码11位,尾数52位:
第1位:符号位,0表示正数,1表示负数
第2位到第12位(共11位): 有偏指数部分
第13位到第64位(共52位):小数部分(即有效数字)
类型划分:11位的指数部分可存储00000000000 ~ 11111111111(十进制范围为0 ~ 2047),取值可分为3种情况:
(1)11位指数不为00000000000和11111111111,即在00000000001 ~ 11111111110(1 ~ 2046)范围,这被称为【规格化】。
(2)指数值为00000000000(0),这被称为【非规格化】
(3)指数值为11111111111(2047),这是特殊值,有两种情况:
当52位小数部分f全为0时,若符号位是0,则表示+Infinity(正无穷),若符号位是1,则表示-Infinity(负无穷)
当52位小数部分f不全为0时,表示NaN(Not a Number)
(-1)^符号位 * 1.xx…xx * 2^(e-1023)
1023为移码,移码值为 2^(n−1)−1,这里的n表示指数位数,对于64bit的双精度存储,n是11
2^(11-1) - 1 = 2^10 - 1 = 1023
(1)在规格化中,当指数e最大(前10位为1,11位为0,即2046)且小数f最大(52位全为1)时,能表示出最大正值,为
1.111...111 * 2^1023
52个1
转化成十进制为 1.7976931348623157 * 10^308,则能表示的最小负值为-1.7976931348623157e+308
(2)在非规格化中,当指数e最小(前10位为0,11位为1,即1)且小数f最小(前51位全为0,52位为1)时,能表示出最小正值,为
0.000...01 * 2^-1022 0.000000⋯000001
第52位为1 1073个0
转为十进制值为5e-324,则最大负值为-5e-324
(3)整数范围(精确整数,无精度丢失)
当 e - 1023 = 52,即e = 1075,小数f最大(52位全为1)时,能表示出最大安全正整数,为
1.111...111 * 2^52
52个1
转为十进制值为 2^53−1 = 9007199254740991,则能表示的最小安全负整数为-9007199254740991
(4)总结
[−1.7976931348623157 * 10^308, −5 * 10^−324] ∪ [5* 10^−324, 1.7976931348623157 * 10^308]
超过1.7976931348623157E+308为Infinity,小于-1.7976931348623157E+308为-Infinity,在(-5E-324,5E-324)之间的数显示为0