嵌入式开发 | C语言 | 单精度浮点数4字节可以表示的范围计算过程

单精度浮点数4字节表示范围计算过程

    • [🌟 第一步:计算机只能存 0 和 1](#🌟 第一步:计算机只能存 0 和 1)
    • [📌 第二步:整数怎么存?(回顾)](#📌 第二步:整数怎么存?(回顾))
    • [🌊 第三步:那小数和大数怎么办?→ 引入"科学计数法"【十进制】](#🌊 第三步:那小数和大数怎么办?→ 引入“科学计数法”【十进制】)
    • [💻 第四步:计算机也想用"科学计数法" → 但用二进制!](#💻 第四步:计算机也想用“科学计数法” → 但用二进制!)
    • [📏 第五步:问题来了 ------ 大家怎么统一格式?](#📏 第五步:问题来了 —— 大家怎么统一格式?)
    • [🔧 第六步:IEEE 754 单精度浮点数(也就是 C 语言的 `float`)](#🔧 第六步:IEEE 754 单精度浮点数(也就是 C 语言的 float))
    • [🤔 第七步:什么是"指数"?为什么需要它?](#🤔 第七步:什么是“指数”?为什么需要它?)
    • [🧮 第八步:指数怎么存?------ 引入"偏移量(Bias)"](#🧮 第八步:指数怎么存?—— 引入“偏移量(Bias)”)
    • [⚠️ 第九步:两个特殊值:E=0 和 E=255](#⚠️ 第九步:两个特殊值:E=0 和 E=255)
    • [📈 第十步:计算 `float` 的最大值!](#📈 第十步:计算 float 的最大值!)
    • [🔢 第十一步:把 2¹²⁸ 换算成十进制!](#🔢 第十一步:把 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.979.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),它的公式是:

go 复制代码
值 = (-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 的值 含义
000000000 表示 0非常接近 0 的数(非规格化数)
25511111111 表示 无穷大(∞)错误(NaN,比如 0/0)

所以,正常数字的 E 只能是 1 到 254

这里我是有疑惑的为什么呢 怎么就不能是0 和 255呢?是这两个数字又如何呢?
结论就是需要计算机表示0 和 无穷的概念
给个链接帮助理解: 为什么规格化数中指数位E不能是E=0 或 E=255?


📈 第十步:计算 float 的最大值!

现在我们来算最大正数:

  1. 符号位 S = 0(正数)
  2. 指数 E = 254 (最大可用值)
    • 真实指数 = 254 - 127 = 127
  3. 尾数 M = 全 1(23 个 1)
    • IEEE 754 规定:尾数实际是 1.M(隐含前导 1)
    • 所以最大尾数 = 1.111...111(23 个 1)
    • 这个值 = 2 - 2⁻²³ (因为 0.111...111₂ = 1 - 2⁻²³)【这里用到了大学数学知识】
go 复制代码
值 = (-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)
  • 所以不要用 == 比较浮点数,要用"误差范围内相等"

相关推荐
x_lrong4 小时前
配置Centos7.6 yum镜像源
1024程序员节
B站_计算机毕业设计之家4 小时前
python舆情分析可视化系统 情感分析 微博 爬虫 scrapy爬虫技术 朴素贝叶斯分类算法大数据 计算机✅
大数据·爬虫·python·scrapy·数据分析·1024程序员节·舆情分析
一条星星鱼4 小时前
PSG技术文章大纲
1024程序员节
weixin_420947644 小时前
golang使用泛型
golang·1024程序员节
B站_计算机毕业设计之家4 小时前
基于python人脸识别系统 人脸检测 实时检测 深度学习 Dlib库 ResNet深度卷积神经网络 pyqt设计 大数据(源码)✅
python·深度学习·目标检测·计算机视觉·信息可视化·人脸识别·1024程序员节
极客范儿4 小时前
新华三H3CNE网络工程师认证—STP状态机与收敛过程
服务器·网络·stp·1024程序员节
汤姆yu4 小时前
2026版基于python大数据的电影分析可视化系统
大数据·python·1024程序员节·电影分析可视化
阿登林4 小时前
C# .NET Core中Chart图表绘制与PDF导出
c#·1024程序员节
说私域4 小时前
基于开源链动2+1模式、AI智能名片与S2B2C商城小程序的预搜索机制优化研究
1024程序员节