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


从零开始、一步一步、用最生活化的语言,带你彻底搞懂:

  • 什么是浮点数?
  • 为什么需要 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),它的公式是:

= (-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
00 + 127 = 127 → 01111111
+127127 + 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⁻²³)【这里用到了大学数学知识】
      在这里插入图片描述
= (-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)
  • 所以不要用 == 比较浮点数,要用“误差范围内相等”

内容概要:本文针对高渗透率分布式光伏与储能变流器接入配电网所带来的运行挑战,深入研究了传统跟网型(GFL)逆变器在电网故障、弱电网及孤岛工况下易失稳脱网,以及构网型(GFM)虚拟同步发电机(VSG)逆变器在并网状态下缺乏同步调节能力的技术瓶颈,提出了一种可实现GFL与GFM双向平滑切换的先进控制策略。研究首先构建了GFL与GFM共用的硬件平台与内环控制基础,继而系统性地设计了基于关键电气量实时监测的切换判据、精确的双向切换时序逻辑,并创新性地引入了过渡过程的平滑抑制策略,以有效抑制切换瞬间的有功功率冲击、电压闪变与频率突变。全文在Matlab/Simulink环境中搭建了完整的仿真模型,通过对并网转孤岛、孤岛转并网等多种工况的动态仿真,全面验证了所提策略的有效性,结果表明该方法能确保系统在模式切换过程中电压、电流与频率的平稳过渡,显著提升了微电网在复杂运行条件下的韧性、稳定性与供电可靠性。; 适合人群:从事电力电子、新能源并网、微电网控制、智能配电网等领域的高校研究生、科研院所研究人员及电力系统相关企业的工程技术人员。; 使用场景及目标:① 解决高比例可再生能源接入引发的电网稳定性与电能质量问题;② 实现微电网在并网与孤岛两种运行模式间的无缝、可靠切换,保障重要负荷的不间断供电;③ 为构网型与跟网型逆变器的协同运行、新型电力系统构建提供先进的控制理论依据与可落地的技术解决方案。; 阅读建议:建议结合文中提供的Simulink仿真模型进行深入学习,重点剖析切换逻辑模块的设计原理与参整定方法,通过反复观察和分析不同工况下的仿真波形,深刻理解平滑切换过程中的动态响应机理与控制思想。
内容概要:本文提出了一种基于粒子群算法(PSO)优化模糊C均值(FCM)聚类的居民用电行为分析方法,旨在解决传统FCM算法对初始聚类中心敏感、易陷入局部最优解的问题。通过引入PSO算法全局寻优能力,优化FCM的初始聚类中心选择,显著提升了聚类结果的准确性与稳定性。研究结合Matlab平台实现了算法仿真与实证分析,有效挖掘出居民用电负荷的典型模式,为电力系统的需求侧管理、精细化负荷预测及个性化用电服务提供了可靠的据分析基础和技术支撑。; 适合人群:具备一定电力系统基础知识与Matlab编程能力,从事电力大据分析、智能电网、负荷特性研究、需求响应等相关领域的科研人员、高校研究生及工程技术开发者。; 使用场景及目标:①应用于居民用电据的聚类分析,识别不同用户的典型用电模式与行为特征;②优化传统FCM算法性能,提升聚类过程的鲁棒性与收敛效率;③为电力公司制定差异化电价策略、实施精准需求响应措施以及开展用户画像构建提供科学依据。; 阅读建议:读者应结合Matlab代码实现部分,深入理解PSO优化FCM的整体流程,重点关注适应度函的设计原则、PSO关键参(如惯性权重、学习因子)的设定及其对聚类效果的影响,并建议使用真实的居民用电据集进行实验验证与参调优,以充分掌握该方法的实际应用技巧。
内容概要:本文系统研究了可切换构网型(Grid-Forming)与跟网型(Grid-Following)逆变器在微电网运行中的双向平滑切换控制策略,旨在解决孤岛与并网模式切换过程中常见的频率、电压突变问题,提升系统稳定性与电能质量。研究融合事件触发机制与分布式协同控制理论,设计了高效的二次频率与电压恢复控制策略,并通过Simulink搭建完整的微电网仿真模型进行验证。文中还深入探讨了通信优化、抗DoS攻击的弹性控制机制等关键技术,体现了对现代智能微电网在高可靠性、高灵活性运行方面的综合控制需求,适用于IEEE/SCI高水平期刊研究成果的复现与拓展。; 适合人群:具备电力电子、自动控制或微电网相关专业知识,从事新能源发电、智能电网、分布式能源系统等方向研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 深入理解构网型与跟网型逆变器的工作原理及其模式切换的技术难点;② 掌握基于事件触发与分布式协同的微电网二次控制策略设计方法;③ 在Simulink环境中实现微电网多运行模式的建模与仿真,支撑学术论文复现、科研课题推进或实际工程项目开发; 阅读建议:建议结合文中提及的IEEE/SCI顶刊复现案例,循序渐进地学习控制策略的设计逻辑与仿真实现细节,重点关注模式切换的触发条件设定、控制器参整定及系统稳定性分析,同时可利用提供的网盘资源获取完整仿真模型与代码,以加快学习与研究进程。
内容概要:本文提出了一种融合元胞自动机邻域驱动遗传算法与关键工序定向随机重启爬山算法(GA-RRHC)的混合优化方法,用于求解高柔性柔性作业车间调度问题(FJSSP),以实现最小化最大完工时间的目标。该算法通过元胞自动机构建动态邻域结构,增强种群多样性与搜索效率,结合遗传算法的全局探索能力和随机重启爬山算法的局部精细化优化能力,并引入关键路径识别机制指导搜索方向,有效避免陷入局部最优。整个方法在Matlab平台上实现了完整的算法流程与仿真实验,验证了其在复杂调度场景下的优越性能与鲁棒性,适用于高柔性制造系统的生产调度优化需求。; 适合人群:具备一定编程基础和运筹优化背景,从事智能制造、工业工程、自动化或相关领域研究的研发人员及研究生(工作或学习年限1-3年)。; 使用场景及目标:①解决高柔性作业车间中多工序、多设备、多约束条件下的调度优化难题;②研究混合智能优化算法的设计与实现机制,特别是遗传算法与局部搜索策略的融合方式;③为实际生产系统提供高效的调度方案,缩短生产周期,提高资源利用率。; 阅读建议:此资源以Matlab代码为核心载体,强调算法实现与仿真实验的结合,建议读者在阅读过程中动手运行并调试代码,深入理解元胞邻域构造、关键路径识别及随机重启机制的作用,同时可拓展应用于其他组合优化问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胜天半月子

打不打商的无所谓,能帮到你就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值