一、浮点数概念
“定点”指的是约定小数点位置固定不变。那浮点数的浮点就是指小数点的位置是可以是漂浮不定的
科学计数法的方式来表示数值
十进制小数 1.345,用科学计数法表示,可以有多种方式:
1.345 = 1.345 * 10^0
1.345 =13.45 * 10^-1
1.345 = 134.5 * 10^-2
用这种科学计数法的方式表示小数时,小数点的位置就变得「漂浮不定」了,这就是相对于定点数,浮点数名字的由来。
使用同样的规则,二进制数,也可以用科学计数法表示,所以浮点数是采用科学计数法的方式来表示的
二、浮点数如何表示
1、科学计数法表示的浮点数
浮点数格式:F = (-1)^S * M * R^E
S:符号位,取值 0 或 1,决定一个数字的符号,0 表示正,1 表示负
M:尾数,用小数表示,1.345 * 10^2,1.345 就是尾数
R:基数,表示十进制数 R 就是 10,表示二进制数 R 就是 2。一般取2 8 16
E:指数,用整数表示, 10^2(10的2次幂),2 即是指数
2、计算机表示的浮点数
基本与科学计数法表示一致,名称有所不同
浮点数的格式:
符号 (S): 符号位 S 取值 0 或 1,用来决定浮点数的符号。
阶码 (E):阶码就是指数, 是一个二进制定点整数,用 n 位移码表示,其偏置值为
与定点数的移码偏置值相比,多减了 1
尾数 (M):尾数 M 是一个二进制定点小数,一般用原码定点小数表示。
**重要:**由于二进制浮点数要求规格化,因此尾数的最高位总是“1”,为了能使尾数多表示一位,将这个“1”隐藏,称为隐藏位。因此实际上 n 位尾数表示了 n+1 位有效数字。
举例:将十进制数 25.125 转换为浮点数:
整数部分:25(十) = 11001(二)
小数部分:0.125(十) = 0.001(二)
用二进制科学计数法表示:25.125(十) = 11001.001(二) = 1.1001001 * 2^4(二)
符号位 S = 0,
尾数 M = 1001001,由于二进制浮点数要求规格化,1.1001001,隐藏小数点前面的1,取小数点后面的部分,所以尾数M=1001001
指数 E = 4(十) = 100(二)。
3、浮点数表示标准-- IEEE754
IEEE 754是一种国际标准,用于定义二进制浮点数格式和相应的算术操作规则。该标准由IEEE(Institute of Electrical and Electronics Engineers,电气和电子工程师协会)制定,因此得名IEEE 754。
(1) 2 种标准浮点格式
单精度浮点数 float:32 位,符号位 S 占 1 bit,指数 E 占 8 bit,尾数 M 占 23 bit
双精度浮点数 double:64 位,符号位 S 占 1 bit,指数 E 占 11 bit,尾数 M 占 52 bit
(2)指数和尾数规定–重要
【1】尾数 M 的第一位总是 1(因为 1 <= M < 2),因此这个 1 可以省略不写,它是个隐藏位(前面提到过),
这样单精度 23 位尾数可以表示了 24 位有效数字,双精度 52 位尾数可以表示 53 位有效数字
【2】指数 E 是个无符号整数
表示 float 时,一共占 8 bit,所以它的取值范围为 0 ~ 255。
但因为指数可以是负的,所以规定在存入 E 时在它原本的值加上中间数 127,这样 E 的取值范围为 -127 ~ 128。
表示 double 时,一共占 11 bit,存入 E 时加上中间数 1023,这样E 的取值范围为 -1023 ~ 1024。
补充规定:
指数 E 非全 0 且非全 1:规格化数字,按上面的规则正常计算
指数 E 全 0,尾数非 0:非规格化数,尾数隐藏位不再是 1,而是 0(M = 0.xxxxx),这样可以表示 0 和很小的数
指数 E 全 1,尾数全 0:正无穷大/负无穷大(正负取决于 S 符号位)
指数 E 全 1,尾数非 0:NaN(Not a Number)
4、举例
(1)25.125的32位IEEE 754标准下的 浮点数表示
【1】将25.125表示为二进制:
整数部分:25的二进制表示为11001。
小数部分:0.125的二进制表示为0.001。
合并整数部分和小数部分:11001.001。
【2】规格化二进制数
即将小数点左移,直到只剩下一个1作为整数部分,记录移动的位数。
11001.001,小数点左移动4位,得到1.1001001。
确定指数部分:移动了4位,因此指数部分为移动前指数的位置加上偏置值,偏置值为127(对于单精度浮点数)。
指数部分 = 移动前指数 + 偏置值 = 4 + 127 = 131,其二进制表示为10000011。
尾数部分:为移动后小数部分的小数点后的部分,隐藏小数点前面的1,即1001001。
因此,25.125的32位IEEE 754浮点数表示为:
0 10000011 10010010000000000000000
(2)将 十进制 “-8.25” 转换为 IEEE 754 标准下的 32 位单精度浮点数
首先需要确定符号位、指数位和尾数位。
符号位:-8.25是负数,所以符号位为1。
整数部分:8的二进制表示为1000。
小数部分:0.25的二进制表示为0.01。
合并整数部分和小数部分:1000.01。
规格化:将小数点左移动,直到只剩下一个1作为整数部分,并记录移动的位数。
1000.01 小数点左移动3位,得到1.00001。
指数部分:移动了3位,指数部分为移动前指数的位置加上偏置值。偏置值为127(对于单精度浮点数)。
指数部分 = 移动前指数 + 偏置值 = 3 + 127 = 130,其二进制表示为10000010。
尾数部分:为移动后小数部分的小数点后的部分,即00001。
因此,-8.25的32位IEEE 754浮点数表示为:
1 10000010 00001000000000000000000
按间隔四位划分,转化为16进制:
1100,0001,0000,0100,0000,0000,0000,0000 = C104,0000H
(3)将32 位单精度浮点数 0,1000 0011,01001001100000000000000 转换为十进制小数
0 1000 0011 01001001100000000000000
符号位 阶码 尾数
符号位 : 0(正数)
尾数 : .010010011(隐含最高位 1)= (1.010010011)2 = (1 + 2-2 + 2-5 + 2-8 + 2-9)10 = (1 + 0.25 + 0.03125 + 0.00390625 + 0.001953125)10 = (1.287109375)10
阶码 :1000 0011(二) = 131(十),阶码的偏移量 = 127,阶码真值 = 131-127 = 4
十进制小数 = 1.287109375 * 2^4 = 20.59375