嵌入式开发 | C语言 | 单精度浮点数4字节可以表示的范围计算过程
单精度浮点数4字节表示范围计算过程
- 🌟 第一步:计算机只能存 0 和 1
- 📌 第二步:整数怎么存?(回顾)
- 🌊 第三步:那小数和大数怎么办?→ 引入“科学计数法”【十进制】
- 💻 第四步:计算机也想用“科学计数法” → 但用二进制!
- 📏 第五步:问题来了 —— 大家怎么统一格式?
- 🔧 第六步:IEEE 754 单精度浮点数(也就是 C 语言的 `float`)
- 🤔 第七步:什么是“指数”?为什么需要它?
- 🧮 第八步:指数怎么存?—— 引入“偏移量(Bias)”
- ⚠️ 第九步:两个特殊值:E=0 和 E=255
- 📈 第十步:计算 `float` 的最大值!
- 🔢 第十一步:把 2¹²⁸ 换算成十进制!
- 🧠 最后总结(给小白的终极版)
- 💡 附加小知识
从零开始、一步一步、用最生活化的语言,带你彻底搞懂:
- 什么是浮点数?
- 为什么需要 IEEE 754?
- 什么是“指数”?
- 为什么浮点数的范围和“指数”有关?
- 最终,
float的 ±3.4×10³⁸ 是怎么来的?
进入前需要有一个意识转换的过程:
- 理解权重的概念

🌟 第一步:计算机只能存 0 和 1
计算机的内存、硬盘、CPU,所有东西都由二进制位(bit) 组成 —— 要么是 0,要么是 1。
所以,任何数据(数字、文字、图片)都必须转换成 0 和 1 的组合才能存进去。
📌 第二步:整数怎么存?(回顾)
比如整数 5,用二进制是 101。
如果用 32 位(4 字节)存,就是:
00000000 00000000 00000000 00000101
这种叫 定点数(Fixed-point):小数点位置固定(比如在最右边),所以只能表示整数。
✅ 优点:简单、精确
❌ 缺点:不能表示小数!也不能表示特别大或特别小的数(比如 0.0000001 或 1000000000000)
🌊 第三步:那小数和大数怎么办?→ 引入“科学计数法”【十进制】
人类早就解决了这个问题!我们用 科学计数法:
- 地球质量 ≈
5.97 × 10²⁴千克 【十进制】 - 电子质量 ≈
9.1 × 10⁻³¹千克 【十进制】
你会发现:任何实数都可以写成:
± 尾数 × 基数^指数
- 尾数(Mantissa):
5.97、9.1→ 一个“标准化”的小数(通常 1 ≤ |尾数| < 10) - 基数(Base):这里是 10(十进制)
- 指数(Exponent):
24、-31→ 控制数量级
💡 指数决定了这个数“有多大”或“有多小”!
💻 第四步:计算机也想用“科学计数法” → 但用二进制!

计算机不用十进制,用二进制,所以它的“科学计数法”是:
± 尾数 × 2^指数
例如:
-
5.0=1.25 × 2²→ 因为 1.25 × 4 = 5

-
0.125=1.0 × 2⁻³→ 因为 1 ÷ 8 = 0.125

可以由上述观察到两个指数的位置是待定: 一个是2 一个是-3 转换成二进制 一个是00000001【八位】,那另一个呢?3可以转换,但是前面的负号呢?这就是指数存储的问题,请继续往下看
✅ 这样,一个小数 + 一个指数,就能表示极大或极小的数!
这种表示法就叫 浮点数(Floating-point number) —— 因为“小数点的位置是浮动的”,由指数决定。
📏 第五步:问题来了 —— 大家怎么统一格式?
如果每个公司、每个程序员都用自己的方式存浮点数,那程序就无法通用!
于是,1985 年,IEEE(电气电子工程师学会)制定了一个标准:
IEEE 754:浮点数的国际标准
它规定了:
- 用多少位存符号?
- 用多少位存指数?
- 用多少位存尾数?
- 怎么处理 0、无穷大、错误值?
从此,全世界的计算机(Windows、Mac、手机、航天器)都用同一套规则!
🔧 第六步:IEEE 754 单精度浮点数(也就是 C 语言的 float)
在 IEEE 754 中,大多数浮点数是“规格化数”(Normalized),它的公式是:
值 = (-1)^S × (1.M) × 2^(E - 127)
✅ 正常情况下,E 的取值范围是 1 到 254,对应真实指数 -126 到 +127
float 在内存中占 32 位(4 字节),按如下方式划分:
| 部分 | 位数 | 作用 |
|---|---|---|
| 符号位(S) | 1 位 | 0 = 正数,1 = 负数 |
| 指数(E) | 8 位 | 存“指数”的编码值(不是真实指数!) |
| 尾数(M) | 23 位 | 存小数部分(隐含一个前导 1) |
这里存在多种名称:符号码,阶码,尾数码,请关注本质问题
总:1 + 8 + 23 = 32 位 ✅
🤔 第七步:什么是“指数”?为什么需要它?
回到科学计数法:
数值 = 尾数 × 2^指数
- 尾数 决定了“精度”(比如 1.23456789)
- 指数 决定了“范围”(比如 10¹⁰⁰ 还是 10⁻¹⁰⁰)
👉 没有指数,你就没法表示“很大”或“很小”的数!
举个极端例子:
- 你想存
0.000000000000000000000000000000000001 - 如果不用指数,你需要几百位小数!
- 但用指数:
1.0 × 2⁻¹²⁰→ 只需存“1.0”和“-120”就够了!【这里的指数是近似举例,核心是逻辑】
所以:指数 = 控制数字“数量级”的开关!
🧮 第八步:指数怎么存?—— 引入“偏移量(Bias)”
问题:指数可以是负数(如 -126),但计算机的 8 位只能存 0~255(无符号)。
解决方案:加一个“偏移量”!
- IEEE 754 规定:单精度的偏移量 = 127
- 存的时候:存储值 = 真实指数 + 127
- 读的时候:真实指数 = 存储值 - 127
例如:
| 真实指数 | 存储的 E(8 位) |
|---|---|
| -126 | -126 + 127 = 1 → 00000001 |
| 0 | 0 + 127 = 127 → 01111111 |
| +127 | 127 + 127 = 254 → 11111110 |
✅ 这样,8 位就能表示 -126 到 +127 的指数!
- 上述计算中的待定结果


⚠️ 第九步:两个特殊值:E=0 和 E=255
为了表示一些特殊情况,IEEE 754 保留了两个极端值:
| E 的值 | 含义 |
|---|---|
0(00000000) | 表示 0 或 非常接近 0 的数(非规格化数) |
255(11111111) | 表示 无穷大(∞) 或 错误(NaN,比如 0/0) |
所以,正常数字的 E 只能是 1 到 254!
这里我是有疑惑的为什么呢 怎么就不能是0 和 255呢?是这两个数字又如何呢?
结论就是需要计算机表示0 和 无穷的概念
给个链接帮助理解: 为什么规格化数中指数位E不能是E=0 或 E=255?
📈 第十步:计算 float 的最大值!
现在我们来算最大正数:
- 符号位 S = 0(正数)
- 指数 E = 254(最大可用值)
- 真实指数 = 254 - 127 = 127
- 尾数 M = 全 1(23 个 1)
- IEEE 754 规定:尾数实际是 1.M(隐含前导 1)
- 所以最大尾数 =
1.111...111(23 个 1) - 这个值 = 2 - 2⁻²³(因为 0.111…111₂ = 1 - 2⁻²³)【这里用到了大学数学知识】

值 = (-1)^S × (1.M) × 2^(E - 127) 1.M = 1 + 0.M
所以最大值 = = (2 - 2⁻²³) × 2¹²⁷ ≈ 2 × 2¹²⁷ = 2¹²⁸
🔢 第十一步:把 2¹²⁸ 换算成十进制!
我们知道:
- 2¹⁰ = 1024 ≈ 10³
- 所以 2¹²⁸ = (2¹⁰)¹² × 2⁸ ≈ (10³)¹² × 256 = 10³⁶ × 256 = 2.56 × 10³⁸
但更精确计算:
- 2¹²⁸ = 340282366920938463463374607431768211456
- 科学计数法:3.402823669… × 10³⁸
所以,我们说:
float 的范围是 ±3.4 × 10³⁸
🧠 最后总结(给小白的终极版)
| 问题 | 答案 |
|---|---|
| 什么是浮点数? | 用“科学计数法”表示的数,能存小数、极大数、极小数 |
| 为什么叫“浮点”? | 因为小数点位置不固定,由“指数”决定 |
| IEEE 754 是什么? | 全世界统一的浮点数存储标准 |
float 占多少位? | 32 位:1 位符号 + 8 位指数 + 23 位尾数 |
| 什么是指数? | 控制数字“数量级”的部分,决定是 10¹⁰⁰ 还是 10⁻¹⁰⁰ |
| 为什么需要指数? | 没有它,计算机无法高效表示极大或极小的数 |
| ±3.4×10³⁸ 怎么来的? | 最大尾数 × 2^最大指数 ≈ 2¹²⁸ ≈ 3.4×10³⁸ |
💡 附加小知识
double(双精度):64 位,范围更大(±1.8×10³⁰⁸),精度更高- 浮点数不精确!比如
0.1 + 0.2 != 0.3(因为二进制无法精确表示 0.1) - 所以不要用
==比较浮点数,要用“误差范围内相等”
