IEEE 754
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 位)。
binary32
在数据类型中称为单精度浮点数。在 IEEE 754-1985 中曾被称为 single 。
符号位 1 位、阶码 8 位、尾数 23 位(精度 24 位)。
binary64
在数据类型中称为双精度浮点数。在 IEEE 754-1985 中曾被称为 double 。
符号位 1 位、阶码 11 位、尾数 52 位(精度 53 位)。
binary128
在数据类型中称为四精度浮点数。
符号位 1 位、阶码 15 位、尾数 112 位(精度 113 位)。
通用 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 位)。
扩展格式
80bit x87 扩展精度浮点数
舍入属性
特殊值
关于无穷
关于 NaN
二进制交换格式
NaN 的传播
数的内部表示 | ||
---|---|---|
十进制数的二进制编码 | BCD 、 Gray 码 、 奇偶校验码 、 字符表示 | |
整数的机器数 | 定点整数 | 无符号定点整数 |
有符号定点整数(原码、反码、补码、移码) | ||
小数的机器数 | 定点小数、浮点数(IEEE 754) |