今回はジサトラショータ氏の「浮動小数点の単精度と倍精度って何?」という質問に答えよう。最近はこれに倍々精度や半精度も使われるようになっているので、非常にわかりにくかったりする。
計算式の桁数を抑えられる
浮動小数点
そもそもコンピューターは数字の演算に関して、整数演算と小数演算の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日)

この連載の記事
-
第817回
PC
実現困難と思われていたUCIe互換のチップレット間インターコネクトをTSMCとAMDが共同で発表 ISSCC 2025詳報 -
第816回
PC
シリコンインターポーザーを使わない限界の信号速度にチャレンジしたIBMのTelum II ISSCC 2025詳報 -
第815回
デジタル
3次キャッシュがスリムになっていたZen 5、ISSCCで公開された詳報 AMD CPUロードマップ -
第814回
PC
インテルがチップレット接続の標準化を画策、小さなチップレットを多数つなげて性能向上を目指す インテル CPUロードマップ -
第813回
PC
Granite Rapid-DことXeon 6 SoCを12製品発表、HCCとXCCの2種類が存在する インテル CPUロードマップ -
第812回
PC
2倍の帯域をほぼ同等の電力で実現するTSMCのHPC向け次世代SoIC IEDM 2024レポート -
第811回
PC
Panther Lakeを2025年後半、Nova Lakeを2026年に投入 インテル CPUロードマップ -
第810回
PC
2nmプロセスのN2がTSMCで今年量産開始 IEDM 2024レポート -
第809回
PC
銅配線をルテニウム配線に変えると抵抗を25%削減できる IEDM 2024レポート -
第808回
PC
酸化ハフニウム(HfO2)でフィンをカバーすると性能が改善、TMD半導体の実現に近づく IEDM 2024レポート -
第807回
PC
Core Ultra 200H/U/Sをあえて組み込み向けに投入するのはあの強敵に対抗するため インテル CPUロードマップ - この連載の一覧へ