固定小数点数

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

固定小数点数(こていしょうすうてんすう、: fixed-point number)は、小数点が置かれる桁を固定して表されたのことで、コンピュータ上で小数を表現する方法として使用される形式のひとつである。ある桁数のうちのある場所に小数点が固定されているもの(固定小数点)として扱う方式であるため、表現される仮数部に対して小数点の位置が移動する浮動小数点数の対義語として用いられる。すなわち、「固定-小数点数」ではなく「固定小数点-数」である。

演算自体は整数型と同じ方法、同じハードウェアで行われ、小数点位置は設計者の意図によって決定される。10進法で言えば、たとえば整数123は下から1桁分を小数点以下と決めれば12.3を表し、下から2桁分を小数点以下と決めれば1.23を表すことになる。コンピュータ上での演算で広く使用される2進法では、2進整数1111011(10進法表記: 123)は下から1桁分を小数点以下と決めれば111101.1(10進法表記: 61.5)、下から2桁分を小数点以下と決めれば11110.11(10進法表記: 30.75)となる。以下の文章では、特に断りがない限り2進固定小数点数について述べる。

特徴[編集]

浮動小数点数に比べて表現できる値の範囲ははるかに狭いが、情報落ちが起こらない(そもそも情報落ちが起きるような差のある値は表現できない)ことや高速に演算できることが利点に挙げられる。コンピュータグラフィックスで用いられる座標や画素値はある程度値域が限られるため、固定小数点数でも表現することができ浮動小数点数にくらべ高速に計算できるようになる。また、コンパイラなどにおいて、変数を定数で除算するような場合、普通に除算するよりも、除数の逆数を固定小数点の要領で表現したものを乗じてシフトして答えを求めた方が高速であることがあるため、そのような最適化をおこなうことがある[1]

なお、信号処理を実行するためのデバイスであるデジタルシグナルプロセッサでは、処理対象である信号の振幅の値の範囲が固定小数点的であるので、コストの高い浮動小数点演算のハードウェア (FPU) を搭載せず、固定小数点数が主に用いられる。現代のパソコンにおいては、演算を行うCPUにFPUが付属するものが主流であるため、小数の計算は一般に浮動小数点数を用いるものがほとんどだが、対象とするデータの特性や特に高速化が必要なコーデックなどでは固定小数点を用いることもある。

また、10進法での小数は2進法の小数として表現すると必ずしも有限小数とはならず、誤差を生じる。そのため、貨幣に関する計算のような、小数点以下で必要な桁数は決まっているが、2進法との変換を回避したい場合に、小数点以下の桁数をビット単位ではなく10進法の桁数で決めた固定小数点数も処理に用いられる[2]。当然のことだが、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で埋まる)と、有効桁数はそれだけ減るので、その場合に必要な精度を満たしているか注意が必要である。

実数値と固定小数点数値の換算[編集]

ある実数を x とし、これを固定小数点数で表した整数を n とする。最下位ビットを実数 L、オフセットを実数 O と定めると、実数 x は固定小数点数で次の数 n となる。ここで、round は四捨五入関数である。

固定小数点数 n から実数 x は次のように求まる。

脚注[編集]

  1. ^ ヘンリー・S.ウォーレン、ジュニア「第10章 整数定数による除算」『ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか』滝沢徹、玉井浩、鈴木貢、赤池英夫、葛毅、藤波順久訳、エスアイビー・アクセス、2004年。ISBN 4-434-04668-3
  2. ^ 通貨型 PostgreSQL 9.2.4文書(2014年2月3日閲覧)。

関連項目[編集]