コンピュータにおいて、固定小数点とは、小数部を固定桁数で格納することで小数(非整数)を 表す方法です。例えば、ドル金額は、セント(1ドルの100分の1)を表す小数部を2桁で格納することがよくあります。より一般的には、固定小数点とは、小数値をある固定された小単位の整数倍として表すことを指す場合もあります。例えば、時間の小数値を10分間隔の整数倍として表す場合などです。固定小数点表現は、より複雑で計算負荷の高い浮動小数点表現と対比されることがよくあります。
固定小数点表現では、分数は多くの場合、整数部分と同じ基数で表されますが、基数bの負のべき乗が使用されます。最も一般的な形式は、10 進数と2進数です。後者は、バイナリ スケーリングとも呼ばれます。したがって、n桁の分数が格納されている場合、値は常にb − nの整数倍になります。固定小数点表現は、整数値の下位桁を省略するためにも使用できます。たとえば、大きなドル値を $1000 ($1K) の倍数として表す場合などです。
10進固定小数点数を人間が読みやすいように表示する場合、小数部と整数部は通常、基数記号(英語では通常「.」、他の多くの言語では「,"」または別の記号)で区切られます。しかし、内部的にはこのような区切りはなく、小数部と整数部の区別は、そのような数値を扱うプログラムによってのみ定義されます。
機械式計算機では固定小数点表現が標準でした。現代のプロセッサのほとんどは高速浮動小数点演算ユニット(FPU) を備えているため、プロセッサベースの実装における固定小数点表現は、低コストの組み込みマイクロプロセッサやマイクロコントローラ、画像、ビデオ、デジタル信号処理など、高速性、低消費電力、またはチップ面積の小ささが要求されるアプリケーション、あるいは問題に対して固定小数点表現の使用がより自然な場合など、特殊な状況でのみ使用されています。後者の例としては、セントの端数を厳密に規定された方法で整数に丸める必要があるドル金額の計算、テーブル参照による関数の評価、または有理数を丸め誤差なしで表現する必要があるアプリケーション(固定小数点では丸め誤差なしですが、浮動小数点では丸め誤差なし) などがあります。固定小数点表現は、FPGA実装では依然として標準です。FPGAでの浮動小数点サポートは、固定小数点サポートよりもはるかに多くのリソースを必要とするためです。[ 1 ]
小数点数の固定小数点表現は、基本的に固定のスケーリング係数を暗黙的に乗算する整数です。例えば、1.23という値は、1/100という暗黙のスケーリング係数を持つ整数値123として変数に格納できます。この表現により、標準的な整数演算論理ユニットで有理数の計算を実行できます。
負の値は通常、バイナリ固定小数点形式で、上記のように暗黙のスケーリング係数を持つ2 の補数表現の符号付き整数として表されます。小数ビットの数が総ビット数以上であっても、値の符号は常に最上位ビットによって示されます(1 = 負、0 = 非負)。たとえば、8 ビットの符号付きバイナリ整数 ( 1111 0101 ) 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進整数(−00 025 ) 10 は、−3、+5、+12 の暗黙の小数部桁で、−25/10 −3 =の値を表します。−25 000、−25/10 5 =−0.000 25、および −25/10 12 =それぞれ−0.000 000 000 025 です。
プログラムは通常、特定の変数に格納される、または特定の命令によって生成されるすべての固定小数点値が、同じスケーリング係数を持つと想定します。このパラメータは、必要な精度と格納する値の範囲に応じて、プログラマが選択できます。
変数や数式のスケーリング係数は、プログラム内に明示的に記述されていない場合があります。 そのため、コーディングのベストプラクティスでは、少なくともソースコード内のコメントとして、ドキュメントにスケーリング係数を記載することが求められます。
効率を高めるために、スケーリング係数は、内部で整数を表すために使用される基数bのべき乗(正または負) に選択されることがよくあります。ただし、多くの場合、最適なスケーリング係数はアプリケーションによって決まります。そのため、整数が内部でバイナリで表現されている場合でも、人間の利便性のために、10 のべき乗 (たとえば、ドル値の場合は 1/100) のスケーリング係数がよく使用されます。また、固定小数点スケーリング係数の選択は、多くの場合、測定単位 (メートルに対するセンチメートルやミクロンなど)の選択と同等であるため、10 進スケーリング係数はメートル (SI) システムにもよく適合します。
ただし、場合によっては他の縮尺係数が使用されることもあります。例えば、時間の小数値は秒の整数値、つまり縮尺係数1/3600の固定小数として表されることがあります。
最も慎重な丸め処理を行ったとしても、スケーリング係数Sで表現された固定小数点値は、格納される整数値において最大±0.5 × Sの誤差が生じる可能性があります。したがって、一般的にはスケーリング係数が小さいほど、より正確な結果が得られます。
一方、スケーリング係数が小さいほど、特定のプログラム変数に格納できる値の範囲は狭くなります。変数に格納できる最大の固定小数点値は、その変数に格納できる最大の整数値にスケーリング係数を乗じた値であり、最小値についても同様です。たとえば、以下の表は、暗黙の小数ビット数 fに応じて、暗黙のスケーリング係数S、表現可能な最小値V minと最大値V max 、および16 ビット符号付きバイナリ固定小数点形式で表現できる値の精度δ = S /2 を示しています。
2 n −1 の形式のスケーリング係数 (つまり 1、3、7、15、31 など)を持つ固定小数点形式は、画像処理やその他のデジタル信号処理タスクに適していると言われています。これらは、2 nスケーリングよりも固定小数点値と浮動小数点値間のより一貫した変換を提供します。Juliaプログラミング言語は両方のバージョンを実装しています。[ 2 ]
1/16 や 17/32 のような任意の二進分数a /2 mは、任意のn ≥ mに対して1/2 n の2 乗スケーリング係数を用いて固定小数点数で正確に表現できます。しかし、0.1 や 0.123 のようなほとんどの十進分数は、2 を基数とする無限循環分数であるため、そのように表現することはできません。
同様に、 1/100 や 37/1000 のような任意の小数a /10 mは、任意のn ≥ mに対して1/10 nの 10 乗スケーリング係数を用いて固定小数点で正確に表現できます。この小数形式は、1/8 (0.125) や 17/32 (0.53125) のような任意の二進数a /2 mも表現できます。
より一般的に言えば、互いに素でbが正である有理数a / bは、bが2のべき乗である場合に限り、2進固定小数点では正確に表現でき、bが2または5以外の素因数を持たない場合に限り、10進固定小数点では正確に表現できる。
固定小数点演算は、浮動小数点演算よりも高速であったり、使用するハードウェアが少なくて済む場合があります。表現する値の範囲が事前にわかっていて、十分に限定されている場合、固定小数点演算は利用可能なビットをより有効に活用できます。たとえば、0から1までの10進数を表現するために32ビットが利用できる場合、固定小数点表現では誤差が100未満になります。1.2 × 10 −10であるのに対し、IEEE 754標準浮動小数点表現では最大で596 × 10 −10ビットは、この限られた値の範囲では使用されない動的スケーリング係数の符号と指数に 9 ビットが割り当てられているためです。40 dB のヘッドルームを持つ32ビット固定小数点演算は、浮動小数点演算よりも高い信号対雑音比を持つ。
固定小数点演算を用いるプログラムは、浮動小数点演算を用いるプログラムよりも移植性が高いのが一般的です。これは、固定小数点演算は浮動小数点演算ユニット(FPU)の有無に依存しないためです。この利点は、 IEEE浮動小数点規格が広く普及する以前は特に顕著でした。当時は、同じデータを用いた浮動小数点演算でも、メーカーやコンピュータの機種によって結果が異なっていたからです。
多くの組み込みプロセッサにはFPUが搭載されていません。これは、整数演算ユニットはFPUに比べて必要なロジックゲート数が大幅に少なく、チップ面積もはるかに小さいためです。また、低速デバイス上で浮動小数点演算をソフトウェアでエミュレートすると、ほとんどのアプリケーションにとって処理速度が遅すぎます。初期のパーソナルコンピュータやゲーム機向けのCPUチップ、例えばIntel 386や486SXなども、FPUを搭載していませんでした。
固定小数点形式の絶対分解能(連続する値の差)は、全範囲にわたって一定であり、すなわちスケーリング係数Sで表されます。一方、浮動小数点形式の相対分解能は、全範囲にわたってほぼ一定であり、基数bの係数の範囲内で変化します。それに対し、絶対分解能は値自体と同様に、何桁も変化します。
多くの場合、固定小数点演算の丸め誤差と切り捨て誤差は、同等の浮動小数点演算のそれよりも分析が容易です。切り捨てにディザリングやノイズシェーピングなどの線形化手法を適用することは、固定小数点演算ではより簡単です。一方、固定小数点を使用するには、プログラマによるより注意が必要です。オーバーフローを回避するには、変数の範囲と計算内のすべての中間値についてより厳密な見積もりが必要であり、多くの場合、スケーリング係数を調整するための追加コードも必要になります。固定小数点プログラミングでは、通常、幅の異なる整数型を使用する必要があります。固定小数点アプリケーションでは、ブロック浮動小数点を使用できます。これは、固定小数点データの各配列(ブロック)が単一のワードで共通の指数でスケーリングされる固定小数点環境です。
10進固定小数点の一般的な用途は、金銭的価値の保存です。金銭的価値の保存には、浮動小数点数の複雑な丸め規則がしばしば問題となります。例えば、C言語で書かれたオープンソースの資金管理アプリケーションであるGnuCashは、この理由からバージョン1.6以降、浮動小数点から固定小数点に切り替えました。[ 3 ]
バイナリ固定小数点(バイナリスケーリング)は、1960年代後半から1980年代にかけて、飛行シミュレーションや原子力発電所の制御アルゴリズムなど、数学的に負荷の高いリアルタイム計算に広く使用されていました。現在でも、多くのDSPアプリケーションやカスタムメイドのマイクロプロセッサで使用されています。角度を扱う計算には、バイナリ角度測定が使用されます。
バイナリ固定小数点演算は、STM32G4シリーズのCORDICコプロセッサや、JPEG画像の圧縮に使用される離散コサイン変換アルゴリズムで使用されています。
電気メーターやデジタル時計などの電子機器では、温度や電源電圧などによる誤差を補正するために多項式がよく用いられます。係数は多項式回帰によって生成されます。バイナリ固定小数点多項式は、浮動小数点よりも多くのビット精度を利用でき、安価なCPUを使用して高速なコードで実現できます。機器にとって重要な精度は、固定小数点多項式をホーナー法(例:y = (( ax + b ) x + c ) x + d ) で評価して丸め回数を減らし、固定小数点乗算で丸め加数を用いる場合、同等のビット数の浮動小数点計算と比較しても遜色ありません。
同じ暗黙のスケーリング係数を持つ 2 つの値を加算または減算するには、基となる整数を加算または減算するだけで十分です。結果は共通の暗黙のスケーリング係数を持つため、オペランドと同じプログラム変数に格納できます。オーバーフローが発生しない限り、つまり結果の整数が受信側のプログラム変数に格納できる限り、これらの操作は正確な数学的結果をもたらします。オーバーフローが発生した場合は、同じ符号を持つ通常の整数の場合と同様に発生します。符号なしおよび 2 の補数による符号付きの場合、オーバーフローの動作は有限群としてよく知られています。
被演算変数のスケーリング係数が異なる場合は、演算を行う前に共通のスケーリング係数に変換する必要があります。
2つの固定小数点数を乗算するには、2つの基となる整数を乗算し、結果のスケーリング係数がそれぞれのスケーリング係数の積であると仮定すれば十分である。
結果は、受信変数のオーバーフローが発生しない限り、丸め処理なしで正確な値となります。(具体的には、整数乗算の場合、積は2つの因数の幅の2倍までとなります。)
例えば、123を1/1000(0.123)でスケーリングした数と、25を1/10(2.5)でスケーリングした数を掛け合わせると、整数123×25 = 3075が得られ、これは(1/1000)×(1/10) = 1/10000でスケーリングされ、3075/10000 = 0.3075となります。別の例として、最初の数に暗黙的に1/32(155/32 = 4.84375)でスケーリングした155を掛けると、整数123×155 = 19065が得られ、暗黙的にスケーリング係数(1/1000)×(1/32) = 1/32000でスケーリングされ、19065/32000 = 0.59578125となります。
2進数では、2のべき乗をスケーリング係数として用いるのが一般的です。乗算後、右シフトすることでスケーリング係数を除算できます。シフトはほとんどのコンピュータで簡単かつ高速に行えます。
右シフト演算または一般的な整数除算命令(C言語の整数除算やx86のidivなど)を使用した場合、結果は切り捨て除算(floor(x/y))と同等になります。丸め処理を行うことで、発生する誤差を減らすことができます。タイブレークの方法に応じて、3つのバリエーションが考えられます。
これらの丸め方法は、整数除算によるあらゆるスケーリングに適用可能です。例えば、リスケールに関する議論にも応用できます。
固定小数点数の除算は、分母が異なる可能性のある2つの分数(スケーリング係数)の除算として理解できます。p ⁄ qとr ⁄ s (pqrsはすべて整数)の場合、単純なアプローチは、分数を並べ替えて新しいスケーリング係数(s/q)を形成することです。
例えば、3456 を 1/100 (34.56) で割った値と 1234 を 1/1000 (1.234) で割った値は、整数 3456÷1234 = 3 (四捨五入) となり、縮尺係数は (1/100)/(1/1000) = 10、つまり 30 となります。別の例として、最初の数を暗黙的に 1/32 (155/32 = 4.84375) で割った値は、整数 3456÷155 = 22 (四捨五入) となり、暗黙的な縮尺係数は (1/100)/(1/32) = 32/100 = 8/25、つまり 22×32/100 = 7.04 となります。
sとqが非常に似ている場合、上記のアルゴリズムではスケーリング係数が粗すぎる結果になります。これは、まず被除数をより小さなスケーリング係数に変換することで改善できます。スケーリング係数をn倍にすると仮定して、代わりに次のように計算します。
例えば、a = 1.23 を 1/100 の縮尺で 123 と表し、b = 6.25 を 1/1000 の縮尺で 6250 と表すと、整数の単純な除算は 123÷6250 = 0 (四捨五入) となり、縮尺係数は (1/100)/(1/1000) = 10 となります。aを最初に 1,230,000 に変換し、縮尺係数を 1/1000000 とすると、結果は 1,230,000÷6250 = 197 (四捨五入) となり、縮尺係数は 1/1000 (0.197) となります。正確な値 1.23/6.25 は 0.1968 です。
スケーリングについて考える別の方法として、乗算の逆演算である除算を考えてみましょう。乗算によってより細かいスケーリング係数が得られるのであれば、元の値を復元するためには、被除数にもより細かいスケーリング係数が必要になるのは当然です。
固定小数点演算では、値を異なるスケーリング係数に変換する必要が生じることがよくあります。この操作は、例えば次のような場合に必要となります。
スケーリング係数Rを持つ固定小数点型の数値を、スケーリング係数Sを持つ別の型に変換するには、基となる整数に比率R / Sを乗じる必要があります。したがって、たとえば、スケーリング係数R = 1/100 の値 1.23 = 123/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 を掛けて 3075 となり、中間スケーリング係数は 1/10000 となります。元のスケーリング係数 1/100 に戻すには、整数 3075 に 1/100 を掛ける、つまり 100 で割る必要があり、使用する丸め処理に応じて 31 (0.31) または 30 (0.30) となります。
同様に、演算r ← r / sでは、整数を割り算し、その商を明示的にSで乗算する必要があります。ここでも丸め誤差やオーバーフローが発生する可能性があります。
浮動小数点数を固定小数点数に変換するには、スケーリング係数Sを乗算し、結果を最も近い整数に丸めます。変換結果が目的の変数またはレジスタに収まるように注意する必要があります。スケーリング係数、記憶領域のサイズ、および入力数値の範囲によっては、変換時に丸め処理が不要な場合もあります。
固定小数点数を浮動小数点数に変換するには、まず整数を浮動小数点数に変換し、次にスケーリング係数Sで割ります。この変換では、整数の絶対値が 2 24 (IEEE バイナリ単精度浮動小数点数の場合) または 2 53 (倍精度の場合)より大きい場合、丸め処理が必要になることがあります。 | S | が非常に大きい場合、または非常に小さい場合は、それぞれオーバーフローまたはアンダーフローが発生する可能性があります。
一般的なプロセッサは、固定小数点演算を明示的にサポートしていません。しかし、バイナリ演算に対応したほとんどのコンピュータには、整数を任意の2のべき乗で乗算または除算できる高速なビットシフト命令、特に算術シフト命令が備わっています。これらの命令を使用することで、数値の符号を維持したまま、2のべき乗であるスケーリング係数を高速に変更できます。
IBM 1620やBurroughs B3500といった初期のコンピュータは、整数表現に二進化十進数(BCD)を使用していました。これは基数10で、各桁が4ビットで独立して符号化されていました。マイクロコントローラなどの一部のプロセッサは、現在でもこの方式を使用している場合があります。このようなマシンでは、ビットシフトやメモリアドレス操作によって、十進数のスケーリング係数の変換を行うことができます。
一部のDSPアーキテクチャは、特定の固定小数点形式(例えば、n −1ビットの小数部を持つ符号付きnビット数(値の範囲は−1からほぼ+1))をネイティブにサポートしています。このサポートには、積を2 n −2からn −1ビットの小数部に変換するスケーリング変換を含む乗算命令が含まれる場合があります。CPUがこの機能を提供していない場合、プログラマは積を十分な大きさのレジスタまたは一時変数に保存し、正規化を明示的にコーディングする必要があります。
オーバーフローは、算術演算の結果が指定された格納領域に格納するには大きすぎる場合に発生します。加算と減算では、結果が被演算数よりも1ビット多く必要になる場合があります。mビットとnビットの2つの符号なし整数の乗算では、結果がm + nビットになる場合があります。
オーバーフローが発生した場合、通常は上位ビットが失われます。これは、スケーリングされていない整数が、記憶領域のサイズをnとしたときの 2 nを法として縮小されるためです。特に符号ビットが失われるため、値の符号と大きさが大きく変化する可能性があります。
一部のプロセッサは、ハードウェアオーバーフローフラグを設定したり、オーバーフロー発生時に例外を生成したりできます。また、飽和演算を提供するプロセッサもあります。加算または減算の結果がオーバーフローした場合、受信領域に収まる最大絶対値で正しい符号を持つ値を代わりに格納します。
しかし、これらの機能は実際にはあまり役に立ちません。一般的には、オーバーフローの可能性を排除するようにスケーリング係数やワードサイズを選択したり、演算を実行する前にオペランドの値が過剰でないかどうかをチェックしたりする方が簡単で安全です。
固定小数点数を明示的にサポートするプログラミング言語はいくつかあり、特にPL/I、COBOL、Ada、JOVIAL、Coral 66などが挙げられます。これらの言語は、2進数または10進数のスケーリング係数を持つ固定小数点 データ型を提供します。コンパイラは、これらのデータ型に対する演算、変数の読み書き、または値を浮動小数点数などの他のデータ型に変換する際に、適切なスケーリング変換を行うコードを自動的に生成します。
これらの言語のほとんどは1955年から1990年の間に設計されました。より現代的な言語では、通常、固定小数点データ型やスケーリング係数変換のサポートは提供されていません。FORTRAN 、 C、C++など、今でも非常に人気のある古い言語も同様です。厳密に標準化された動作を持つ高速浮動小数点プロセッサが広く普及したことで、バイナリ固定小数点のサポートに対する需要は大幅に減少しました。同様に、 C#やPythonなどの一部のプログラミング言語で10進浮動小数点 がサポートされるようになったことで、10進固定小数点のサポートの必要性はほとんどなくなりました。固定小数点演算が必要となるごくまれなケースでは、明示的な整数型をサポートするプログラミング言語であれば、プログラマが明示的なスケーリング変換を用いて実装できます。
一方、すべてのリレーショナルデータベースとSQL表記法は、固定小数点演算と数値の格納をサポートしています。PostgreSQLには特別な機能があります。数値最大 1000 桁の数値を正確に保存するためのタイプ。[ 5 ]
さらに、2008年に国際標準化機構(ISO)は、組み込みDSPプロセッサ上で動作するプログラムのために、Cプログラミング言語に固定小数点データ型を追加するための技術レポートの草案を発表しました。提案されている主なデータ型は、_Fract(最小7ビット精度の小数部)と_Accum(少なくとも4ビットの整数部を持つ_Fract)の2種類です。[ 6 ] GNUコンパイラコレクション(GCC)はこの草案をサポートしています。[ 7 ] [ 8 ]
2つの固定小数点数(小数点以下3桁)を用いた以下の乗算があるとします。
小数点以下が3桁あるため、末尾のゼロを表示している点に注意してください。これを整数乗算として再定義するには、まず を掛ける必要があります。すべての小数点を整数に移動してから、それらを元に戻す。方程式は次のようになります。
異なる基数、特に計算に基数2を選択した場合でも、ビットシフトは2の位数による乗算または除算と同じであるため、これは同様に機能します。10進数3桁は約2進数10桁に相当するため、0.05を2進数小数点以下10ビットに丸める必要があります。最も近い近似値は0.0000110011です。
したがって、乗算は次のようになります。
小数点以下3桁で四捨五入すると11.023になります。
1.2と5.6の積を16ビットの小数部を持つバイナリ固定小数点数で計算するタスクを考えてみましょう。2つの数値を表現するには、それぞれに2¹⁶を掛けて78643.2と367001.6を得ます。これらの値を最も近い整数に丸めると、78643と367002が得られます。これらの数値は、 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 ビット符号付き整数変数に収まり、小数部を表しています。
それらの積は(正確には)53ビット整数7 566 047 890 552 914であり、30+20=50ビットの暗黙の小数部を持ち、したがって小数部を表します。
この値を符号付き16ビット固定形式で8ビットの小数部とともに表現する場合、整数積を2 50−8 = 2 42で割って結果を丸める必要があります。これは、2 41を加算して42ビットシフトすることで実現できます。結果は1720となり、1720/2 8 = 6.718 75、つまり3439/2 9と3441/2 9の間の区間(約6.719 ± 0.002)を表します。
固定小数点形式のパラメータを簡潔に指定するために、さまざまな表記法が用いられてきました。以下のリストでは、fは小数ビット数、m は絶対値または整数ビット数、s は符号ビット数(0/1 またはその他の代替表現)、b は総ビット数を表します。
QfQ15Qm.fQ1.30Q2.30。[ 11 ] [ 12 ]s1.30が、これは小数またはアキュムレータのいずれにも有効な型ではありません。有効なバージョンでは、mは少なくとも 4 であり、基となる型に応じてfは少なくとも 7、15、または 23 です。斜体でない s に注意してください。これは単に文字として先頭に追加されます。PIC S9999V99符号と絶対値を持つ6桁の10進整数と2桁の小数部を指定していました。[ 13 ]REAL FIXED BINARY (p,f)typeFisdelta0.005range-50.0..50.0 'Small => 0.005BmB16fxm.bfx1.16s:m:f<s,b,m>{{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)