浮動小数点数演算はむずかしくない

 固定小数点数演算と聞くと拒絶反応を示す人もいるけど、計算の考え方自体は簡単で、皆さんも小さい頃から知恵として持っていると思います。

 0.6+0.7+0.2を計算する時、まず6+7+2を計算して、結果の15の小数点の位置をずらして1.5という答えを導きますよね。ほぼこれのことです。


 この例でいうと

  • 0.6を6としたり15を1.5とする小数点位置の調整(スケーリング)は、コンピュータではなく人間がやる。
  • コンピュータはあくまで6+7+15を計算する。

というのが、固定小数点数演算の考え方です。これを掛け算(乗算)にも拡大すると、もう固定小数点数演算のできあがりです。*1


 何でこんなことをするかというと、

  • コンピュータは浮動小数点数の計算より、整数の計算の方が得意=高速に行える。
  • 最近のCPU(マイクロプロセッサやDSP)はハードウェアがSIMD(複数の整数の足し算や掛け算を一命令で行える)命令を備えていることが多く、さらに計算を高速に行える。

という処理速度上の要求です。


 みなさん、PCや携帯やスマートフォンで、写真=静止画やビデオ=動画や音楽/音声を扱いますよね。こういう機能はたくさんの実数演算を行うので、固定小数点数演算を使って高速に処理しないと、コマ落ちしたりして使い勝手が悪くなるのです。


 さて、固定小数点数演算の基本的な考え方は簡単ですが、次のことには少しテクニックが要ります。

  • 演算精度を保つ。コンピュータの整数は表現できる数の範囲が狭いので、必要な演算精度を確保するために工夫が必要です。
  • 小数点の位置を明確にする。先程も言いましたが、小数点は人間=プログラマの頭の中にのみ存在します。その小数点がどこに存在するか(Qフォーマット)は文書やコメントの形で残しておかないと、苦労します。
  • CPUのアーキテクチャを理解する。CPUのレジスタ構成や命令を熟知すると、さらなる高速化が可能なことが多いです。


以上です。

*1:引き算は負数の足し算に、割り算は逆数の掛け算として考えることができます。