今回はジサトラショータ氏の「浮動小数点の単精度と倍精度って何?」という質問に答えよう。最近はこれに倍々精度や半精度も使われるようになっているので、非常にわかりにくかったりする。
計算式の桁数を抑えられる
浮動小数点
そもそもコンピューターは数字の演算に関して、整数演算と小数演算の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日)
この連載の記事
-
第768回
PC
AIアクセラレーター「Gaudi 3」の性能は前世代の2~4倍 インテル CPUロードマップ -
第767回
PC
Lunar LakeはWindows 12の要件である40TOPSを超えるNPU性能 インテル CPUロードマップ -
第766回
デジタル
Instinct MI300のI/OダイはXCDとCCDのどちらにも搭載できる驚きの構造 AMD GPUロードマップ -
第765回
PC
GB200 Grace Blackwell SuperchipのTDPは1200W NVIDIA GPUロードマップ -
第764回
PC
B100は1ダイあたりの性能がH100を下回るがAI性能はH100の5倍 NVIDIA GPUロードマップ -
第763回
PC
FDD/HDDをつなぐため急速に普及したSASI 消え去ったI/F史 -
第762回
PC
測定器やFDDなどどんな機器も接続できたGPIB 消え去ったI/F史 -
第761回
PC
Intel 14Aの量産は2年遅れの2028年? 半導体生産2位を目指すインテル インテル CPUロードマップ -
第760回
PC
14nmを再構築したIntel 12が2027年に登場すればおもしろいことになりそう インテル CPUロードマップ -
第759回
PC
プリンター接続で業界標準になったセントロニクスI/F 消え去ったI/F史 -
第758回
PC
モデムをつなぐのに必要だったRS-232-CというシリアルI/F 消え去ったI/F史 - この連載の一覧へ