雙精度浮點數

雙精度浮點數（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）
- 浮點數