当前位置: 首页 > news >正文

嵌入式开发 | 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.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)
  • 所以不要用 == 比较浮点数,要用“误差范围内相等”

http://www.dtcms.com/a/525405.html

相关文章:

  • JMeter测试HTTP POST(附实例)
  • 网站建设 页面网站ip地址查询
  • UM681A相关参数性能介绍
  • 建企业网站多少钱官网cms
  • html制作音乐网站Erphpdown wordpress
  • 最快做网站的语言wordpress 函数api文件
  • php企业网站开发实验总结软件开发工具包sdk
  • java发送SOAP请求
  • Web单页应用(SPA)路由设计(以React为例)
  • 如何把网站放到域名上广告推广平台哪个好
  • 《操作系统真象还原》 第十一章 用户进程
  • maven打jar包,将依赖的jar提取出来
  • 现在做网站用什么工具营销型网站的推广
  • V-Ray for Blender正式上线,新功能概览
  • Blender入门学习06 - 粒子
  • 在什么网站上可以找设计兼职来做电子商务网站html模板
  • 网站索引量白城网络推广
  • mysql 学习网站网站开发公司照片
  • 小迪安全v2023学习笔记(一百三十七讲)—— Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
  • golang使用泛型
  • 自己做的小说网站要交税吗免费的站内推广方式有哪些
  • Anthropic将使用100万个TPU训练大模型
  • 阿里云服务器网站建设找销售的网站
  • 【PPT导出高清tif图】利用PPT将子图组合并导出高清图片
  • 怎样做加入购物车的网站示范建设验收网站
  • 广州做网站信息らだ天堂中文在线
  • 小说网站怎么做用户画像网站建设相关技术
  • CredentialProvider交互式登录实现
  • wap建站程序六年级做的网站的软件下载
  • seo网站建设厦门网站添加地图