今回はジサトラショータ氏の「浮動小数点の単精度と倍精度って何?」という質問に答えよう。最近はこれに倍々精度や半精度も使われるようになっているので、非常にわかりにくかったりする。
計算式の桁数を抑えられる
浮動小数点
そもそもコンピューターは数字の演算に関して、整数演算と小数演算の2つに分けて実装しているのが普通である。これは「何桁まで処理する必要があるか」というニーズが根本的に違うためだ。
整数の場合、普通(なにをもって普通というかはアレだが)は10桁くらいの計算ができれば十分である。もちろん企業における会計処理などでは10桁では足りない(売上1兆円を表現するのには12桁が必要だ)が、そういう規模の大きな処理は別途考えることにすれば、9桁か10桁あれば大体用が足りる。
ところが小数の場合、そもそも何桁まで処理できれば足りるか、というのはあまりにケースバイケースすぎる。たとえば利息の計算。100万円(これで7桁である)に利子が数銭(これが2桁)だから9桁でギリ。1000万くらいの定期預金では10桁以上が必須になる。
ただしこれだと整数部8桁+小数部2桁だが、なかには整数は2桁程度で良いけど小数が5桁ほしいというニーズもあるわけで、両方に対応しようとすると13桁くらいないと足りないことになる。実際はもっと桁数が必要になるケースが少なくない。
これはあまりに効率が悪いので、小数を扱う場合には浮動小数点と呼ばれる方式を採用することになった。例えば123456.789という数字を扱う場合、以下としてデータが保存されることになる。
| 123456.789の表示方式 | ||||||
|---|---|---|---|---|---|---|
| 従来の方式(固定小数点方式) | 123456.789 | 整数部6桁+小数部3桁 | ||||
| 浮動小数点方式 | 1.23456789×105 | 仮数部9桁+指数部1桁 | ||||
この方式が便利なのは、元の数字が12345678.9や1.23456789だった場合を考えるとわかりやすい。
| 12345678.9の場合 | ||||||
|---|---|---|---|---|---|---|
| 固定小数点方式 | 12345678.9 | 整数部8桁+小数部1桁 | ||||
| 浮動小数点方式 | 1.23456789×108 | 仮数部9桁+指数部1桁 | ||||
| 1.23456789の場合 | ||||||
| 固定小数点方式 | 1.23456789 | 整数部1桁+小数部8桁 | ||||
| 浮動小数点方式 | 1.23456789×100 | 仮数部9桁+指数部1桁 | ||||
つまり固定小数点方式では1.23456789~12345678.9までのすべての数字を扱うためには整数部8桁+小数部8桁が必要になる。
対して浮動小数点方式では常に仮数部(1.23456789を格納するところ)が9桁+指数部(10のべき乗の値を格納するところ)の1桁で、合計10桁で済む。
とるべき値の範囲が厳密に決まっていて、そこからはみ出さないというケースなら固定小数点方式でも不利はない(むしろ便利なことが多い)が、どんな値がくるか予想がつかないのが普通であり、そうした場合には浮動小数点を利用したほうが、格納エリアを小さく抑えられることになる。
数字の表現は半精度から
8倍精度までの8通りがある
1980年代頃まではこの浮動小数点の方式には標準がなく、コンピューターメーカーがおのおの勝手にフォーマットを決めていたのだが、1985年にIEEE(米国電気電子学会)がIEEE 754と呼ばれる標準規格(IEEE 754-1985)を定めて、各社もこれに順ずる形で実装している。したがって最近はよほど変な要求がない限り、浮動小数点のフォーマットは共通である。
ちなみにそのIEEE 754であるが、その後2008年にも改定されており(IEEE 754-2008)、いろいろ表現が増えている。昨今のCPUはすべてこのIEEE 754-2008に準じた演算をしていると考えていいだろう。
ということでここからはIEEE 754-2008をベースに話をしていきたい。IEEE 754-2008では、数字の表現について以下の8つのフォーマットを定めている。
| IEEE 754-2008のフォーマット | ||||||
|---|---|---|---|---|---|---|
| フォーマット | 仮数部 (サイズ) |
仮数部 (桁数) |
指数部 (サイズ) |
指数部 (範囲) |
基数 | データ長 |
| Binary16(半精度) (FP16) |
11bit | 3桁 | 5bit | -14~+15 | 2 | 16bit |
| Binary32(単精度) (FP32) |
24bit | 7桁 | 8bit | -126~+127 | 2 | 32bit |
| Binary64(倍精度) (FP64) |
53bit | 15桁 | 11bit | -1022~+1023 | 2 | 64bit |
| Binary128(4倍精度) (FP128) |
113bit | 34桁 | 15bit | -16382~+16383 | 2 | 128bit |
| Binary256(8倍精度) (FP256) |
237bit | 71桁 | 19bit | -262142~+262143 | 2 | 256bit |
| Decimal32(単精度) | 21bit | 7桁 | 11bit | -95~+96 | 10 | 32bit |
| Decimal64(倍精度) | 51bit | 16桁 | 13bit | -383~+384 | 10 | 64bit |
| Decimal128(4倍精度) | 111bit | 34桁 | 17bit | -6143~+6144 | 10 | 128bit |
ただしこのうちBinary16/Binary256/Decimal32の3つのフォーマットに関しては交換用と定められている。交換用とはデータの受け渡しをするためのもので、たとえばBinary16ならBinary32/64/128との間で相互変換ができれば良く、演算そのものを実装する必要はない。実際には昨今AIに絡んで、Binary16の演算を実装している例が多くなっている。
※お詫びと訂正:IEEE 754-2008のフォーマット表の一部に誤りがありました。記事を訂正してお詫びします。(2018年8月27日)

この連載の記事
-
第852回
PC
Google最新TPU「Ironwood」は前世代比4.7倍の性能向上かつ160Wの低消費電力で圧倒的省エネを実現 -
第851回
PC
Instinct MI400/MI500登場でAI/HPC向けGPUはどう変わる? CoWoS-L採用の詳細も判明 AMD GPUロードマップ -
第850回
デジタル
Zen 6+Zen 6c、そしてZen 7へ! EPYCは256コアへ向かう AMD CPUロードマップ -
第849回
PC
d-MatrixのAIプロセッサーCorsairはNVIDIA GB200に匹敵する性能を600Wの消費電力で実現 -
第848回
PC
消えたTofinoの残響 Intel IPU E2200がつなぐイーサネットの未来 -
第847回
PC
国産プロセッサーのPEZY-SC4sが消費電力わずか212Wで高効率99.2%を記録! 次世代省電力チップの決定版に王手 -
第846回
PC
Eコア288基の次世代Xeon「Clearwater Forest」に見る効率設計の極意 インテル CPUロードマップ -
第845回
PC
最大256MB共有キャッシュ対応で大規模処理も快適! Cuzcoが実現する高性能・拡張自在なRISC-Vプロセッサーの秘密 -
第844回
PC
耐量子暗号対応でセキュリティ強化! IBMのPower11が叶えた高信頼性と高速AI推論 -
第843回
PC
NVIDIAとインテルの協業発表によりGB10のCPUをx86に置き換えた新世代AIチップが登場する? -
第842回
PC
双方向8Tbps伝送の次世代光インターコネクト! AyarLabsのTeraPHYがもたらす革新的光通信の詳細 - この連載の一覧へ











