文章目录
- 一、浮点型数据存储格式(IEEE 754 标准)
- 二、举例说明单精度浮点数存储过程
- 三、绘图说明
- 四、双精度浮点数存储示例(以1.5为例)
在 C 语言的世界里,数据类型丰富多样,而浮点型数据用于表示实数,在科学计算、图形处理等众多领域都有着不可或缺的地位。然而,浮点型数据在内存中的存储方式相较于整型数据更为复杂,今天就让我们一同深入探索这一奥秘。
一、浮点型数据存储格式(IEEE 754 标准)
在 C 语言中,单精度浮点数(float)和双精度浮点数(double)遵循 IEEE 754 标准存储。这一标准像是一本精心编写的规则手册,确保了不同计算机系统间浮点型数据表示的一致性。
V = (−1) ∗ S M ∗ 2 E
• (−1)S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M 表⽰有效数字,M是⼤于等于1,⼩于2的
• 2 E 表⽰指数位
单精度浮点数(float)
单精度浮点数占据 4 个字节,也就是 32 位的存储空间。它被划分为三个部分:1 位符号位(S)、8 位指数位(E)和 23 位尾数位(M)。
双精度浮点数(double)
双精度浮点数则占用 8 个字节,即 64 位。同样由三部分构成:1 位符号位(S)、11 位指数位(E)和 52 位尾数位(M)。
存储规则详解
符号位(S):就像一个简单的开关,0 代表正数,1 代表负数。通过这个符号位,计算机能够轻松判断浮点型数据的正负。
指数位(E):采用偏移码表示。对于单精度浮点数,偏移量为 127;对于双精度浮点数,偏移量为 1023。实际指数e在存储时,会被转化为E = e + 127(单精度)或E = e + 1023(双精度)。例如,如果实际指数为 3,那么在单精度存储中,指数位存储的值就是3 + 127 = 130,对应的二进制为10000010。
尾数位(M):用于表示小数部分。值得注意的是,在规格化的浮点数中,小数点左边有一个隐含的 1。也就是说,在实际存储时,只保存小数点后的数字。例如,对于单精度浮点数,存储的是小数点后的 23 位数字,而在还原数值时,需要加上这个隐含的 1。
二、举例说明单精度浮点数存储过程
存储3.14(float)
转换为二进制小数:
整数部分3转换为二进制是11。
小数部分0.14的转换过程较为复杂,通过不断乘以 2 取整数部分的方法:
0.14×2 = 0.28,取整数部分 0;
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.14的二进制近似表示为00100011110101110000101。
组合整数和小数部分得到11.00100011110101110000101,进一步写成规格化形式为1.100100011110101110000101×2^1。
确定各部分数值:
符号位:因为3.14是正数,所以S = 0。
指数位:实际指数e = 1,存储的指数E = e + 127 = 128,二进制表示为10000000。
尾数位:去掉规格化形式小数点左边的 1,得到100100011110101110000101(23 位)。
得出内存存储形式:
所以3.14在内存中的存储形式为0 10000000 100100011110101110000101(从左到右依次为符号位、指数位、尾数位)。
三、绘图说明
假设有一个单精度浮点数(3.14),其在内存中的存储方式如下:
• 转换为二进制:
• (3.14)的二进制表示为(11.00100011110101110000101)。
• 规格化后,表示为(1.100100011110101110000101\times 2^1)。
• 确定各部分:
• 符号位:正数,为0。
• 指数位:实际指数值为1,存储的指数值为(1+127=128),二进制表示为(10000000)。
• 尾数位:小数部分为(100100011110101110000101)。
• 内存中的存储:
• 符号位:0
• 指数位:10000000
• 尾数位:100100011110101110000101
四、双精度浮点数存储示例(以1.5为例)
转换为二进制:整数部分是1,二进制为1;小数部分0.5×2 = 1,得到二进制为1.1,写成规格化形式为1.1×2^0。
确定各部分数值:
符号位S = 0(正数)。
实际指数e = 0,存储的指数E = e + 1023 = 1023,二进制为01111111111。
尾数位去掉隐含的 1 后为1(后面补 0 达到 52 位),即10000000000000000000000000000000000000000000000000000。
得出内存存储形式:
所以1.5在内存中的双精度存储形式为0 01111111111 1000000000000000000000000000000000000000000000000000(从左到右依次为符号位、指数位、尾数位)。
浮点型数据在内存中的存储方式虽然复杂,但它为我们在计算机中精确表示和处理实数提供了可能。通过深入理解这一存储方式,我们能够更好地优化代码,避免因浮点数运算带来的精度问题。希望这篇博客能帮助大家在 C 语言的学习中,对浮点型数据的存储有更清晰的认识。