今回はジサトラショータ氏の「浮動小数点の単精度と倍精度って何?」という質問に答えよう。最近はこれに倍々精度や半精度も使われるようになっているので、非常にわかりにくかったりする。
計算式の桁数を抑えられる
浮動小数点
そもそもコンピューターは数字の演算に関して、整数演算と小数演算の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日)
この連載の記事
-
第798回
PC
日本が開発したAIプロセッサーMN-Core 2 Hot Chips 2024で注目を浴びたオモシロCPU -
第797回
PC
わずか2年で完成させた韓国FuriosaAIのAIアクセラレーターRNGD Hot Chips 2024で注目を浴びたオモシロCPU -
第796回
PC
Metaが自社開発したAI推論用アクセラレーターMTIA v2 Hot Chips 2024で注目を浴びたオモシロCPU -
第795回
デジタル
AI性能を引き上げるInstinct MI325XとPensando Salina 400/Pollara 400がサーバーにインパクトをもたらす AMD CPUロードマップ -
第794回
デジタル
第5世代EPYCはMRDIMMをサポートしている? AMD CPUロードマップ -
第793回
PC
5nmの限界に早くもたどり着いてしまったWSE-3 Hot Chips 2024で注目を浴びたオモシロCPU -
第792回
PC
大型言語モデルに全振りしたSambaNovaのAIプロセッサーSC40L Hot Chips 2024で注目を浴びたオモシロCPU -
第791回
PC
妙に性能のバランスが悪いマイクロソフトのAI特化型チップMaia 100 Hot Chips 2024で注目を浴びたオモシロCPU -
第790回
PC
AI推論用アクセラレーターを搭載するIBMのTelum II Hot Chips 2024で注目を浴びたオモシロCPU -
第789回
PC
切り捨てられた部門が再始動して作り上げたAmpereOne Hot Chips 2024で注目を浴びたオモシロCPU -
第788回
PC
Meteor Lakeを凌駕する性能のQualcomm「Oryon」 Hot Chips 2024で注目を浴びたオモシロCPU - この連載の一覧へ