浮点运算

义项:计算机数值运算方式
浮点运算

浮点运算是计算机用浮点数完成加减乘除等数值计算的方式,其小数点位置随指数大小浮动,因而能在有限位宽内表示跨度极大的实数范围,是科学计算、图形渲染与工程仿真中最常用的实数运算手段。由于机器只能存储有限个二进制位,大多数实数只能近似表示,运算结果因此带有舍入误差[1]。1985 年问世的 IEEE 754 标准统一了浮点数的格式与运算语义,使浮点运算在不同机器间的行为趋于一致[2]。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

浮点运算指对浮点数实施的算术运算。浮点数由符号、尾数(有效数字)和阶码三部分组成,数值大小等于符号位决定的整数乘以尾数所表示的小数再乘 2 的阶码次幂,等价于二进制下的科学计数法[1]。它区别于定点运算之处在于小数点的位置并不固定,可随阶码上下浮动,因此同样的位宽既能表达极小的量,也能表达极大的量。

计算机内部以二进制存储数据,浮点数只是实数的近似,这一点决定了浮点运算的精度特性[3]。

原理

一套浮点格式由基数、尾数位数、阶码位数与阶码取值范围共同确定,可编码的浮点数总量为有限个,且分布不均匀:靠近零处密集,绝对值越大越稀疏[1]。为使表示唯一,通常要求规格化,即尾数首位非零,这样同一数值只对应一种编码[1]。

以 IEEE 754 的单精度为例,一个 32 位字被划为 1 位符号、8 位带偏移的阶码和 23 位小数域;偏移量为 127,规格化数的值按 $(-1)^{s} \times 2^{e-127} \times 1.f$ 计算,尾数前隐含一个未存储的 1,因而实际精度为 24 位[1]。双精度则为 1 位符号、11 位阶码和 52 位小数域[1]。阶码采用偏移表示,好处是可以按无符号整数直接比较两个浮点数的大小。

两个浮点数相加时,不能直接对位相加,须先比较阶码,把阶码较小的操作数的尾数右移相应位数完成对阶,再相加并重新规格化结果[4]。乘法则把阶码相加、尾数相乘,除法相反[4]。这类多步操作使浮点运算通常比整数运算代价更大。

标准要求每一次浮点运算的结果等同于先以无限精度算出精确值、再舍入到目标格式,这一约定构成了浮点算法误差分析的“标准模型”[2]。标准同时规定了舍入规则与异常处理,包括无穷大与非数值等特殊量[5]。

发展历程

在电子计算机出现之前,浮点表示法已经进入机械与继电器计算机的设计。德国工程师康拉德·楚泽从最早的机型起就采用二进制浮点运算,其 1938 年完成的 Z1 与 1941 年完成的 Z3 均以浮点方式工作,Z3 可对 22 位浮点数做四则运算与开方[6][7]。楚泽还为其机器设计了含零与无穷大表示的浮点格式,对未定义结果会给出提示[6]。

此后很长时期内,各家计算机制造商各自定义浮点格式与运算细节,同一程序在不同机器上的结果难以复现,软件移植困难。20 世纪 60 年代至 80 年代初出现过多种互不相同的算术实现,进一步凸显了统一规范的必要[8]。

1985 年,美国电气和电子工程师协会提出二进制浮点算术标准 IEEE 754,规定了基本与扩展格式、加减乘除与开方等运算、格式间转换以及异常处理[5]。该标准此后被大多数微处理器架构采纳,浮点运算也逐渐由协处理器承担,进而直接集成进中央处理器[9]。

1987 年还发布了与基数无关的 IEEE 854 标准,覆盖十进制等非二进制基数[10]。2008 年发布的修订版将 754 与 854 合并,新增十进制格式与融合乘加等运算;2019 年又发布了以澄清与勘误为主的现行版本[11]。

应用

浮点运算适用于数值跨越多个数量级的场合。物理量仿真、圆周率等高精度常数的计算,其结果精度直接取决于机器浮点运算的能力。在计算机图形与游戏渲染中,光照、着色等计算同样依赖浮点算术,专用图形处理器普遍支持 IEEE 754 格式[12]。

科学工程计算是另一类主要用途。稀疏与稠密矩阵求解、偏微分方程数值解、非线性优化等工作,其核心都是大量浮点运算,常以每秒浮点运算次数衡量机器的计算能力。图形处理器因并行核心数量多,被用作加速这类计算的协处理器。

精度选择随任务而变。32 位单精度与 64 位双精度的开销不同,浮点格式位数越多精度越高而速度往往越低;有研究在流体计算中按区域分别使用双精度与单精度,以兼顾精度与效率。编程语言一般以 float 对应单精度、double 对应双精度[1]。

局限

浮点表示只能覆盖有限个实数,因此必然存在舍入误差。典型例子是十进制 0.1,它在二进制下是无限循环小数,任何有限位宽都只能存下它的近似值[3]。由此,0.1、0.2、0.3 这类看似简单的数在双精度中都无法精确表示,把它们相加所得也不是精确的 0.3[13]。

除了精度不足,浮点运算还可能遇到两种极端情形:结果绝对值超出可表示上界而发生溢出,或小于最小可表示量而发生下溢[14]。标准对这两种情形定义了无穷大与次正规数等特殊编码加以处理[1]。

误差会在运算链中累积甚至放大。当两个相近的数相减时会出现灾难性抵消,结果的相对误差可能急剧上升;把极小的数加到极大的数上,小数部分也可能被整体舍弃[15][14]。多次累加、扩展精度转回工作精度时的二次舍入,也都是误差的常见来源[15]。

由于浮点结果通常不精确,直接用相等比较判断两个浮点值往往得不到预期结果,涉及小数的金额计算也因此不宜用浮点类型,需改用整数或十进制类型[16]。此外,早期部分图形处理器未严格遵循 IEEE 754,同一计算在图形处理器与中央处理器上可能得到不同结果[12]。

参见

  • IEEE 754 —— 规定浮点格式、舍入规则与异常处理的国际标准。

  • 浮点数 —— 浮点运算的操作对象,由符号、尾数与阶码构成。

  • 定点数 —— 小数点位置固定的数表示方式,与浮点数相对。

  • 舍入误差 —— 因有限位宽近似表示实数而产生的数值偏差。

  • 浮点运算器 —— 处理器中执行浮点指令的部件。

  • 每秒浮点运算次数 —— 衡量计算设备浮点性能的常用指标。

参考资料

  1. oracle.com 上的 PDF 文件 [引用日期2026-10-19]
  2. Floating-point arithmetic [引用日期2026-10-19]
  3. floatingpoint [引用日期2026-10-19]
  4. Computer Arithmetic - Chapters and Articles [引用日期2026-10-19]
  5. IEEE SA - IEEE 754-1985 - Superseded Standard [引用日期2026-10-19]
  6. Winkler-Letter-to-CACM-2012-July-V3 2012-Aug-24 [引用日期2026-10-19]
  7. EN | Personajes ilustres - Museo histórico de la informática [引用日期2026-10-19]
  8. MPG.eBooks - 实物特征: Handbook of Floating-Point Arithmetic [引用日期2026-10-19]
  9. Preface [引用日期2026-10-19]
  10. The IEEE Standard 754: One for the History Books [引用日期2026-10-19]
  11. IEEE 754 - Skip to main content [引用日期2026-10-19]
  12. Implementation of float-float operators on graphics hardware [引用日期2026-10-19]
  13. Problem with double precision in g77 [引用日期2026-10-19]
  14. Computer Arithmetic - Chapters and Articles [引用日期2026-10-19]
  15. arxiv.org 上的网页 [引用日期2026-10-19]
  16. floating-point_arithmetic(PDF) [引用日期2026-10-19]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-19T13:26:42Z

历史版本

本条目引用的词条
康拉德·楚泽 IEEE 754 浮点数 定点数 舍入误差 浮点运算器 每秒浮点运算次数