2016/08/03(水)半精度浮動小数点数に関する思考実験
IEEE754-2008の半精度では、16bitを符号s(1bit)+指数部e(5bit)+仮数部m(10bit)に分割しています。指数部のオフセットは15で、従って正規化数は
x = (-1)s × 1.m × 2e-15のように、非正規化数は
x = (-1)s × 0.m × 2-14のように実数xと対応します。
ところで、URRという浮動小数点数の表現形式をご存知でしょうか。浜田穂積先生が80年代(IEEE754制定より前!)に提案された浮動小数点数の表現形式です。詳細は
- 浜田 穂積, 二重指数分割に基づくデータ長独立実数値表現法, 情報処理学会論文誌, Vol.22, No. 6, pp. 521-526 (1981)
- 浜田 穂積, 二重指数分割に基づくデータ長独立実数値表現法II, 情報処理学会論文誌, Vol.24, No. 2, pp. 149-156 (1983)
さて、半精度浮動小数点数は、bit数が少ないこともあって表現できる数値の範囲が非常に狭く、簡単にアンダーフローやオーバーフローを起こしてしまいます。正の最大数は何と65504です。正の最小数は、精度を保っている正規化数で2-14≃6.1×10-5、非正規化数まで考えても2-24≃5.96×10-8にすぎません。
そこで、URR的な考え方を用いて16bit浮動小数点数を構成したらどうなるか考えてみました。URRは-infやNaNが無いなど、現代のIEEE754に慣れた我々には使いにくいところもあるので、指数部と仮数部の区切りを可変にするという思想はそのままで、適当にフォーマットを定めます。指数部は、Eliasのデルタ符号を用いることにします。デルタ符号は1,2,3,…の自然数しか表せないので、指数部とデルタ符号で表す数値を
| デルタ符号 | 1 | 2 | 3 | 4 | 5 | … | 255 | 256 | … | 508 | 509 | 510 | 511 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 指数部 | 0 | -1 | 1 | -2 | 2 | … | 127 | -128 | … | -254 | ±0 | ±inf | NaN |
| デルタ符号の長さ | 1 | 3 | 3 | 5 | 5 | … | 14 | 15 | … | 15 | 15 | 15 | 15 |
| 提案方式の仮数部長 | IEEE754-2008の仮数部長 | |
|---|---|---|
| 2-254 | 1 | - |
| ⋮ | ⋮ | ⋮ |
| 2-128 | 1 | - |
| 2-127 | 2 | - |
| ⋮ | ⋮ | ⋮ |
| 2-24 | 6 | 1 |
| 2-23 | 6 | 2 |
| 2-22 | 6 | 3 |
| ⋮ | ⋮ | ⋮ |
| 2-16 | 6 | 9 |
| 2-15 | 7 | 10 |
| 2-14 | 7 | 11 |
| ⋮ | ⋮ | ⋮ |
| 2-8 | 7 | 11 |
| 2-7 | 8 | 11 |
| ⋮ | ⋮ | ⋮ |
| 2-4 | 8 | 11 |
| 2-3 | 11 | 11 |
| 2-2 | 11 | 11 |
| 2-1 | 13 | 11 |
| 20 | 15 | 11 |
| 21 | 13 | 11 |
| 22 | 11 | 11 |
| 23 | 11 | 11 |
| 24 | 8 | 11 |
| ⋮ | ⋮ | ⋮ |
| 27 | 8 | 11 |
| 28 | 7 | 11 |
| ⋮ | ⋮ | ⋮ |
| 214 | 7 | 11 |
| 215 | 7 | 11 |
| 216 | 6 | - |
| ⋮ | ⋮ | ⋮ |
| 2127 | 2 | - |
| 2128 | 1 | - |
| ⋮ | ⋮ | ⋮ |
| 2253 | 1 | - |
もちろんハードウェアのサポートが無くソフトウェアエミュレーションでは速度は絶望的ですが、将来このような優れたフォーマットが気軽に使えるようになればいいなと思っています。FPGAとかで作って遊んだりできないかなあ。