双精度浮点数

双精度浮点数（Double-precision floating-point）是用来表示浮点数的一种资料型别，在计算机中占据64比特（8字节）大小，因此也称为float64或FP64。在IEEE 754中这种64位二进制格式被正式称为binary64格式，而在IEEE 754-1985中被称为double，即双精度。

比起单精度浮点数仅有 32 位元（4字节），双精度浮点数使用 64 位元（8字节）来储存一个浮点数。

它可以表示二进位制的53位有效数字，其可以表示的数字的绝对值范围为$[ 2^{-1024} , 2^{1024} ]$。

## 格式

- sign bit（符号）：1位，用来表示正负号
- exponent（指数）：11位，用来表示次方数
- mantissa（尾数）：52位，由于省略了首位必定存在的“1”，实际上为53位，用来表示精确度

<image>

### 符号

0代表数值为正，1代表数值为负。

### 指数

共有11个位元，使用“指数偏移”。

有2个例外分别为

- “11个位元皆为0”
- “11个位元皆为1”

并且以1023为偏移标准，表示实际指数为0，因此指数范围为 -1022 到 +1023：

指数 `000<sub>16</sub>` 和 `7ff<sub>16</sub>` 具有特殊意义：

`00000000000<sub>2</sub>` = `000<sub>16</sub>`当尾数为0时为±0，尾数不为0时为非正规形式的浮点数。

`11111111111<sub>2</sub>` = `7ff<sub>16</sub>`当尾数为0时为∞，尾数不为0时为NaN。

### 尾数

在二进制的“科学记号”，数字被表示为：

$$\text{1.mantissa} \times \text{2}^\text{exponent}$$

二进制的“科学记号”（a×2n）的a的范围是大于等于1而小于2，例如：

- 二进位制的 $\text{11.101} \times \text{2}^\text{1001}$ 可以规格化为 $\text{1.1101} \times \text{2}^\text{1010}$，储存时尾数只需要储存1101即可。
- 二进位制的 $\text{0.00110011} \times \text{2}^{-1001}$ 可以规格化为 $\text{1.10011} \times \text{2}^{-1100}$，储存时尾数只需要储存10011即可。

### 小结

根据以上的叙述，一个双精度浮点数所代表的数值为：

$$(-1)^{\text{sign}} \times 2^{\text{exponent}} \times 1.\text{mantissa}$$

## 例子

`0 01111111111 0000000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ 3FF0 0000 0000 000016 ≙ +20 × 1 = 1 `0 01111111111 0000000000000000000000000000000000000000000000000001<sub>2</sub>` ≙ 3FF0 0000 0000 000116 ≙ +20 × (1 + 2−52) ≈ 1.0000000000000002, the smallest number > 1 `0 01111111111 0000000000000000000000000000000000000000000000000010<sub>2</sub>` ≙ 3FF0 0000 0000 000216 ≙ +20 × (1 + 2−51) ≈ 1.0000000000000004 `0 10000000000 0000000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ 4000 0000 0000 000016 ≙ +21 × 1 = 2 `1 10000000000 0000000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ C000 0000 0000 000016 ≙ −21 × 1 = −2

`0 10000000000 1000000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ 4008 0000 0000 000016 ≙ +21 × 1.12 = 112 = 3 `0 10000000001 0000000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ 4010 0000 0000 000016 ≙ +22 × 1 = 1002 = 4 `0 10000000001 0100000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ 4014 0000 0000 000016 ≙ +22 × 1.012 = 1012 = 5 `0 10000000001 1000000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ 4018 0000 0000 000016 ≙ +22 × 1.12 = 1102 = 6 `0 10000000011 0111000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ 4037 0000 0000 000016 ≙ +24 × 1.01112 = 101112 = 23 `0 01111111000 1000000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ 3F88 0000 0000 000016 ≙ +2−7 × 1.12 = 0.000000112 = 0.01171875 (3/256)

`0 00000000000 0000000000000000000000000000000000000000000000000001<sub>2</sub>` ≙ 0000 0000 0000 000116 ≙ +2−1022 × 2−52 = 2−1074 ≈ 4.9406564584124654 × 10−324 (Min. subnormal positive double)

`0 00000000000 1111111111111111111111111111111111111111111111111111<sub>2</sub>` ≙ 000F FFFF FFFF FFFF16 ≙ +2−1022 × (1 − 2−52) ≈ 2.2250738585072009 × 10−308 (Max. subnormal double)

`0 00000000001 0000000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ 0010 0000 0000 000016 ≙ +2−1022 × 1 ≈ 2.2250738585072014 × 10−308 (Min. normal positive double)

`0 11111111110 1111111111111111111111111111111111111111111111111111<sub>2</sub>` ≙ 7FEF FFFF FFFF FFFF16 ≙ +21023 × (1 + (1 − 2−52)) ≈ 1.7976931348623157 × 10308 (Max. Double)

`0 00000000000 0000000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ 0000 0000 0000 000016 ≙ +0 `1 00000000000 0000000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ 8000 0000 0000 000016 ≙ −0 `0 11111111111 0000000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ 7FF0 0000 0000 000016 ≙ +∞ (positive infinity)

`1 11111111111 0000000000000000000000000000000000000000000000000000<sub>2</sub>` ≙ FFF0 0000 0000 000016 ≙ −∞ (negative infinity)

`0 11111111111 0000000000000000000000000000000000000000000000000001<sub>2</sub>` ≙ 7FF0 0000 0000 000116 ≙ NaN (sNaN on most processors, such as x86 and ARM)

`0 11111111111 1000000000000000000000000000000000000000000000000001<sub>2</sub>` ≙ 7FF8 0000 0000 000116 ≙ NaN (qNaN on most processors, such as x86 and ARM)

`0 11111111111 1111111111111111111111111111111111111111111111111111<sub>2</sub>` ≙ 7FFF FFFF FFFF FFFF16 ≙ NaN (an alternative encoding of NaN)

`0 01111111101 0101010101010101010101010101010101010101010101010101<sub>2</sub>` = `3fd5 5555 5555 5555<sub>16</sub>` ≙ +2−2 × (1 + 2−2 + 2−4 + ... + 2−52) ≈ 1/3

`0 10000000000 1001001000011111101101010100010001000010110100011000<sub>2</sub>` = `4009 21fb 5444 2d18<sub>16</sub>` ≈ pi

## 参阅

- IEEE二进制浮点数算术标准（IEEE 754）
- 浮点数