计算机如何存储浮点数?底层内部存储与运算原理技术问询
计算机浮点数的存储与运算逻辑
目前通用计算机的浮点数存储、运算基本都遵循IEEE 754标准,本质是把二进制科学计数法的各个组成部分拆分后固定长度存储,和整数的补码存储逻辑完全不同。
基础存储结构
最常用的两类浮点数的字段拆分规则如下:
- 32位单精度浮点数:1位符号位 + 8位指数位 + 23位尾数位
- 64位双精度浮点数:1位符号位 + 11位指数位 + 52位尾数位
每个字段的含义:
- 符号位:0表示正数,1表示负数,逻辑和整数符号位一致
- 指数位:存储偏移后的指数值,单精度偏移量为127,双精度偏移量为1023,用无符号数的形式表示正负指数
- 尾数位:只存储二进制科学计数法归一化后,小数点后的小数部分,整数部分默认固定为1无需存储,相当于多赚了1位有效数字的存储空间
实际转换示例
我们以12.375转32位单精度浮点数为例,演示完整转换流程:
- 先把十进制数转成二进制:
12.375转二进制结果为1100.011 - 做归一化处理,统一写成
1.xxxx * 2^n的标准形式:1100.011 = 1.100011 * 2^3 - 分别填充三个字段:
- 符号位:正数填0
- 指数位:实际指数是3,加上单精度偏移量127得到130,转8位二进制为
10000010 - 尾数位:取归一化后小数点后的
100011,末尾补0凑满23位,结果为10001100000000000000000
- 拼接后得到完整的32位存储值:
0 10000010 10001100000000000000000
特殊值规则
IEEE 754预留了特殊的字段组合表示非数值场景:
- 指数位全为1、尾数位全为0:表示无穷大(∞),符号位区分正无穷和负无穷
- 指数位全为1、尾数位不全为0:表示NaN(Not a Number),用来表示0除以0、负数开平方这类非法运算的结果
- 指数位全为0、尾数位不全为0:表示非归一化浮点数,用来表示非常接近0的极小值,解决下溢场景的精度问题
运算逻辑
浮点数运算的核心步骤是对齐指数、尾数运算、重新归一化:
- 先对比两个数的指数,把指数更小的数的尾数右移,直到两个数的指数一致,右移过程中超出尾数位长度的部分会按规则舍入
- 对对齐后的尾数做加减乘除运算
- 把运算结果重新归一化成标准的
1.xxxx * 2^n形式,同时检查溢出、下溢、精度损失等异常
这也是为什么浮点数经常出现精度丢失的问题:固定长度的尾数无法覆盖所有小数的二进制表示,运算过程中的舍入、截断都会带来误差。
内容的提问来源于stack exchange,提问作者Ruthvik
相关产品推荐
相关产品推荐

