目录
引言
1.浮点数的表示
1.1浮点数的作用和基本原理
1.2浮点数规格化
左规
右规
2.IEEE 754 标准
2.1图示:
2.2 阶码的全零全一有特殊含义:
2.3 IEEE 754 表示的范围:
2.4 十进制转IEEE 754:
2.5 IEEE 754转十进制:
3.浮点数的加减运算
①对阶
②尾数加减
③规格化
④舍入
⑤判溢出
4.C语言的强制类型转换
无损
有损
引言
浮点数(floating-point number)是一种用于表示实数的计算机数据类型,可以表示非常大或非常小的数,同时也可以表示带小数的数。浮点数通常用科学计数法表示,其中包含一个有效数字和一个指数。例如,3.14可以表示为3.14×10^0,而3000可以表示为3.0×10^3。
浮点数的表示方式通常如下: 浮点数=有效数字×10指数\text{浮点数} = \text{有效数字} \times 10^{\text{指数}}浮点数=有效数字×10指数 在计算机中,浮点数一般遵循IEEE 754标准,该标准定义了浮点数的表示格式。
具体实例: 假设我们需要表示数字123.456。
在科学计数法中,这个数字可以表示为: 1.23456×1021.23456 \times 10^21.23456×102
在IEEE 754单精度浮点数(32位)中,该数字的表示方式如下:
符号位(1位):0 表示正数,1 表示负数。指数部分(8位):表示指数部分。尾数部分(23位):表示有效数字的小数部分。
我们来具体计算这个例子:
将123.456转换为二进制形式:
整数部分123转换为二进制:1111011小数部分0.456转换为二进制:0.0111011111...组合起来:1111011.0111011111... 转换为标准化形式(科学计数法形式):1.1110110111011111... × 2^6
其中,1.1110110111011111... 是有效数字,6 是指数。 指数部分加上偏移量(127,对于单精度浮点数):6 + 127 = 133
转换为二进制:133 = 10000101 尾数部分截取23位:1110110111011111...
最终,浮点数的表示为:
符号位:0指数部分:10000101尾数部分:1110110111011111...
整个32位浮点数的二进制表示如下: 0 10000101 11101101110111110 \, 10000101 \, 11101101110111110100001011110110111011111
这是一个具体的浮点数表示实例,展示了如何在计算机中表示和存储浮点数。
1.浮点数的表示
1.1浮点数的作用和基本原理
定点数可以表示的数字范围有限,但我们又不能无限制的增加数据的长度。
浮点数就可以做到在二进制位数不变的情况下增加数据的表示范围。
1.2浮点数规格化
在整体存储空间不变的情况下尽可能多的保存更多的精度。
例如十进制的科学表示法会要求尾数部分的最高位是有效值:
左规
当浮点数运算的结果为非规格化时要进行规格化处理,将尾数算数左移一位,阶码减1。
可能会导致阶码下溢。
右规
当浮点数运算的结果尾数出现溢出(双符号位为01或10)时,将尾数算数右移一位,阶码加1。
可能会导致阶码上溢出。
2.IEEE 754 标准
2.1图示:
类型数符阶码位数数值总位数偏置值十六进制十进制短浮点数(float)1823327FH127(2^(8-1)-1)长浮点数(double)11152643FFH1023(2^(11-1)-1)临时浮点数(long double)11564803FFFH16383(2^(15-1)-1)
2.2 阶码的全零全一有特殊含义:
阶码尾数表示全为0不全为0表示非规格化小数±(0.xx..x)ⅹ2^-126 全为0全为0表示真值±0全为1全为0无穷大±∞全为1不全为0表示非数值“NaN”(NotaNumber)
2.3 IEEE 754 表示的范围:
格式数值码值单精度最大绝对值2^128 - 2^1040 11111110 1111 1111 1111 1111 1111 111最小绝对值2^(-126)0 00000001 0000 0000 0000 0000 0000 000双精度最大绝对值2^1024 - 2^9710 11111111110 1*52 最小绝对值2^(-1022)0 00000000001 0*52
解释:
单精度浮点数格式有1位符号位,8位指数位,23位尾数位(但有效数字是24位,因为有一个隐含的1)。
最大指数是 254 (即 11111110),但减去偏移量 127 得到 127,所以最大的实际指数是 127。最大的尾数是 1.11111111111111111111111,即 2 - 2^-23。
IEEE 754单精度浮点数的尾数部分是一个24位的二进制数,包括一个隐含的1位。也就是说,尾数可以表示为1.xxx...xxx,其中xxx...xxx表示尾数的23位。
当尾数的23位全是1时,这个数值表示的是最大的尾数值:
这个数值可以写成:
这是一个几何级数,其总和是:
这个级数可以表示为:
即:
因此,当尾数的23位全是1时,其值为:
2.4 十进制转IEEE 754:
将-0.75转换为IEEE 754单精度浮点数格式表示。
数符:负数为1;
尾数:(-0.75)10 = (-0.11)2 = (-1.1 ✖ 2^-1)2 为 1000 0000 0000 0000 0000 000 因为自动代表最前头有个1.
阶码:-1 转为移码表示 -1+127 = (126)10 = (0111 1110)2
IEEE754:
0 1 89 3210111 11101000 0000 0000 0000 0000 000
2.5 IEEE 754转十进制:
将IEEE754 的单精度浮点数C0A00000H 化为十进制数:
先化为二进制: 1100 0000 1010 0000 0000 0000 0000 0000
数符:1,是个负数
阶码:(1000 0001)2 = (129)10 129 - 127 = 2
尾数:1.01 (自动前头表示的有个零)
(1.01)2乘以2^2= (101)2 = 5
是个负数,所以结果是 -5
3.浮点数的加减运算
以2009年考研题为例:
【2009 统考真题】浮点数加、减运算过程一般包括对阶、尾数运算、规格化、舍入和判
断溢出等步骤。设浮点数的阶码和尾数均采用补码表示,且位数分别为5和7(均含2位符号位)。若有两个数X=2^7×29/32和Y=2^5×5/8,则用浮点加法计算X+Y的最终结果是(D)。
A. 00111 1100010 B. 00111 0100010
C. 01000 0010001 D.发生溢出
先将xy化为对应二进制浮点数:
X:
00111 0011101
Y:
00111 0000101
①对阶
小阶对大阶
我们在最开始就化好了
②尾数加减
0011101
+0000101
——————
0100010
00111 0100010
③规格化
01000 0010001
④舍入
无舍入
⑤判溢出
阶码符号位01,溢出,故选D选项。
4.C语言的强制类型转换
类型16位机器32位机器(考研常考)64位机器char888short161616int163232long323264long long646464float163232double646464
无损
char → int → long →double,数值位完全够用,既不会损失精度也不会溢出
有损
int → float 可能会损失精度
float → int ,可能溢出,也可能损失精度