固定小数点数
固定小数点数(こていしょうすうてんすう、英: fixed-point number)は、小数点が置かれる桁を固定して表された数のことである。ある桁数のうちのある場所に小数点が固定されているものとして扱う方式であるため、表現される仮数部に対して小数点の位置が移動する浮動小数点数の対義語として用いられる。コンピュータの数値表現のひとつである。
「固定-小数点数」ではなく「固定小数点-数」である。
Contents
特徴
浮動小数点数に比べて表現できる値の範囲ははるかに狭いが、情報落ちが起こらない(そもそも情報落ちが起きるような差のある値は表現できない)ことや高速に演算できることが利点に挙げられる。コンピュータグラフィックスで用いられる座標や画素値はある程度値域が限られるため、固定小数点数でも表現することができ浮動小数点数にくらべ高速に計算できるようになる。また、コンパイラなどにおいて、変数を定数で除算するような場合、普通に除算するよりも、除数の逆数を固定小数点の要領で表現したものを乗じてシフトして答えを求めた方が高速であることがあるため、そのような最適化をおこなうことがある(『ハッカーのたのしみ』10章)。
なお、信号処理を実行するためのデバイスであるデジタルシグナルプロセッサでは、処理対象である信号の振幅の値の範囲が固定小数点的であるので、コストの高い浮動小数点演算のハードウェアを搭載せず、固定小数点数が主に用いられる。現代のパソコンにおいては、演算を行うCPUにFPUが付属するものが主流であるため、小数の計算は一般に浮動小数点数を用いるものがほとんどだが、対象とするデータの特性や特に高速化が必要なコーデックなどでは固定小数点を用いることもある。
また、10進法での小数は2進法の小数として表現すると必ずしも有限小数とはならず、誤差を生じる。そのため、貨幣に関する計算のような、小数点以下で必要な桁数は決まっているが、2進法との変換を回避したい場合に、小数点以下の桁数をビット単位ではなく10進法の桁数で決めた固定小数点数も処理に用いられる[1]。当然のことだが、10進計算が万能で無誤差というわけではない。例えば、3の倍数でない値を3で割る場合、10進計算では割り切れないため、誤差は避けられない。
Q表記(Qフォーマット)
固定小数点数は、小数部分のビット数をQ表記(Qフォーマット)で表す。例えば、小数部分のビット数が12ビットである場合には、Q12表記もしくはQ12フォーマットと呼ばれる。
例えば、1.5をQ1表記で表現すると2進数表記では11である。この表記ではビット0とビット1の間に小数点がある。
注:(1*2^0)+(1*2^-1)=1.5
固定小数点演算
固定小数点演算における四則演算においては、加算や減算はそのまま整数同士の加減算として計算できる。しかし、乗算や除算では演算結果の小数点位置が掛けた数の小数点の位置だけずれることになるため、元の小数点位置に戻す場合には乗算では右側(LSB側)へ、除算では左側(MSB側)へシフト演算を行う必要がある。
ここでは例えば、1.5と0.5の加算を考えてみる。1.5、0.5はQ1表記では各々2進数表記で11、01である。これらQ1表記の数(11と01)をそのまま足してみると100となるが、100を元の実数に直すと2.0であるので通常の加算のまま計算できている。次に乗算を考え単純にQ1表記の数(11と01)を掛けてみる。結果は11であるがこれをQ1表記であるとみなして実数に直すと1.5となる。1.5と0.5の乗算結果の正解は0.75であるのでこの解釈は間違いである。乗算では、小数点部分のビット数が、乗算対象となる2つの固定小数点数の小数点部分のビット数の和になる。Q1表記同士であれば、計算後の小数部のビット数は1ビット足す1ビットで2ビットとなる。そのため乗算結果の11はQ2表記として解釈する必要がある。またQ1表記に直す場合には、1ビット右にシフトする必要がある。
また、浮動小数点数にくらべ表現可能な範囲が狭く算術オーバーフローや算術アンダーフローが発生しやすいことに注意したほうがよい。
固定小数点数の精度
固定小数点方式で有効桁数が十分にとれるのは、(符号ビットを除く)最上位桁が1の範囲内だけである。この時の相対誤差は桁数がn桁の時1/2nである。表現しようとする数が0に近づき上位桁が0で埋まる(ないし2の補数表現の負の数であれば1で埋まる)と、有効桁数はそれだけ減るので、その場合に必要な精度を満たしているか注意が必要である。
脚注
- ↑ 通貨型 PostgreSQL 9.2.4文書(2014年2月3日閲覧)。
関連項目
- コンピュータの数値表現
- 浮動小数点数
- 二進化十進表現 (BCD)
- 誤差、端数処理