固定小数点数のソースを表示
←
固定小数点数
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
'''固定小数点数'''(こていしょうすうてんすう、{{lang-en-short|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進固定小数点数について述べる。 == 特徴 == 浮動小数点数に比べて表現できる値の範囲ははるかに狭いが、情報落ちが起こらない(そもそも情報落ちが起きるような差のある値は表現できない)ことや高速に演算できることが利点に挙げられる。コンピュータグラフィックスで用いられる座標や画素値はある程度値域が限られるため、固定小数点数でも表現することができ浮動小数点数にくらべ高速に計算できるようになる。また、[[コンパイラ]]などにおいて、変数を定数で除算するような場合、普通に除算するよりも、除数の逆数を固定小数点の要領で表現したものを乗じてシフトして答えを求めた方が高速であることがあるため、そのような最適化をおこなうことがある<ref>{{Cite book |和書 |author=ヘンリー・S.ウォーレン、ジュニア |title=ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか |year=2004 |translator=滝沢徹、玉井浩、鈴木貢、赤池英夫、葛毅、藤波順久 |publisher=エスアイビー・アクセス |isbn=4-434-04668-3 |chapter=第10章 整数定数による除算 }}</ref>。 なお、信号処理を実行するためのデバイスである[[デジタルシグナルプロセッサ]]では、処理対象である信号の振幅の値の範囲が固定小数点的であるので、コストの高い浮動小数点演算のハードウェア ([[FPU]]) を搭載せず、固定小数点数が主に用いられる。現代のパソコンにおいては、演算を行う[[CPU]]にFPUが付属するものが主流であるため、小数の計算は一般に浮動小数点数を用いるものがほとんどだが、対象とするデータの特性や特に高速化が必要な[[コーデック]]などでは固定小数点を用いることもある。 また、10進法での小数は2進法の小数として表現すると必ずしも有限小数とはならず、誤差を生じる。そのため、貨幣に関する計算のような、小数点以下で必要な桁数は決まっているが、2進法との変換を回避したい場合に、小数点以下の桁数をビット単位ではなく10進法の桁数で決めた固定小数点数も処理に用いられる<ref>[http://www.postgresql.jp/document/9.2/html/datatype-money.html 通貨型] [[PostgreSQL]] 9.2.4文書(2014年2月3日閲覧)。</ref>。当然のことだが、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/2<sup>n</sup>である。表現しようとする数が0に近づき上位桁が0で埋まる(ないし2の補数表現の負の数であれば1で埋まる)と、有効桁数はそれだけ減るので、その場合に必要な精度を満たしているか注意が必要である。 == 実数値と固定小数点数値の換算 == ある実数を x とし、これを固定小数点数で表した整数を n とする。[[最下位ビット]]を実数 L、[[オフセット]]を実数 O と定めると、実数 x は固定小数点数で次の数 n となる。ここで、round は[[端数処理|四捨五入関数]]である。 {{Indent|<math>n=\operatorname{round}\left(\frac{x-O}{L}\right)</math>}} 固定小数点数 n から実数 x は次のように求まる。 {{Indent|<math>x=Ln+O</math>}} == 出典 == {{Reflist}} == 関連項目 == * [[コンピュータの数値表現]] * [[浮動小数点数]] * [[二進化十進表現]] (BCD) * [[誤差]]、[[端数処理]] {{データ型}} {{DEFAULTSORT:こていしようすうてんすう}} [[Category:コンピュータの算術]] [[Category:データ型]] [[Category:数の表現]] [[Category:数学に関する記事]]
このページで使用されているテンプレート:
テンプレート:Cite book
(
ソースを閲覧
)
テンプレート:Indent
(
ソースを閲覧
)
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
テンプレート:データ型
(
ソースを閲覧
)
固定小数点数
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報