CPUの内部演算について

浮動小数点演算,整数演算について,具体的な例を挙げて分かりやすく教えてください。

 


ベンチマークテストではよく,整数演算と浮動小数点演算を分けて表示しています。その理由は整数と浮動小数点の演算を実行するCPUのユニット(回路)が異なるからです。浮動小数点演算と整数演算の違いを考えてみましょう。

●整数演算
 コンピュータは2進数で演算を行います。2進数の演算(加減乗除)は単純な電子回路で実現できるためです。
 整数はプラス方向とマイナス方向に対して無限ですが,範囲を区切れば飛び飛びの有限の数です。例えば,2進数32桁(32ビット)を単位にし,最上位ビットを符号(プラス/マイナス)に使用すると+2147483647〜−2147483648の整数が表現できます。もちろん,ビット数を増やすほど表現できる数は多くなります。
 実用上十分なビット数さえ用意できれば,電子回路=コンピュータで容易に整数を演算できます。整数演算という場合,整数値を扱うALU(Arithmetic Logic Unit:算術論理演算回路)で演算できる加減乗除や論理演算の命令で行う計算を指します。現在のCPUは整数演算ならば瞬時に実行してくれます。

●浮動小数点とは
 「実数」を思い出してください。実数は概念上,連続した無限の数と習ったはずです。例えば,実数世界では1と2の間でさえ無限の数が存在します。したがって,実数を2進数で表現するには無限ビットが必要ですが,コンピュータは電子回路にすぎず,無限ビットを演算することはできません。
 コンピュータが整数でしか使えないとすれば,用途が大幅に限定されてしまいます。そこで,有限ビットで実数を近似する数である浮動少数点が使われるのです。コンピュータの浮動小数点は2進数を使いますが,分かりやすくするために先に10進数を考えてみましょう。
 例えば,0.00001を1.0×10-5と表現することを覚えているでしょうか。これを科学記数法と呼び,必ず次のように数を表現します。

    x.xxxxxxxx ×10 yyyyyy

 科学記数法では通常,先頭にゼロが付かず,なおかつ2桁にならない表現を使います。例えば,0.1×10-4や,10×10-6は使われません。数を正しい科学記数法に変換することを「正規化する」といいます。
 科学記数法は2進数でも可能で,次のようになります。

    x.xxxxxxxx ×2 yyyyyyy

 x.xxxxxxは2進数,指数部も2進数で表現するのが浮動小数点です。浮動小数点でも必ず正規化する点に注意してください。
 ビット数を増やすほど,浮動小数点数で表現できる数の精度や範囲が上昇しますが,フォーマットはIEEEにより標準化されています。インテルのCPUで使える浮動小数点数の主なフォーマットを表1に挙げておきます。
 浮動小数点のIEEE標準では必ず正規化を行い,なおかつ仮数部の先頭の1を省略しています。浮動小数点で表現できる数は次の式で表されます。

-1×符号ビット×(1+仮数部)×2 指数部乗

 ただし,ゼロを表す数だけは全ビットが0になり,暗黙の先頭の1は加算されません。また,指数部には普通の2の補数表現は用いられず,全ビットがゼロの数を最少の負の指数,全ビットが1のとき正の指数の最大値とするゲタ付き表現が使われます。これは,浮動小数点数の大小比較を行いやすくするためです。
 コンピュータが扱う浮動小数点数は実数の近似にすぎませんが,コンピュータの演算結果は内部で丸め処理が行われ,無限精度の演算に最も近い数が得られるよう工夫されています(それでも,厳密な科学系の計算では精度が大問題です)。インテル系CPUの内部では表1に示した拡張表現しか用いられず,単精度や倍精度を使用する場合は内部で拡張表現に変換されます。インテル系CPUは浮動小数点演算の性能があまり高くありませんが,その代わりに精度が高いという特徴があります。

●FPU命令
 浮動小数点数の計算は整数とは異なる専用の演算ユニット,FPU(Floating-point Processing Unit)が用いられます。インテル系CPUでは,表2に示した浮動小数点数をオペランド(演算対象)にするFPU命令が実装されています。FPU命令の分類と命令数を列挙しますが,命令数はコプロセッサの世代(387,487,Pentiumなど)により若干異なっています。浮動小数点演算という場合,表に示した命令を組み合わせて行う実数計算を指すと理解してください。
(米田 聡)

名前 符号 指数部 仮数部 総ビット数
単精度 1 8 24 32
倍精度 1 11 53 64
拡張 1 15 64 80

表1 主な浮動小数点数フォーマット(単位:ビット)

分類 機能 命令数(Pentiumを基準)
転送 数をスタックからメモリへ
スタックからスタックへ値の移動
9
非超越関数 加減乗除に関連する命令群
平方根,剰余計算など
9
比較 二つの浮動小数点の比較を行う 10
超越関数 三角関数,対数など 8
定数 よく使う定数を返す
自然対数の底,円周率など
7
制御 条件分岐関連など 15

表2 インテルFPUの命令種別