半精度浮動小数点数
半精度浮動小数点数 (はんせいどふどうしょうすうてんすう) は浮動小数点方式で表現された数(浮動小数点数)の一種で、16ビット(2オクテット)の形式による数である。
IEEE 754-2008ではbinary16と名づけられている。これは、記録や通信など、データ量の削減が必須で精度を必要としない用途のためのフォーマットであり、計算を行うことは意図されていない。
半精度浮動小数点は比較的新しい浮動小数点形式である。これはインダストリアル・ライト&マジック社の研究の中で、広いダイナミックレンジを扱うがハードディスクやメモリのコストをかけられない画像形式のために作られた。
この形式はOpenEXR、OpenGL、 Cg、Direct3Dなどいくつかのコンピュータグラフィックス環境で使われる。8ビット・16ビットの整数に対する利点は、ダイナミックレンジの広さによりハイライトや影のディテールが保たれることである。一方32ビット単精度に対する利点は、精度と引き換えにストレージおよび回線幅が半分で済むことである。
OpenCLのC言語ではhalf、gcc では __fp16 で ARM などでは使える[1]。
IEEE 754 半精度2進浮動小数点表現: binary16[編集]
IEEE 754標準はbinary16を以下のように定めている。
- 符号ビット: 1 ビット
- 指数部の幅: 5 ビット
- 仮数部の幅=精度: 11 (明示的には10ビット)
他のIEEE754浮動小数点表現と同様、指数部が全0でない限り黙示的な「1」のビットを仮数部に持つ(いわゆる「ケチ表現」)。このため仮数部に記録するのは10ビットだが11ビットの精度を持つ。
より、これは十進数にしておよそ3桁の値となる。ビットは下図のように並ぶ。
指数部のエンコーディング[編集]
半精度2進浮動小数点数の指数部はオフセット2進表現でエンコードされており、オフセット(IEEE 754における指数部バイアス)は15である。
- Emin = 0x01−0x0f = −14
- Emax = 0x1e−0x0f = 15
- 指数部バイアス = 0x0f = 15
よって、真の指数を得るためには、記録された指数から15を引けばよい。
記録された指数の0x00と0x1fは特別に扱われる。
| 指数 | 仮数=0 | 仮数≠0 | 式 |
|---|---|---|---|
| 0x00 | 0, −0 | 非正規化数 | ![]() |
| 0x01, ..., 0x1e | 正規化数 | ![]() |
|
| 0x1f | ±無限大 | NaN (quiet, signalling) | |
- 最小の正の非正規化数 : 2−24 ≈ 5.96 × 10−8
- 最小の正の正規化数 : 2−14 ≈ 6.10 × 10−5
- 表現可能な最大数 : 65504
半精度数の例[編集]
浮動小数点数値のビット列を十六進法で表した例を以下に示す。これには符号、オフセットを加えた指数値、仮数値が含まれている。
3c00 = 1 3c01 = 1.0009765625、1より大きい最小の数 3c02 = 1.001953125 3fff = 1.9990234375、2より小さい最大の数 4000 = 2 c000 = -2 7bfe = 65472 7bff = 65504 (半精度数の正の最大値。符号なし16ビット整数の最大数(65535)と大差ない) fbff = -65504 (半精度数の負の最大値) 0400 = 2-14 ≈ 6.10352 × 10-5 (最小の正の正規化数) 0001 = 2-24 ≈ 5.96046 × 10-8 (最小の正の非正規化数) 0000 = 0 8000 = -0 7c00 = 正の無限大 fc00 = 負の無限大 3555 ≈ 0.33325... ≈ 1/3
1/3は切り下げられる。これは仮数部のビット数が奇数であるため(1/3は2進小数で0.01010101...)である。
参照[編集]
外部リンク[編集]
- Minifloats (Survey of Floating-Point Formatsの中)
- OpenEXR site
- OpenGL treatment of half precision
- Analog devices variant (4ビット指数)
- C source code to convert between IEEE double, single, and half precision can be found here
- Half-precision floating point in C# C#で書かれたフリーのhalf floatライブラリ

