半精度浮動小数点数

半精度浮動小数点数の最新ニュースをまとめて検索!

情報処理において、半精度浮動小数点数は数値を2バイト(16ビット)で格納するコンピュータの数値表現の一種である。

IEEE 754-2008で16ビットの2進数フォーマットはbinary16と名づけられている。これは、(高精度が必要のない場面での)記録のためのフォーマットであり、計算を行うことは意図されていない。

半精度浮動小数点数は比較的新しい2進浮動小数点形式である。これはインダストリアル・ライト&マジック社の研究の中で、ダイナミックレンジを扱うがハードドライブやメモリのコストをかけられない画像形式のために作られた。

この形式はOpenEXROpenGLCg、D3DXなどいくつかのコンピュータグラフィックス環境で使われる。8ビット・16ビットの整数に対する利点は、ダイナミックレンジの広さによりハイライトや影のディテールが保たれることである。一方32ビット単精度の形式に対する利点は、ストレージおよび回線幅が半分で済むことである(ただし、精度と引き換えに)。


目次

[編集] IEEE 754 半精度2進浮動小数点表現: binary16

IEEE 754標準はbinary16を以下のように定めている。

  • 符号ビット: 1 ビット
  • 指数部の幅: 5 ビット
  • 仮数部の幅=精度: 11 (明示的には10ビット)

この形式は指数部が全0でない限り黙示的な「1」のビットを仮数部に持つ。このため仮数部に記録するのは10ビットだが11ビットの精度を持つ。\log_{10}(2^{11}) \approx 3.311より、これは十進数にしておよそ3桁の値となる。ビットは下図のように並ぶ。

Image:IEEE_754r_Half_Floating_Point_Format.svg

[編集] 指数部のエンコーディング

半精度2進浮動小数点数の指数部はオフセット2進表現でエンコードされており、オフセット(IEEE 754における指数部バイアス)は15である。

  • Emin = 0x01−0x0f = −14
  • Emax = 0x1e−0x0f = 15
  • 指数部バイアス = 0x0f = 15

よって、真の指数を得るためには、記録された指数から15を引けばよい。

記録された指数の0x00と0x1fは特別に扱われる。

指数 仮数=0 仮数≠0
0x00 0, −0 非正規化数 (-1)^{\text{signbit}} \times 2^{-14} \times 0.\text{significandbits}_2
0x01, ..., 0x1e 正規化数 (-1)^{\text{signbit}} \times 2^{{\text{exponentbits}_2} - 15} \times 1.\text{significandbits}_2
0x1f ±無限大 NaN (quiet, signalling)
  • 最小の正の非正規化数 : 2−24 ≈ 5.96 × 10−8
  • 最小の正の正規化数 : 2−14 ≈ 6.10 × 10−5
  • 表現可能な最大数 : 65504

[編集] 半精度数の例

例では浮動小数点数のビット表現を16進数で表した。この中に符号・指数・仮数を含む。

3c00   = 1
c000   = -2

7bff   = 65504  (半精度数の最大値)

0400   = 2-14 ≈ 6.10352 × 10-5 (最小の正の正規化数)

0001   = 2-24 ≈ 5.96046 × 10-8 (最小の正の非正規化数)

0000   = 0
8000   = -0

7c00   = infinity
fc00   = -infinity

3555   ≈ 0.33325... ≈ 1/3 

倍精度と同様に、1/3は切り下げられる。これは仮数部のビット数が奇数であるためである。

[編集] 関連項目

  • IEEE 754
  • ISO/IEC 10967 - Language independent arithmetic(言語非依存の算術)
  • プリミティブ型
  • RGBE画像形式
  • minifloat - 16ビットや8ビットなど少ビットの浮動小数点表現の総称

[編集] 外部リンク

最終更新 2009年11月5日 (木) 04:30 (日時は個人設定で未設定ならばUTC)。
【半精度浮動小数点数】変更履歴

ご利用上の注意