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

揭秘浮点数:从数值表示到编码及特殊值处理

揭秘浮点数

尽管在日常生活中经常使用浮点数,但人们对它的理解往往比较模糊,其表现也常常让人感到困惑。其实浮点数并没有那么复杂。这篇博客文章是新推出的网站 float.exposed 的配套内容,该网站旨在成为一个检查浮点数的实用工具。这里所说的浮点数指的是无处不在的 IEEE 754 二进制浮点格式,如今使用的设备几乎都采用该格式。

数字的表示

十进制数

以数字 327.849 为例,小数点左边的数字代表 10 的递增幂次,右边的数字代表 10 的递减幂次。这种表示法存在一些缺点,如小数含零过多、大数难估计大小、末尾数字处理不节省空间等。科学记数法解决了这些问题,它将小数点移到第一个非零数字之后,并相应地设置指数,有符号、有效数字和指数三个主要部分。对于 327.849,可根据精度需求进行舍入。

二进制数

二进制数规则与十进制类似,只是基数变成 2。二进制小数点左边的数字代表 2 的递增幂次,右边的数字代表 2 的递减幂次。为避免混淆,用下标 2 表示二进制数字。二进制数也可使用科学记数法,且用科学记数法表示的每个非零二进制数都以 1 开头,可根据精度需求进行舍入。理解这些内容,就掌握了浮点数的工作原理。

浮点数

浮点数采用二进制科学记数法表示,但有效数字的位数和指数的范围有限。不同的浮点类型具有不同的有效数字位数和允许的指数范围,如 `float` 类型有 24 位二进制有效数字,指数范围是 [-126, +127]。由于有效数字位数和指数值的限制,一些实数可能无法用浮点数精确表示,一些非常大或非常小的数也无法用 `float` 表示。

编码

符号位

符号位只需 1 位来表示数字是正数还是负数,IEEE 754 规定正数用 `0` 表示,负数用 `1` 表示。

有效数字

`float` 类型的有效数字需要 24 位,二进制有效数字的第一位总是 1,为节省一位,该格式省略了这一位,这一位通常被称为“隐含位”,直接复制剩下的 23 位,并在末尾用 0 补齐。

指数

由于 `float` 的指数范围是 [-126, +127],共有 254 个可能的值,需要 8 位来存储。为避免对负指数值进行特殊处理,加上 127 作为偏移量,确保编码后的指数不为负数。对于具体的数,将指数加上 127 得到编码的指数。

组合在一起

将符号位放在首位,然后是指数位,最后是有效数字位,组合起来得到一个 `float` 类型的数。可使用 LLDB 进行检查。虽然 C 和 C++ 标准在技术上并不要求 `float` 或 `double` 必须采用 IEEE 754 格式,但后续内容将合理假设它们采用该格式。对于几乎任何数字,都可采用同样的方法进行编码,但有些数字需要特殊处理。

特殊值

浮点数分布图

通过可视化的方式展示所有特殊值,每个点代表一个唯一的正 `float` 值。图中对大部分指数和大量有效数字值进行了截断处理。

偏移指数值为 0 且有效数字全为 0 的 `float` 数被解释为正零或负零,符号位的值决定是正零还是负零。浮点标准同时定义了 +0.0 和 -0.0,能告诉我们 0 是从哪个“方向”得到的。在处理零值时,`0.0 == -0.0` 为真,`-0.0 + 0.0` 等于 `0.0`,默认情况下,编译器不能将 `a + 0.0` 优化为 `a`,但可设置标志放宽严格的一致性检查。

无穷大

偏移指数值为最大值且有效数字全为 0 的 `float` 数根据符号位的值被解释为正无穷大或负无穷大。无穷大通常是由于对超出类型表示范围的值进行舍入而产生的,也可直接使用宏 `INFINITY`。正零和负零在运算中有作用,涉及“有限”数字和无穷大的运算有明确定义,遵循常识。

http://www.jsqmd.com/news/705232/

相关文章:

  • 保姆级教程:用GD32F103的DAC+TIMER+DMA生成正弦波,示波器实测波形稳如老狗
  • UE4 GAS Buff 模块源码阅读
  • AgentNetworkProtocol:为AI智能体协作定义标准化网络协议
  • 县域建设面板数据2015-2022年
  • 通达信缠论插件ChanlunX终极指南:3步实现专业级技术分析
  • 手把手教你为Linux串口编程封装一个实用的C语言库(支持中断模式)
  • Terra API招聘应用AI策略师,助力健康数据与人工智能领域发展
  • SpringBoot配置文件加密进阶:手把手教你自定义Jasypt加密算法和前缀后缀(告别默认ENC)
  • 从Sourcemap泄露事件看前端构建安全与AI代理架构设计
  • MCP 2026农业物联对接失败的终极归因图谱(覆盖17类农机/12类环境传感器/9种国产PLC),今天不看,下周播种季系统宕机风险↑300%
  • MCP 2026多租户隔离配置深度拆解(K8s+eBPF+OPA三位一体隔离架构首次公开)
  • 微信网页版终极解决方案:3分钟解锁浏览器聊天新体验
  • 3分钟快速上手:无需安装的免费在线SVG编辑器完全指南
  • VS Code MCP插件生态搭建全链路手册(2026黄金窗口期倒计时)
  • VS Code Copilot Next 配置避坑黄金三角:权限粒度 × 语言服务器绑定 × Workspace Trust 状态(实测137次失败回溯)
  • 哈希算法核心特性解析
  • NVIDIA Grace CPU架构解析与数据中心能效优化实践
  • 别再只用来校验文件了!聊聊哈希值在Python、Java和数据库里的5个实战骚操作
  • CGraph实战指南:三步构建高性能C++并行计算框架
  • 错误提示的艺术:当 Agent 无能为力时
  • 深度解析企业级AI驱动自动化测试平台的架构设计与最佳实践
  • 如何用罗技鼠标宏实现PUBG零后坐力?5分钟快速上手指南
  • VS Code MCP插件性能优化:从2.3s延迟降到87ms的4层调优法(含Chrome DevTools+MCP Trace双可视化实操)
  • GEO系统贴牌深度解析:杭州爱搜索如何助力企业构建AI搜索时代的自主营销阵地
  • ThinkPad黑苹果配置全攻略:如何将商务笔记本变成macOS工作站
  • 红米6手机安装PostmarketOS 踩坑记录
  • 群晖NAS硬盘兼容性终极解决方案:3步解锁第三方硬盘支持
  • VS Code Dev Containers启动慢?这4个被90%开发者忽略的预构建陷阱正在拖垮你的迭代效率(附性能对比基准数据)
  • Docker WASM边缘集群上线前必做的6项安全审计,第4项90%团队正在忽略
  • LSTM网络在序列预测中的核心原理与应用实践