IEEE 754

来自GSXAB的知识库
IEEE754
术语名称 IEEE754
英语名称 IEEE 754
符号位
术语名称 符号位
英语名称 sign bit
有效数
术语名称 有效数
英语名称 significand
别名 有效数字
尾数
术语名称 尾数
英语名称 mantissa
别名 trailing significand
指数
术语名称 指数
英语名称 exponent
别名 阶码
规格化数
术语名称 规格化数
英语名称 normal number
别名 normalized number
非规格化数
术语名称 非规格化数
英语名称 subnormal number
别名 denormalized numbers, denormal numbers

IEEE 754,即 IEEE 二进制浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)是 IEEE 关于浮点数存储及算术运算的标准。 IEEE 标准及其他兼容标准解决了上世纪 80 年代前浮点数物理表示不同造成的大量可靠性和兼容性问题,是现在最通用的标准,大量硬件中浮点运算单元(floating-point unit, FPU)都使用这一标准。

IEEE 754 的第一个版本是 IEEE 754-1985 ,只包含单精度和双精度的浮点数算术,因此网络上很多材料都会说 IEEE 754 只有其中前三种类型。后续 IEEE 754-2008 版本中,除了继承自身外,还融合了来自 IEEE 854-1987 (IEEE 基数无关浮点数算术标准(IEEE Standard for Radix-Independent Floating-Point Arithmetic))的标准类型。之后 ISO/IEC/IEEE 60559:2011 开始,这一标准进入 ISO/IEC 标准。目前最新标准为 IEEE 754-2019 和 ISO/IEC 60559:2020 。

格式

本 wiki 本章摘录主要格式定义,忽略和算术相关的部分。

相关定义

  • 格式(format):一种 IEEE 754 格式是数值与数字符号的表示形式的集合,也可能伴有一种编码。
  • 浮点数据(floating-point datum):可以表示为浮点格式的,浮点数或 NaN 。
  • 浮点数(floating-point number):可以表示为浮点格式的有限或无穷的数。不是 NaN 的浮点数据。全部浮点数,包括 0 和无穷,都是有符号数。
  • NaN (not a number,可译为非数字):“非数字”,一个符号性的浮点数据。分为两种:不触发异常信号的 qNaN (quite NaN) 和无效操作时触发异常信号的 sNaN (signaling NaN) 。
  • 基数(radix'):二进制或十进制浮点数中的基数,即 2 或 10 。用 [math]\displaystyle{ b }[/math] 表示。
  • 指数(exponent):有限浮点数的一个组成部分,包含其浮点表示中基数幂部分的指数。当有效数部分看成小数时,指数用 [math]\displaystyle{ e }[/math] 表示。当有效数部分看成整数时,指数用 [math]\displaystyle{ q }[/math] 表示。
  • 阶码(biased exponent):指数与一个常数之和,其中常数选择使得指数范围非负。
  • 有效数(significand):有限浮点数的一个组成部分,包含其有效数字。有效数本身是选择了合适的指数偏离之后得到的,可以看成整数、小数或其他定点形式。十进制和非规格化的有效数可以有前导 0 。
  • 尾数域(trailing significand field):二进制或十进制浮点格式编码中的一个组成部分,包含除首位外的有效数字。在这些格式中,阶码或组合域会编码或隐含有效数字的首位。
  • 精度(precision):格式中表达有效数的位数,或者舍入时舍入目标的位数。用 [math]\displaystyle{ p }[/math] 表示。
  • 规格化数(normal number):对一种特定形式,指其中绝对值大于等于 [math]\displaystyle{ b^{emin} }[/math] 的有限非零浮点数。规格化数可以使用全部精度。
  • 非规格化数(subnormal number / denormalized number):对一种特定格式,指其中绝对值小于该格式下最小规格化数绝对值的非零浮点数。非规格化数无法完整使用同一格式下规格化数所能够使用的精度。

实数和浮点数据对应层级关系

Level 1 [math]\displaystyle{ \{-\infty, \cdots, 0, \cdots, +\infty\} }[/math] 扩展实数
↑多对一↓ (上到下)舍入/(下到上)投影,除 NaN 外
Level 2 [math]\displaystyle{ \{-\infty, \cdots, -0\} \cup \{+0, \cdots, +\infty\} \cup \mathbf{NaN} }[/math] 浮点数据
↑一对多↓ (上到下)浮点数的表示
Level 3 [math]\displaystyle{ (\mathbf{Sign}\times\mathbf{Exponent}\times\mathbf{Signifcand})\cup }[/math]
[math]\displaystyle{ \{-\infty,+\infty\} \cup \mathbf{qNaN} \cup \mathbf{sNaN} }[/math]
浮点数的表示,
浮点格式
↑一对多↓ (上到下)浮点表示的编码
Level 4 [math]\displaystyle{ \{\mathbf{0},\mathbf{1}\}^n = \{\mathbf{0000\cdots}, \mathbf{0001\cdots}, \cdots\} }[/math] 二进制串

浮点数据集及相关记号

本节刻画浮点格式中所有可表示的浮点数据。

首先明确描述数据范围时使用的参数。

  • [math]\displaystyle{ b }[/math] :基数。
  • [math]\displaystyle{ p }[/math] :精度(有效数位数)。
  • [math]\displaystyle{ emax }[/math] :指数 [math]\displaystyle{ e }[/math] 的最大值。
  • [math]\displaystyle{ emin }[/math] :指数 [math]\displaystyle{ e }[/math] 的最小值。总是取 [math]\displaystyle{ emin=1-emax }[/math]

如果将数字部分看作小数,浮点数据的集合包括:

  • 有符号 0 及有符号非零浮点数有形式 [math]\displaystyle{ (-1)^s \times b^e \times m }[/math]
    • [math]\displaystyle{ s }[/math] 是符号位,取 0 或 1 。
    • [math]\displaystyle{ e }[/math] 是指数,满足 [math]\displaystyle{ emin \leq e \leq emax }[/math]
    • [math]\displaystyle{ m }[/math] 是数码串 [math]\displaystyle{ d_0 \cdot d_1 d_2 \cdots d_{p-1} }[/math] ,其中 [math]\displaystyle{ 0 \leq d_i \lt b }[/math]
  • 两个无穷, [math]\displaystyle{ -\infty, +\infty }[/math]
  • 两个 NaN , [math]\displaystyle{ \mathrm{qNaN} }[/math][math]\displaystyle{ \mathrm{sNaN} }[/math]

如果将数字部分看作小数,则可以表示成:

  • 有符号 0 及有符号非零浮点数有形式 [math]\displaystyle{ (-1)^s \times b^q \times c }[/math]
    • [math]\displaystyle{ s }[/math] 是符号位,取 0 或 1 。
    • [math]\displaystyle{ q }[/math] 满足 [math]\displaystyle{ emin \leq q+p-1 \leq emax }[/math]
    • [math]\displaystyle{ c }[/math] 是数码串 [math]\displaystyle{ d_0 d_1 d_2 \cdots d_{p-1} }[/math] ,其中 [math]\displaystyle{ 0 \leq d_i \lt b }[/math]

至于真值本身,因为精度是根据数的有效数字位数确定的,相对精度几乎固定,绝对精度在不同大小的数下有不同。 如果考虑具体能表示哪些数比较复杂, 但是可以根据表示给出一个大致范围:

规格化数中,能表示的最小正数为 [math]\displaystyle{ b^{emin} }[/math] ,最大整数为 [math]\displaystyle{ b^{emax} (b - b^{1-p}) }[/math]

非规格化数用于表示绝对值过小无法规格化的数,其中指数部分取最小可能指数,尾数部分因为过于小而具有前导 0 。英语称为 subnormal ,其中 sub- 指的是绝对值比规格化要小。 非规格化数能表示的最小数为 [math]\displaystyle{ b^{-emin} \times b^{1-p} }[/math]

基本格式

基本格式(basic formmat)指五种类型:二进制类型 binary32 、 binary 64 、 binary128 ,十进制类型 decimal64 、 decimal128 。

二进制的交换格式

交换格式(interchange format)指的是在实现间交换浮点数据的格式,规定了每个格式下的精度和范围,保证以此标准交换浮点数据时必然可以完全准确地得到结果。在交换格式中, IEEE 754 标准制定了 16 、 32 、 64 、 128 位,以及一个长度不少于 128 且是 32 倍数的通用格式。

在二进制交换格式中,由于规格化数有效数部分最高位总是 1 ,省略掉(严格地说是通过判断阶码来是否是规格化数来确定)并将剩余的 [math]\displaystyle{ p-1 }[/math] 位尾数作为尾数段保存。

binary16

数据类型中称为半精度浮点数

符号位 1 位、阶码 5 位、尾数 10 位(精度 11 位)。

floating_point_binary16.svg

binary32

在数据类型中称为单精度浮点数。在 IEEE 754-1985 中曾被称为 single 。

符号位 1 位、阶码 8 位、尾数 23 位(精度 24 位)。

floating_point_binary32.svg

binary64

在数据类型中称为双精度浮点数。在 IEEE 754-1985 中曾被称为 double 。

符号位 1 位、阶码 11 位、尾数 52 位(精度 53 位)。

floating_point_binary64.svg

binary128

在数据类型中称为四精度浮点数

符号位 1 位、阶码 15 位、尾数 112 位(精度 113 位)。

floating_point_binary128.svg

通用 binary 格式

记位数为 [math]\displaystyle{ k }[/math] ,则符号位 1 位、阶码 [math]\displaystyle{ \operatorname{round}(4 \log_2 k) - 13 }[/math] 位、精度 [math]\displaystyle{ k - \operatorname{round}(4\log_2 k) - 13 }[/math]

binary256

类型 binary256 在 IEEE 754-2008 中交换格式部分声明。在 IEEE 754-2019 中并入通用 binary 格式,不再直接单独提出。

在数据类型中称为八精度浮点数

符号位 1 位、阶码 19 位、尾数 236 位(精度 237 位)。

floating_point_binary256.svg

扩展格式

80bit x87 扩展精度浮点数

舍入属性

特殊值

关于无穷

关于 NaN

二进制交换格式
NaN 的传播
数的内部表示
十进制数的二进制编码 BCDGray 码奇偶校验码 、 字符表示
整数的机器数 定点整数 无符号定点整数
有符号定点整数(原码反码补码移码
小数的机器数 定点小数浮点数IEEE 754