コンピューターにおいて、固定小数点とは、小数部の桁数を固定して格納することで、小数(非整数)数 を表す方法です。例えば、ドルの金額は、セント(ドルの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は、10のべき乗のスケーリング係数 1/10 n(n ≥ m)を用いて固定小数点で正確に表現できます。この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未満になりますが、標準の浮動小数点表現では誤差が最大 596 × 10 −10になる可能性があります。これは、9 ビットが動的スケーリング係数の符号と指数で無駄になるためです。具体的には、32 ビット固定小数点オーディオと浮動小数点オーディオを比較すると、必要なヘッドルームが 40 dB未満の録音では、 32 ビット固定小数点を使用した方が 信号対雑音比が高くなります。
固定小数点演算を使用するプログラムは、FPUの有無に依存しないため、通常、浮動小数点演算を使用するプログラムよりも移植性に優れています。この利点は、IEEE浮動小数点規格が広く採用される以前は特に顕著でした。当時は、同じデータを用いた浮動小数点演算でも、メーカーやコンピュータのモデルによって結果が異なっていました。
多くの組み込みプロセッサには FPU が搭載されていません。これは、整数演算ユニットはFPU よりも必要な論理ゲート数が大幅に少なく、チップ面積もはるかに小さいためです。また、低速デバイスでの浮動小数点のソフトウェアエミュレーションは、ほとんどのアプリケーションでは遅すぎます。Intel 386や486SXなどの初期のパーソナル コンピュータやゲーム コンソールの CPU チップにも FPU が搭載されていませんでした。
固定小数点形式の絶対分解能(連続する値間の差)は、範囲全体にわたって一定であり、すなわちスケーリング係数Sです。一方、浮動小数点形式の相対分解能は範囲全体にわたってほぼ一定であり、基数bの係数の範囲内で変化します。一方、絶対分解能は値自体と同様に、桁違いに変化します。
多くの場合、固定小数点計算の丸めと切り捨ての誤差は、同等の浮動小数点計算の誤差よりも解析が容易です。固定小数点演算では、ディザリングやノイズ シェーピングなどの線形化手法を切り捨てに適用するのが簡単です。その一方で、固定小数点を使用する場合は、プログラマーによる細心の注意が必要です。オーバーフローを回避するには、計算における変数の範囲とすべての中間値について、はるかに厳密な見積もりが必要になり、スケーリング係数を調整するための追加コードも必要になることがよくあります。固定小数点プログラミングでは通常、異なる幅の整数型を使用する必要があります。固定小数点アプリケーションでは、ブロック浮動小数点を使用できます。これは、固定小数点データの各配列 (ブロック) が 1 ワード内の共通指数でスケーリングされる固定小数点環境です。
10進固定小数点の一般的な用途は、通貨値の保存です。浮動小数点数の複雑な丸め規則は、通貨値の保存においてしばしば問題となります。例えば、C言語で書かれたオープンソースの資金管理アプリケーションGnuCashは、この理由からバージョン1.6から浮動小数点から固定小数点へと移行しました。[3]
バイナリ固定小数点(バイナリスケーリング)は、1960年代後半から1980年代にかけて、飛行シミュレーションや原子力発電所の制御アルゴリズムなど、数学的に高度な処理を必要とするリアルタイムコンピューティングに広く使用されていました。現在でも多くのDSPアプリケーションやカスタムメイドのマイクロプロセッサで使用されています。角度を含む計算には、バイナリ角度測定が使用されます。
バイナリ固定小数点は、STM32G4シリーズのCORDICコプロセッサおよびJPEGイメージの圧縮に使用される離散コサイン変換アルゴリズムで使用されます。
電気メーターやデジタル時計などの電子機器は、温度や電源電圧などに起因する誤差を補正するために、多項式をよく使用します。係数は多項式回帰によって生成されます。2進固定小数点多項式は、浮動小数点よりも多くのビット精度を利用でき、安価な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など)を使用した場合、結果はflooring除算(floor(x/y))と同等になります。この誤差を低減するために、丸め処理を併用することができます。タイブレークの選択によって、以下の3つのバリエーションが考えられます。
これらの丸め方法は、整数除算によるあらゆるスケーリングに使用できます。例えば、再スケーリングの議論にも適用できます。
固定小数点数の除算は、分母(スケーリング係数)が異なる可能性のある2つの分数の除算として理解できます。p ⁄ qとr ⁄ s(pqrsはすべて整数)の場合、単純なアプローチでは分数を並べ替えて新しいスケーリング係数(s/q)を作成します。
たとえば、1/100 でスケールされた 3456 (34.56) と、1/1000 でスケールされた 1234 (1.234) を除算すると、整数 3456÷1234 = 3 (四捨五入) となり、スケール係数は (1/100)/(1/1000) = 10、つまり 30 になります。別の例として、最初の数を暗黙的に 1/32 でスケールされた 155 (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/1000000 で 1,230,000 に変換すると、結果はスケーリング係数 1/1000 (0.197) で 1,230,000÷6250 = 197(四捨五入)となります。1.23/6.25 の正確な値は 0.1968 です。
スケーリングについて別の考え方をすると、除算を乗算の逆演算と考えることができます。乗算によってより細かいスケーリング係数が得られるのであれば、元の値を復元するためには、被除数にもより細かいスケーリング係数が必要であることは理にかなっています。
固定小数点演算では、値を異なるスケール係数に変換することが必要になることがよくあります。この操作は、例えば次のような場合に必要です。
スケーリング係数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を掛けて3075となり、中間のスケーリング係数は1/10000になります。元のスケーリング係数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の累乗で乗算または除算できる高速ビットシフト命令、特に算術シフト命令が備わっています。これらの命令を使用すると、数値の符号を維持しながら、2の累乗のスケーリング係数を迅速に変更できます。
IBM 1620やBurroughs B3500といった初期のコンピュータでは、整数表現に2進化10進数(BCD)表現が用いられていました。これは10進数であり、各10進数は4ビットで独立に符号化されていました。マイクロコントローラなどの一部のプロセッサでは、現在でもこの表現が用いられている場合があります。このようなマシンでは、10進数のスケーリング係数の変換は、ビットシフトやメモリアドレス操作によって行うことができます。
一部のDSPアーキテクチャは、特定の固定小数点形式をネイティブサポートしています。例えば、nビットの符号付き数値とn −1の小数ビット(その値は-1からほぼ+1の範囲)です。このサポートには、乗算命令(積を2n −2からn −1の小数ビットに変換するスケーリング変換)が含まれる場合があります。 [要出典] CPUがこの機能を提供していない場合、プログラマは積を十分に大きなレジスタまたは一時変数に保存し、再正規化を明示的にコーディングする必要があります。
オーバーフローは、算術演算の結果が指定された格納領域に格納するには大きすぎる場合に発生します。加算および減算では、結果がオペランドより1ビット多く必要になる場合があります。mビットとnビットの2つの符号なし整数の乗算では、結果がm + nビットになる場合があります。
オーバーフローが発生した場合、スケーリングされていない整数が2 nを法として減算されるため、上位ビットは通常失われます(nは記憶領域のサイズ)。特に符号ビットが失われるため、値の符号と大きさが劇的に変化する可能性があります。
一部のプロセッサでは、オーバーフロー発生時にハードウェアオーバーフローフラグをセットしたり、例外を生成したりできます。また、一部のプロセッサでは飽和演算を行う場合もあります。飽和演算とは、加算または減算の結果がオーバーフローした場合、受信領域に収まる最大の絶対値を持ち、かつ正しい符号を持つ値を格納する演算です。[要出典]
ただし、これらの機能は実際にはあまり役に立ちません。オーバーフローの可能性を排除するようにスケーリング係数とワード サイズを選択するか、演算を実行する前にオペランドに過剰な値がないかどうかをチェックする方が一般的に簡単で安全です。
固定小数点数の明示的なサポートは、いくつかのプログラミング言語、特にPL/I、COBOL、Ada、JOVIAL、Coral 66で提供されています。これらの言語は、2進数または10進数のスケーリング係数を持つ固定小数点 データ型を提供しています。コンパイラは、これらのデータ型に対する演算、変数の読み書き、または値を浮動小数点などの他のデータ型に変換する際に、適切なスケーリング変換を行うコードを自動的に生成します。
これらの言語のほとんどは、1955年から1990年の間に設計されました。より新しい言語は通常、固定小数点データ型やスケーリング係数の変換をサポートしていません。 FORTRAN、 C、C++など、いまだに非常に人気のあるいくつかの古い言語でも同様です。 厳密に標準化された動作を持つ高速浮動小数点プロセッサが広く利用できるようになったことで、2進固定小数点サポートの需要は大幅に減少しました。[引用が必要]同様に、 C#やPythonなど一部のプログラミング言語での10進浮動小数点 のサポートにより、10進固定小数点サポートの必要性がほとんどなくなりました。 固定小数点演算が必要な数少ない状況では、明示的なスケーリング変換を使用して、プログラマが任意のプログラミング言語で実装できます。
一方、すべてのリレーショナルデータベースとSQL表記法は、固定小数点演算と数値の保存をサポートしています。PostgreSQLには特別な数値最大1000桁の数字を正確に保存するための型。[5]
さらに、2008年には国際標準化機構(ISO)が、組み込みDSPプロセッサ上で動作するプログラム向けに、C言語を固定小数点データ型で拡張するための技術報告書草案を公開しました。提案されているデータ型は主に2種類あり、_Fract(小数部は最小7ビット精度)と_Accum(整数部は最小4ビット精度)です。[6] GNUコンパイラコレクション(GCC)はこの草案をサポートしています。[7] [8]
次のような、固定小数点 3 桁の数値 2 つによる乗算があるとします。
小数点以下が3桁あるため、末尾のゼロを表示していることに注目してください。これを整数乗算として再定義するには、まず を掛けて小数点以下の桁をすべて整数桁に移動し、次に を 掛けて小数点以下の桁を元に戻します。式は次のようになります。
これは、異なる基数、特に2基数を選択して計算した場合も同様に機能します。これは、ビットシフトが2の位による乗算または除算と同じであるためです。小数点以下3桁は約10桁の2進数に相当するため、0.05を2進小数点以下10ビットに丸める必要があります。最も近い近似値は0.0000110011です。
したがって掛け算は
これは小数点以下 3 桁で 11.023 に丸められます。
16ビットの小数部を持つ2進固定小数点数で、1.2と5.6の積を計算するタスクを考えてみましょう。2つの数値を表すには、2 16を掛けて78 643 .2と367 001 .6を得ます。そして、これらの値を最も近い整数に丸めて78 643と367 002を得ます。これらの数値は、2の補数形式の符号付き32ビットワードに収まります。
これらの整数を掛け合わせると、35ビット整数28 862 138 286が得られます。この値は32ビットの小数部ビットを持ち、丸めは行われません。この値を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の暗黙の小数ビットを持ち、したがって小数を表す。
この値を8ビットの小数部を持つ符号付き16ビット固定形式で表す場合、整数積を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.30
Q2.30。[11] [12]s1.30が、これは小数部にもアキュムレータにも有効な型ではありません。有効なバージョンでは、mは少なくとも4であり、基になる型に応じてfは少なくとも7、15、または23になります。斜体でない s に注意してください。これは単に文字として先頭に付加されます。PIC S9999V99小数点以下2桁を含む符号付き絶対値6桁の10進整数を指定しました。[13]REAL FIXED BINARY (p,f)type F is delta 0.005 range -50.0 .. 50.0 'Small => 0.005BmB16fxm.bfx1.16s:m:f<s,b,m>