一、浮点数的介绍
单精度float :小数点后6位
双精度double :小数点后12位
在c语言中将后缀为f或者F的浮点常量当作float型。如12.3f、23.44F
没有后锥的浮点常量当作double类型。如sizeof(1.333)= 8
有后缀l或L的浮点常量当作long double ,如432.44L、23.22l
对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit
二、浮点数的组成
浮点数二进制表示有三个部分(32)
- 符号位部分(1bit) 0-正数 1-负数
- 指数部分(8bit) 2^7-1 ==127 根据127进行偏移
- 基数部分(23bit)浮点数具体数值的实际表达
单精度浮点数计算公式:(-1)S * (1 + 有效位) * 2(阶码-127)
双精度浮点数计算公式:(-1)S * (1 + 有效位) * 2(阶码-1023)
单精度的指数部分是-126~~+127加上127,指数值的大小从1~254(0和255是特殊值)
单精度:
共占32 bit位;
移码的偏置值为127;
规格化阶码范围为:0000 0001(1)~1111 1110(254),全0和全1用来表示特殊值
双精度:
共占64 bit位,移码的偏置值为1023
三、浮点数与十六进制相互转换
1.浮点数转换为十六进制
-
- 将十进制转换为二进制
- 将二进制转换为科学计数法(2)
- 构造浮点数二进制原型
- 重新组合并由二进制转换为十六进制
1、将6.91转换成二进制形式,有效位长为31(8+23)
-> 整数:6(10进制) -- 110(2进制,实际位长为3)
-> 小数:0.91(10进制)-- 111010001111010111000(2进制,实际位长21(23-3+1))
小数转换为二进制的方法:小数部分乘以2,取整数部分依次从左往右放在小数点后,直至小数点后为0。
0.91 * 2 = 1.82 ... 1
0.82 * 2 = 1.64 ... 1
0.64 * 2 = 1.28 ... 1
0.28 * 2 = 0.56 ... 0
0.56 * 2 = 1.12 ... 1
0.12 * 2 = 0.24 ... 0
0.24 * 2 = 0.48 ... 0
0.48 * 2 = 0.96 ... 0
0.96 * 2 = 1.92 ... 1
0.92 * 2 = 1.84 ... 1
0.84 * 2 = 1.68 ... 1
0.68 * 2 = 1.36 ... 1
0.36 * 2 = 0.72 ... 0
0.72 * 2 = 1.44 ... 1
0.44 * 2 = 0.88 ... 0
0.88 * 2 = 1.76 ... 1
0.76 * 2 = 1.52 ... 1
0.52 * 2 = 1.04 ... 1
0.04 * 2 = 0.08 ... 0
0.08 * 2 = 0.16 ... 0
0.16 * 2 = 0.32 ... 0
至此,6.91的二进制为:110.111010001111010111000
2、将原始二进制值规范化:调整使其实数的第一位大于1小于2
6.91 = 1.10111010001111010111000*2^2
3、构造浮点数的二进制原型
S: 0
Exp: 2 + 127(10进制) = 129(10进制) = 10000001(2进制)
Fraction: 10111010001111010111000 (注意:小数点前面的1不要了)
4、重新组合并由二进制转换成十六进制
0 10000001 10111010001111010111000
= 0100 0000 1101 1101 0001 1110 1011 1000
= 4 0 D D 1 E B 8
即6.91的十六进制为0x40DD 1EB8
负数
将 -12.75 转换为二进制表示:
整数部分 12= 1100
小数部分 75=11
第三步将数规格化 1100.11=1.10011 * 2^3
注意这里的3是 x - 127 = 3
所以 x = 130 = 127+3=128 + 2 =1000 0010B
最终存储为:1100 0001 0100 1100 0000 0000 0000 0000
C 1 4 C 0 0 0 0
2.十六进制转换为浮点数
- 十六进制转换为二进制
- 分离浮点数二进制原型
- 取有效位+1还原为浮点数二进制
- 注意符号位