コンピューティングにおいて、固定小数点とは、小数部の桁数を固定して格納することで 、小数(非整数)数を表す方法です。たとえば、ドルの金額は、セント(ドルの 1/100)を表す小数部 2 桁で格納されることがよくあります。より一般的には、この用語は、小数値を固定された小さな単位の整数倍として表すことを指す場合があります。たとえば、時間の小数を 10 分間隔の整数倍として表すなどです。固定小数点数表現は、より複雑で計算量の多い浮動小数点数表現と対比されることがよくあります。
固定小数点表現では、分数は整数部分と同じ基数で表現されることが多いですが、基数bの負の累乗を使用します。最も一般的なバリアントは、10 進数(基数 10) と2 進数(基数 2) です。後者は一般にバイナリ スケーリングとも呼ばれます。したがって、n桁の分数が格納されている場合、値は常にb − nの整数倍になります。固定小数点表現は、たとえば大きなドル値を 1000 ドルの倍数として表す場合など、整数値の下位桁を省略するためにも使用できます。
10 進固定小数点数が人間が読めるように表示される場合、小数部の桁は通常、基数文字 (英語では通常 '.'、他の多くの言語では ',' または他の記号) によって整数部の桁から分離されます。ただし、内部的には分離されておらず、2 つの数字グループの区別は、そのような数値を処理するプログラムによってのみ定義されます。
固定小数点表現は機械式計算機では標準でした。最近のプロセッサのほとんどには高速浮動小数点ユニット(FPU) があるため、プロセッサベースの実装における固定小数点表現は現在、低コストの組み込み マイクロプロセッサやマイクロコントローラ、画像、ビデオ、デジタル信号処理などの高速性や低消費電力、または小さなチップ面積を要求するアプリケーション、または問題に対して固定小数点表現を使用する方が自然な場合など、特殊な状況でのみ使用されています。後者の例としては、厳密に規定された方法でセント単位の小数をセント単位に丸めなければならないドル金額の計算、テーブル参照による関数の評価、または有理数を丸め誤差なしで表現する必要があるアプリケーション (固定小数点では可能ですが、浮動小数点では不可能) などがあります。固定小数点表現は、フィールドプログラマブルゲートアレイ(FPGA) 実装では依然として標準です。FPGA での浮動小数点サポートには固定小数点サポートよりも大幅に多くのリソースが必要になるためです。[1]
表現
小数の固定小数点表現は、本質的には固定のスケーリング係数で暗黙的に乗算される整数です。たとえば、値 1.23 は、暗黙的なスケーリング係数 1/1000 (最後の 3 つの小数桁が暗黙的に小数であると想定される) を持つ整数値 1230 として変数に格納できます。また、値1 230 000 は、暗黙的なスケーリング係数 1000 (暗黙的な小数桁が「マイナス 3」、つまり右側に 3 つの暗黙的なゼロがある) を持つ 1230 として表すことができます。この表現により、標準の整数演算論理ユニットで有理数の計算を実行できます。
負の値は、通常、 2 の補数表現の符号付き整数として、上記のような暗黙的なスケーリング係数を使用して2 進固定小数点形式で表されます。値の符号は、小数ビットの数が総ビット数以上の場合でも、常に最初に格納されたビットによって示されます (1 = 負、0 = 非負)。たとえば、8 ビットの符号付き 2 進整数 (11110101) 2 = −11 に、暗黙の小数ビット -3、+5、および +12 が付けられると、それぞれ −11/2 −3 = −88、−11/ 2 5 = −0. 343 75、および −11/2 12 = −0. 002 685 546 875という値を表します。
あるいは、負の値は符号絶対値形式の整数で表すこともできます。この場合、暗黙の小数部ビットの数に符号は含まれません。この変形は、10 進固定小数点演算でより一般的に使用されます。したがって、符号付き 5 桁の 10 進整数 (-00025) 10 は、-3、+5、および +12 の暗黙の小数部桁とともに、それぞれ -25/10 -3 = -25000、-25/10 5 = -0.00025、および -25/10 12 = -0. 000 000 000 025という値を表します。
プログラムでは通常、特定の変数に格納される、または特定の命令によって生成されるすべての固定小数点値が同じスケーリング係数を持つと想定されます。このパラメータは通常、必要な精度と格納される値の範囲に応じてプログラマが選択できます。
変数または数式のスケーリング係数は、プログラム内に明示的に表示されない場合があります。 適切なプログラミング慣行では、少なくともソース コード内のコメントとして、ドキュメントにスケーリング係数を提供する必要があります。
スケーリング係数の選択
効率性を高めるために、スケーリング係数は、内部的に整数を表すために使用される基数bの累乗(正または負) に選択されることがよくあります。ただし、多くの場合、最適なスケーリング係数はアプリケーションによって決定されます。したがって、整数が内部的に 2 進数で表現されている場合でも、人間の利便性のために、10 の累乗 (たとえば、ドルの値の場合は 1/100) のスケーリング係数が使用されることがよくあります。10 進数のスケーリング係数は、メートル法 (SI) システムともうまく調和します。これは、固定小数点のスケーリング係数の選択が、測定単位 (メートル ではなくセンチメートルやミクロンなど) の選択と同じであることが多いためです。
ただし、他のスケーリング係数が使用される場合もあります。たとえば、時間の小数部は秒数の整数として表されます。つまり、スケール係数が 1/3600 の固定小数点数として表されます。
最も慎重に丸めを行った場合でも、スケーリング係数Sで表される固定小数点値には、格納された整数で最大 ±0.5、つまり値で ±0.5 Sの誤差が生じる可能性があります。したがって、スケーリング係数が小さいほど、通常はより正確な結果が生成されます。
一方、スケーリング係数が小さいということは、特定のプログラム変数に格納できる値の範囲が狭いことを意味します。変数に格納できる最大の固定小数点値は、その変数に格納できる最大の整数値にスケーリング係数を掛けた値です。最小値についても同様です。たとえば、次の表は、暗黙のスケーリング係数S、最小および最大の表現可能な値V minおよびV max 、および暗黙の小数ビット数fに応じて、16 ビット符号付き 2 進固定小数点形式で表現できる値の精度δ = S /2 を示しています。
2 n -1 の形式 (つまり 1、3、7、15、31 など)のスケーリング係数を持つ固定小数点形式は、画像処理やその他のデジタル信号処理タスクに適していると言われています。これらは、通常の 2 nスケーリングよりも、固定小数点値と浮動小数点値の間でより一貫した変換を提供すると考えられています。Juliaプログラミング言語は、両方のバージョンを実装しています。[2]
正確な値
1/16 や 17/32 などの任意の 2 進分数a /2 m は、 n ≥ mの2 の累乗のスケーリング係数 1/2 nを使用して、固定小数点で正確に表現できます。ただし、 0.1 や 0.123 などのほとんどの小数は、 2 を底とする無限循環分数であるため、そのように表現することはできません。
同様に、 1/100 や 37/1000 などの任意の小数a /10 m は、 n ≥ mの10 の累乗のスケーリング係数 1/10 nを使用して固定小数点で正確に表すことができます。この 10 進形式は、 1/8 (0.125) や 17/32 (0.53125) などの任意の 2 進小数a /2 mも表すことができます。
より一般的には、aとbが互いに素で b が正である有理数 a / b は、bが 2の累乗である場合にのみ 2 進固定小数点で正確に表現でき、 b に2 および/または 5 以外の素因数 が存在しない場合にのみ 10 進固定小数点で正確に表現できます。
浮動小数点との比較
固定小数点演算は、浮動小数点演算よりも高速で、使用するハードウェアも少なくて済みます。表現する値の範囲が事前にわかっていて、十分に制限されている場合、固定小数点では利用可能なビットをより有効に活用できます。たとえば、0 から 1 までの数値を表現するために 32 ビットを使用できる場合、固定小数点表現の誤差は 1.2 × 10 −10未満になりますが、標準の浮動小数点表現では、9 ビットが動的スケーリング係数の符号と指数で無駄になるため、誤差が最大 596 × 10 −10になる可能性があります。具体的には、32 ビット固定小数点オーディオと浮動小数点オーディオを比較すると、40 dB未満のヘッドルームしか必要としない録音では、32 ビット固定小数点オーディオを使用した方が信号対雑音比が高くなります。
固定小数点計算を使用するプログラムは、FPU の可用性に依存しないため、通常、浮動小数点を使用するプログラムよりも移植性が高くなります。この利点は、IEEE 浮動小数点標準が広く採用される前は、同じデータを使用した浮動小数点計算で、メーカーやコンピューター モデルによって結果が異なっていたため、特に強力でした。
多くの組み込みプロセッサには FPU がありません。これは、整数演算ユニットはFPU よりも大幅に少ない論理ゲートを必要とし、チップ面積もはるかに小さいためです。また、低速デバイスでの浮動小数点のソフトウェアエミュレーションは、ほとんどのアプリケーションでは遅すぎるでしょう。Intel 386や486SXなどの初期のパーソナル コンピュータやゲーム コンソールの CPU チップにも FPU はありませんでした。
固定小数点形式の絶対解像度(連続する値間の差)は、範囲全体にわたって一定であり、つまりスケーリング係数Sです。対照的に、浮動小数点形式の相対解像度は範囲全体にわたってほぼ一定であり、基数bの係数内で変化します。一方、絶対解像度は、値自体と同様に、桁違いに変化します。
多くの場合、固定小数点計算の丸め誤差と切り捨て誤差は、同等の浮動小数点計算のそれらよりも分析が容易です。固定小数点演算では、ディザリングやノイズシェーピングなどの線形化手法を切り捨てに適用するのがより簡単です。一方、固定小数点を使用する場合は、プログラマーによる細心の注意が必要です。オーバーフローを回避するには、計算における変数の範囲とすべての中間値について、より厳密な見積もりが必要であり、多くの場合、スケーリング係数を調整するための追加コードも必要です。固定小数点プログラミングでは、通常、異なる幅の整数型を使用する必要があります。固定小数点アプリケーションでは、ブロック浮動小数点を使用できます。これは、固定小数点データの各配列 (ブロック) が 1 ワード内の共通指数でスケーリングされる固定小数点環境です。
アプリケーション
10 進固定小数点の一般的な用途は、金銭の値を格納することです。この場合、浮動小数点数の複雑な丸めルールが問題になることがよくあります。たとえば、C で書かれたオープンソースの資金管理アプリケーションGnuCash は、この理由から、バージョン 1.6 で浮動小数点から固定小数点に切り替えました。
バイナリ固定小数点 (バイナリ スケーリング) は、1960 年代後半から 1980 年代にかけて、飛行シミュレーションや原子力発電所の制御アルゴリズムなど、数学的に高度なリアルタイム コンピューティングに広く使用されていました。現在でも、多くのDSPアプリケーションやカスタム マイクロプロセッサで使用されています。角度を含む計算では、バイナリ角度測定が使用されます。
バイナリ固定小数点は、STM32G4シリーズのCORDICコプロセッサと、JPEGイメージの圧縮に使用される離散コサイン変換アルゴリズムで使用されます。
電気メーターやデジタル時計などの電子機器は、温度や電源電圧などから生じる誤差を補正するために多項式を使用することが多い。係数は多項式回帰によって生成される。バイナリ固定小数点多項式は浮動小数点よりも多くのビット精度を利用でき、安価な CPU を使用して高速コードでそれを実現する。機器にとって極めて重要な精度は、固定小数点多項式がホーナー法(例: y = (( ax + b ) x + c ) x + d ) を使用して評価され、丸め回数が削減され、固定小数点乗算で丸め加数が利用される場合、同等のビットの浮動小数点計算に匹敵する。
オペレーション
加算と減算
同じ暗黙的なスケーリング係数を持つ 2 つの値を加算または減算するには、基になる整数を加算または減算するだけで十分です。結果には共通の暗黙的なスケーリング係数があるため、オペランドと同じプログラム変数に格納できます。これらの操作では、オーバーフローが発生しない限り、つまり結果の整数を受信側のプログラム変数に格納できる限り、正確な数学的結果が得られます。オペランドのスケーリング係数が異なる場合は、操作の前に共通のスケーリング係数に変換する必要があります。
乗算
2 つの固定小数点数を乗算するには、2 つの基になる整数を乗算し、結果のスケーリング係数がそれらのスケーリング係数の積であると仮定するだけで十分です。結果は、受信変数をオーバーフローしない限り、丸められることなく正確になります。
たとえば、1/1000 (0.123) でスケールされた数値 123 と 1/10 (2.5) でスケールされた数値 25 を掛け合わせると、整数 123×25 = 3075 が (1/1000)×(1/10) = 1/10000 でスケールされ、3075/10000 = 0.3075 になります。別の例として、最初の数値に暗黙的に 1/32 (155/32 = 4.84375) でスケールされた 155 を掛け合わせると、暗黙的なスケール係数 (1/1000)×(1/32) = 1/32000 を持つ整数 123×155 = 19065 が生成され、19065/32000 = 0.59578125 になります。
2 進数では、2 の累乗であるスケーリング係数を使用するのが一般的です。乗算後、スケーリング係数は右にシフトすることで除算できます。シフトはほとんどのコンピューターで簡単かつ高速です。シフトする前に、スケーリング係数の半分の「丸め加数」を追加することで丸めが可能です。証明: round(x/y) = floor(x/y + 0.5) = floor((x + y/2)/y) = shift-of-n(x + 2^(n-1)) 同様の方法は、どのスケーリングでも使用できます。
分割
2 つの固定小数点数を割り算するには、基になる整数の整数商を取り、スケーリング係数がスケーリング係数の商であると想定します。一般に、最初の除算では丸めが必要になるため、結果は正確ではありません。
たとえば、1/100 倍 (34.56) の 3456 と 1/1000 倍 (1.234) の 1234 を割ると、整数 3456÷1234 = 3 (四捨五入) となり、スケール係数は (1/100)/(1/1000) = 10、つまり 30 になります。別の例として、最初の数を暗黙的に 1/32 倍 (155/32 = 4.84375) の 155 で割ると、整数 3456÷155 = 22 (四捨五入) となり、暗黙的なスケール係数は (1/100)/(1/32) = 32/100 = 8/25、つまり 22×32/100 = 7.04 になります。
結果が正確でない場合は、被除数をより小さいスケーリング係数に変換することで、丸めによって生じた誤差を減らすか、またはなくすことができます。たとえば、r = 1.23 がスケーリング 1/100 で 123 として表され、s = 6.25 がスケーリング 1/1000 で 6250 として表される場合、整数の単純な除算により、スケーリング係数 (1/100)/(1/1000) = 10 で 123÷6250 = 0 (丸め) が得られます。r が最初にスケーリング係数 1/1000000 で 1,230,000 に変換されると、結果はスケール係数 1/1000 (0.197) で 1,230,000÷6250 = 197 (丸め) になります。正確な値 1.23/6.25 は 0.1968 です。
スケーリング変換
固定小数点コンピューティングでは、値を異なるスケーリング係数に変換する必要がよくあります。この操作は、たとえば次の場合に必要です。
- 異なる暗黙的なスケーリング係数を持つプログラム変数に値を格納する。
- 2 つの値を同じスケーリング係数に変換して、加算または減算できるようにします。
- ある値を別の値で乗算または除算した後、元のスケーリング係数を復元します。
- 除算の結果の精度を向上させるため。
- 積または商のスケーリング係数が 10 nや 2 nのような単純な累乗であることを確認します。
- 演算の結果をオーバーフローなしでプログラム変数に格納できることを保証するため。
- 固定小数点データを処理するハードウェアのコストを削減します。
スケーリング係数Rを持つ固定小数点型からスケーリング係数Sを持つ別の型に数値を変換するには、基になる整数に比率R / Sを掛ける必要があります。したがって、たとえば、値 1.23 = 123/100 をスケーリング係数R =1/100 からスケーリング係数S =1/1000の値に変換するには、整数 123 に (1/100)/(1/1000) = 10 を掛けて、表現 1230/1000 を生成する必要があります。
スケーリング係数が整数を表すために内部的に使用される基数の累乗である場合、スケーリング係数を変更するには、整数の下位桁を削除するか、ゼロ桁を追加するだけで済みます。ただし、この操作では数値の符号が保持される必要があります。2 の補数表現では、算術シフト操作と同様に符号ビットを拡張することを意味します。
S がR を割り切れない場合(特に、新しいスケーリング係数Sが元のRより大きい場合)、新しい整数を切り上げなければならない場合があります。
特に、rとs が暗黙のスケーリング係数RとS を持つ固定小数点変数である場合、演算r ← r × sでは、それぞれの整数を乗算し、その結果をSで明示的に除算する必要があります。結果は丸められる必要があり、オーバーフローが発生する可能性があります。
たとえば、共通のスケーリング係数が 1/100 の場合、1.23 に 0.25 を掛けると、123 に 25 を掛けて、中間のスケーリング係数が 1/10000 の 3075 が生成されます。元のスケーリング係数 1/100 に戻すには、整数 3075 に 1/100 を掛ける、つまり 100 で割る必要があります。その結果は、使用する丸めポリシーに応じて 31 (0.31) または 30 (0.30) になります。
同様に、 r ← r / s の演算では整数を割り算し、その商にS を明示的に掛ける必要があります。ここでも丸めやオーバーフローが発生する可能性があります。
浮動小数点との変換
数値を浮動小数点から固定小数点に変換するには、その数値にスケーリング係数Sを掛け、その結果を最も近い整数に丸めます。結果が宛先変数またはレジスタに収まるように注意する必要があります。スケーリング係数とストレージ サイズ、および入力数値の範囲によっては、変換で丸めが行われない場合があります。
固定小数点数を浮動小数点数に変換するには、整数を浮動小数点数に変換し、それをスケーリング係数Sで割ります。この変換では、整数の絶対値が 2 24 (2 進単精度 IEEE 浮動小数点の場合) または 2 53 (倍精度の場合)より大きい場合、丸めが必要になることがあります。| S | が非常に大きい場合、または非常に小さい場合は、それぞれ オーバーフローまたはアンダーフローが発生する可能性があります。
ハードウェアサポート
スケーリングと再正規化
一般的なプロセッサは、固定小数点演算を特にサポートしていません。ただし、バイナリ演算を備えたほとんどのコンピュータには、整数を任意の 2 の累乗で乗算または除算できる高速ビット シフト命令 (特に算術シフト命令) があります。これらの命令を使用すると、数値の符号を維持しながら、2 の累乗であるスケーリング係数をすばやく変更できます。
IBM 1620やBurroughs B3500などの初期のコンピュータでは、整数に2 進化 10 進数(BCD) 表現が使用されていました。つまり、10 進数の各桁が 4 ビットで独立してエンコードされた 10 進数でした。マイクロコントローラなどの一部のプロセッサでは、この表現がまだ使用されている場合があります。このようなマシンでは、10 進数のスケーリング係数の変換は、ビット シフトやメモリ アドレス操作によって実行できます。
一部の DSP アーキテクチャでは、特定の固定小数点形式 ( n −1 の小数ビットを持つ符号付きnビット数(値は -1 からほぼ +1 の範囲) など) のネイティブ サポートが提供されています。サポートには、再正規化 (積を 2 n −2からn −1 の小数ビットにスケーリング変換する) を含む乗算命令が含まれる場合があります。[引用が必要] CPU がその機能を提供しない場合、プログラマは積を十分に大きなレジスタまたは一時変数に保存し、再正規化を明示的にコーディングする必要があります。
オーバーフロー
オーバーフローは、算術演算の結果が大きすぎて指定された宛先領域に格納できない場合に発生します。加算と減算では、結果にオペランドより 1 ビット多く必要になる場合があります。m ビットと n ビットの 2 つの符号なし整数の乗算では、結果にm + n ビットが含まれる場合があります。
オーバーフローの場合、スケーリングされていない整数が 2 nを法として縮小されるため、通常は上位ビットが失われます( nはストレージ領域のサイズ)。特に符号ビットが失われるため、値の符号と大きさが根本的に変わる可能性があります。
一部のプロセッサでは、オーバーフローの発生時にハードウェアオーバーフロー フラグを設定したり、例外を生成したりできます。一部のプロセッサでは、代わりに飽和演算が提供される場合があります。つまり、加算または減算の結果がオーバーフローした場合、受信領域に収まり、正しい符号を持つ最大絶対値を持つ値が格納されます。[引用が必要]
ただし、これらの機能は実際にはあまり役に立ちません。オーバーフローの可能性を排除するようにスケーリング係数とワード サイズを選択するか、操作を実行する前にオペランドに過剰な値がないかどうかをチェックする方が一般的には簡単で安全です。
コンピュータ言語サポート
固定小数点数の明示的なサポートは、いくつかのプログラミング言語、特にPL/I、COBOL、Ada、JOVIAL、Coral 66で提供されています。これらの言語では、バイナリまたは 10 進数のスケーリング係数を持つ固定小数点 データ型が提供されています。コンパイラは、これらのデータ型の操作、変数の読み取りまたは書き込み、または値を浮動小数点などの他のデータ型に変換するときに、適切なスケーリング変換を行うコードを自動的に生成します。
これらの言語のほとんどは、1955年から1990年の間に設計されました。より新しい言語は通常、固定小数点データ型やスケーリング係数の変換をサポートしていません。これは、 FORTRAN、 C、C++など、現在でも非常に人気のあるいくつかの古い言語にも当てはまります。厳密に標準化された動作を持つ高速浮動小数点プロセッサが広く利用できるようになったことで、2進固定小数点サポートの需要は大幅に減少しました。[要出典]同様に、 C#やPythonなどの一部のプログラミング言語での10進浮動小数点 のサポートにより、10進固定小数点サポートの必要性がほとんどなくなりました。固定小数点演算が必要な数少ない状況では、明示的なスケーリング変換を使用して、どのプログラミング言語でもプログラマが実装できます。
一方、すべてのリレーショナルデータベースとSQL表記は、固定小数点演算と数値の保存をサポートしています。PostgreSQLには特別な数値1000桁までの数字を正確に保存するための型。[3]
さらに、2008年に国際標準化機構(ISO)は、組み込みプロセッサ上で実行されるプログラムの利点を考慮して、Cプログラミング言語を固定小数点データ型で拡張する提案を発表しました。[4]また、GNUコンパイラコレクション(GCC)には、固定小数点のバックエンドサポートがあります。 [5] [6]
詳細な例
10進固定小数点乗算
2 つの固定小数点 3 桁の数値による次の乗算があるとします。
小数点以下が3桁あるので、末尾のゼロを表示していることに注目してください。これを整数の乗算として再特徴付けるには、まずすべての小数点を整数の桁に移動して乗算し、次に それらを元に戻すために を乗算する必要があります。方程式は次のようになります。
これは、計算に別の基数、特に基数 2 を選択した場合でも同様に機能します。これは、ビット シフトが 2 の乗算または除算と同じであるためです。3 つの 10 進数は約 10 の 2 進数に相当するため、2 進小数点の後の 0.05 を 10 ビットに丸める必要があります。最も近い近似値は 0.0000110011 です。
したがって、掛け算は
これは小数点以下 3 桁で 11.023 になります。
2進固定小数点乗算
16 ビットの小数部を使用して 2 進固定小数点で 1.2 と 5.6 の積を計算するタスクについて考えてみましょう。2 つの数値を表すには、これらを 2 16倍して78 643 .2 と367 001 .6を取得し、これらの値を最も近い整数に丸めて78 643と367 002を取得します。これらの数値は、2 の補数符号形式の 32 ビット ワードにうまく収まります。
これらの整数を掛け合わせると、丸めなしで 32 ビットの小数部を持つ 35 ビット整数28 862 138 286が得られます。この値を 32 ビット整数変数に直接格納すると、オーバーフローが発生し、最上位ビットが失われることに注意してください。実際には、おそらく符号付き 64 ビット整数変数またはレジスタに格納されるでしょう。
結果をデータと同じ形式(小数部 16 ビット)で保存する場合、その整数を 2 16で割っておよそ440 401 .28 を算出し、最も近い整数に丸めます。この効果は、2 15を加算して結果を 16 ビットシフトすることで実現できます。結果は440 401で、これは 6. 719 985 961 914 062 5という値を表します。形式の精度を考慮すると、その値は 6. 719 986 ± 0. 000 008と表現する方が適切です(オペランドの近似値から生じる誤差は考慮しません)。正しい結果は 1.2 × 5.6 = 6.72 です。
より複雑な例として、2つの数値1.2と5.6が、それぞれ30ビットと20ビットの小数部を持つ32ビット固定小数点形式で表されているとします。2 30と2 20でスケーリングすると、 1 288 490 188 .8と5 872 025 .6となり、それぞれ1 288 490 189と5 872 026に丸められます。どちらの数値も32ビットの符号付き整数変数に収まり、小数部を表します。
- 1. 200 000 000 186 264 514 923 095 703 125と
- 5. 600 000 381 469 726 562 50
それらの積は(正確には)53ビットの整数7 566 047 890 552 914であり、これは30+20 = 50の暗黙の小数ビットを持ち、したがって分数を表す。
- 6. 720 000 458 806 753 229 623 609 513 510
この値を 8 ビットの小数部を持つ符号付き 16 ビット固定形式で表す場合は、整数積を 2 50-8 = 2 42で割り、結果を丸める必要があります。これは、2 41を加算して 42 ビットシフトすることで実現できます。結果は 1720 で、1720/2 8 = 6. 718 75 、つまり約 6.719 ± 0.002の値を表します。
表記
固定小数点形式のパラメータを簡潔に指定するために、さまざまな表記法が使用されています。次のリストでは、f は小数ビットの数、m は絶対値または整数ビットの数、s は符号ビットの数、b は合計ビット数を表します。
- COBOLプログラミング言語は元々、任意のサイズと10進スケーリングを備えた10進固定精度をサポートしており、その形式はPICディレクティブで「グラフィカルに」指定されていました。たとえば、PIC S9999V99は、 2桁の小数部を持つ6桁の符号付き10進整数を指定しました。[7]
- PL/Iプログラミング言語では、 REAL FIXED BINARY ( p , f )構造を使用して、合計pビット (符号は含まない)、小数部fビットの固定小数点符号付きバイナリ データ型を指定します。つまり、スケーリング係数が 1/2 fであるp +1 ビットの符号付き整数です。後者は正または負の値になります。基数 10 の場合は、 REALの代わりにCOMPLEX を指定したり、BINARY の代わりにDECIMALを指定したりできます。
- Adaプログラミング言語では、数値データ型は、例えば で指定できます。これは、2の補数形式の符号付き2進整数と、7つの暗黙の小数ビット(スケーリング係数1/128を提供)および合計15ビット以上(実際の範囲は-128.00からほぼ+128.00まで)で構成される固定小数点表現を意味します。[8]
type F is delta 0.01 range -100.0 .. 100.0 - Q表記法はTexas Instrumentsによって定義された。[9] Q fと書いて、 f個の小数ビットを持つ符号付き2進固定小数点値を指定する。たとえば、Q15 は、スケーリング係数 1/2 15を持つ2の補数表記の符号付き整数を指定する。コードQ m . f は、さらに、数値が値の整数部にmビットを持ち、符号ビットを数えないことを指定する。したがって、 Q1.30 は、1 個の整数ビットと 30 個の小数ビットを持つ2進固定小数点形式を表し、スケーリング係数 1/2 30を持つ 32 ビットの 2の補数整数として格納できる。[9] [10] ARMによっても同様の表記法が使用されているが、 mの値に符号ビットを数える点が異なる。したがって、上記と同じ形式はQ2.30と指定される。[11] [12]
- B m という表記は、整数部にmビット、残りの部分が小数ビットである固定バイナリ形式を意味するために使用されます。たとえば、符号付きB16数に格納できる最大値と最小値は、それぞれ ≈32767.9999847 と -32768.0 です。
- VisSim社は、合計bビット、整数部にmビットを持つ2進固定小数点値を表すためにfx m . bを使用しました。つまり、スケーリング係数が1/2 b − mのbビット整数です。したがって、fx1.16は、整数部に1ビット、小数部に15ビットの16ビット数を意味します。[13]
- PS2 GS(「グラフィックスシンセサイザー」)ユーザーズガイドでは、 s : m : fという表記法が使用されています。ここで、sは符号ビットの存在(0または1)を指定します。[ 14]たとえば、0:5:3は、スケーリング係数が1/2 3の符号なし8ビット整数を表します。
- LabVIEWプログラミング言語では、表記法< s 、b 、m >を使用して'FXP' 固定小数点数のパラメータを指定します。sコンポーネントは '+' または '±' のいずれかで、それぞれ符号なしまたは 2 の補数の符号付き数を表します。bコンポーネントは合計ビット数、m は整数部分のビット数です。
ソフトウェアアプリケーションの例
- 一般的なTrueTypeフォント形式では、命令内の数値の一部に小数点の左側26ビットを持つ32ビット符号付きバイナリ固定小数点を使用します。[15]この形式は、ヒントに必要な最小限の精度とパフォーマンス上の理由から選択されました。 [16]
- Nintendo 64を除き、3DO Interactive Multiplayer、PlayStation、Saturn、Jaguar [17]を含む第5世代ビデオゲームコンソールのすべての3Dゲームは、システムにハードウェア浮動小数点ユニットがないため、固定小数点演算を使用しています。PlayStation変換コプロセッサは、12ビットの小数点を持つ16ビット固定小数点をサポートしていますが、セガサターンVDPコプロセッサは、下位16ビットを小数部用に予約した32ビット固定小数点形式を使用していました。
- 科学者や数学者に広く使用されているTeX組版ソフトウェアは、すべての位置計算に 16 ビットの小数部を持つ 32 ビットの符号付き 2 進固定小数点を使用します。値は、タイポグラファーのポイントの小数として解釈されます。TeXフォント メトリックファイルは、12 ビットの小数部を持つ 32 ビットの符号付き固定小数点数を使用します。
- Tremor、Toast、MAD は、それぞれOgg Vorbis、GSM Full Rate、MP3オーディオ形式をデコードするソフトウェア ライブラリです。多くのオーディオ デコード ハードウェア デバイスには FPU がないため、これらのコーデックは固定小数点演算を使用します。
- WavPackロスレスオーディオコンプレッサーは固定小数点演算を使用します。この選択は、ハードウェアによって浮動小数点の丸めルールが異なると、圧縮のロスレス性が損なわれる可能性があるという懸念から正当化されました。[18]
- Nest Labsユーティリティライブラリ[19]は、特にセンサーサンプリングやセンサー出力のコンテキストで固定小数点数を扱う場合に、固定小数点数用のマクロと関数の限定されたセットを提供します。
- OpenGL ES 1.x 仕様には固定小数点プロファイルが含まれています。これは、必ずしも FPU を備えているとは限らない組み込みシステム向けの API であるためです。
- dcおよびbcプログラムは任意精度の計算機ですが、(ユーザーが指定した) 固定数の小数桁のみを追跡します。
- Fractintは数値をQ2.29固定小数点数として表現し、[20] FPUを持たない386または486SXプロセッサを搭載した古いPCでの描画を高速化します。
- Doom は、マップ システム、ジオメトリ、レンダリング、プレイヤーの移動など、すべての非整数計算に 16.16 固定小数点表現を使用した、 id Softwareによる最後の一人称シューティングゲームです。この表現は、現代のDoomソース ポートでも引き続き使用されています。
- 量子論理ゲートを実装するAzure量子コンピュータ用のQ#プログラミング言語には、量子ビットのレジスタ上で固定小数点演算を実行するための標準的な数値ライブラリが含まれています。[21]
参照
- Q (数値形式)
- Libfixmath - 固定小数点演算用の C 言語で書かれたライブラリ
- 対数数システム
- ミニフロート
- ブロック浮動小数点スケーリング
- モジュロ演算
- μ-lawアルゴリズム
- A-lawアルゴリズム
参考文献
- ^ 「固定小数点、浮動小数点、数値形式の違いは何ですか?」ElectronicDesign . 2017-08-31.
- ^ Julia プログラミング言語ドキュメント FixedPointNumbers パッケージ。
- ^ PostgreSQLマニュアル、セクション8.1.2。任意精度の数値
- ^ JTC1/SC22/WG14 (2008)、TR 18037 のステータス: 組み込み C
- ^ GCC wiki、固定小数点演算サポート
- ^ GCC の使用、セクション 5.13 固定小数点型
- ^ IBM Corporation、「数値項目」。オンライン ドキュメント サイト、2021 年 7 月 5 日にアクセス。
- ^ Ada 83 ドキュメント:「根拠、5.3.2: 固定小数点型」。2021 年 7 月 5 日にアクセス。
- ^ ab 「付録 A.2」。TMS320C64x DSP ライブラリ プログラマーズ リファレンス(PDF)。ダラス、テキサス州、米国: Texas Instruments Incorporated。2003 年 10 月。SPRU565。2022年 12 月 22 日時点のオリジナルからアーカイブ(PDF) 。2022年 12 月 22 日閲覧。
- ^ 「MathWorks Fixed-Point Toolbox ドキュメント用語集」。mathworks.com。2011年3 月 16 日にオリジナルからアーカイブ。2011年 1 月 28 日に取得。
- ^ 「ARM Developer Suite AXD および armsd デバッガ ガイド」。1.2。ARM Limited。2001 [1999]。第 4.7.9 章。AXD > AXD 機能 > データ フォーマット > Q フォーマット。ARM DUI 0066D。2017 年 11 月 4 日のオリジナルからアーカイブ。
- ^ 「第 4.7.9 章 AXD > AXD 機能 > データ フォーマット > Q フォーマット」。RealView Development Suite AXD および armsd デバッガ ガイド(PDF)。3.0。ARM Limited。2006 [1999]。pp. 4– 24。ARM DUI 0066G。2017年 11 月 4 日のオリジナルからアーカイブ(PDF) 。
- ^ 「VisSim は現在 solidThinking Embed です」。www.vissim.com . solidThinking Inc.
- ^ PS2 GS ユーザーズガイド、第 7.1 章「説明ノート」
- ^ 「TrueType命令セット: データ型」 2020-09-22.
- ^ 「[Freetype] なぜ26.6なのか?」
- ^ 「Dolphin Emulator」. Dolphin Emulator . 2014-03-15.
- ^ 「WavPack 技術説明」www.wavpack.com 。2015年 7 月 13 日閲覧。
- ^ Nest Labs ユーティリティライブラリ
- ^ 「Fractint, A Little Code」。2010年10月27日時点のオリジナルよりアーカイブ。 2005年10月24日閲覧。
- ^ 「量子数値ライブラリの紹介」。2019年11月13日閲覧。
さらに読む
- ウォーレン・ジュニア、ヘンリー・S. (2013)。Hacker 's Delight (第2版)。Addison Wesley / Pearson Education, Inc. ISBN 978-0-321-84268-8。
外部リンク
- シンプルな固定小数点演算
- 固定小数点演算 - 概要
- 固定小数点表現と分数計算
- 固定小数点演算の計算的考察 (PDF)
