小数を格納する方法は多数あり、それぞれに長所と短所があります。
浮動小数点は、間違いなく最も一般的な形式です。これは、符号、仮数、および符号付き2を底とする指数を整数にエンコードし、それらを多数のビットにパックすることによって機能します。たとえば、32ビットの仮数0.5
(としてエンコード0x88888888
)と32ビットの符号付き指数+3
(0x00000003
)を使用して、デコードして4.0
(0.5 * 2 ^ 3
)。浮動小数点数はハードウェアに実装されているため高速であり、その精度は絶対サイズでスケーリングされます。つまり、数値が小さいほど絶対精度が高くなり、相対丸め誤差は絶対サイズで一定になります。フロートは、長さ、音圧レベル、光レベルなど、連続領域からサンプリングされた値に優れており、そのため、一般的にオーディオおよび画像処理、統計分析および物理シミュレーションで使用されます。最大の欠点は、正確ではないことです。つまり、丸め誤差が生じやすく、すべての小数を正確に表すことができません。すべての主流のプログラミング言語には、何らかの浮動小数点があります。
固定小数点十分に大きい整数を使用し、小数部のためにビットの一部を暗黙的に予約することにより機能します。たとえば、24.8ビットの固定小数点数では、整数部(符号を含む)に24ビット、小数部に8ビットを予約しています。その数を8ビットだけ右シフトすると、整数部分が得られます。固定小数点数は、ハードウェアの浮動小数点ユニットが一般的でないか、少なくとも対応する整数よりもはるかに遅い場合によく使用されていました。固定小数点数は、正確さの点では多少扱いやすいですが(理由付けが簡単な場合のみ)、他のすべての点で浮動小数点数に劣ります-精度が低く、範囲が狭く、余分なため暗黙のシフトの計算を修正するには演算が必要です。今日の固定小数点演算は、浮動小数点演算よりも遅いことがよくあります。
10進数型は、浮動小数点数または固定小数点数によく似ていますが、10進数システムを想定しています。つまり、指数(暗黙的または明示的)は2の累乗ではなく10の累乗をエンコードします。たとえば、10進数はの仮数23456
との指数をエンコードでき、-2
これは次のように展開されます234.56
。10進数は、算術演算がCPUに組み込まれていないため、浮動小数点よりも低速ですが、10進数を含むすべての場合に理想的であり、明確に定義されたスポットで丸めが発生し、それらの数値が正確である必要があります-財務計算、スコアボードなど。一部のプログラミング言語には10進数型が組み込まれています(C#など)。他のプログラミング言語では、それらを実装するためにライブラリが必要です。小数は繰り返しのない小数を正確に表すことができますが、その精度は浮動小数点数の精度よりも優れているわけではありません。小数を選択するということは、小数システムで正確に表現できる数値の正確な表現を取得することを意味します(floatが2進小数を正確に表現できるように)。
有理数は、分子と分子を格納し、通常、ある種のbignum整数型(コンピューターのメモリ制約が許す限り大きくなる可能性のある数値型)を使用します。これは、1/3
またはのような数字を正確にモデル化できる束の中の唯一のデータ型であり、3/17
それらに対する操作と同様です-他のデータ型とは異なり、有理数は次のようなものに対して正しい結果を生成します3 * 1/3
。数学は非常に簡単ですが、効率的なファクタリングアルゴリズムを考案するのはかなり困難です。一部のプログラミング言語には、合理的な型が組み込まれています(Common Lispなど)。合理性の欠点には、遅いこと(多くの操作で端数の削減とコンポーネントの因数分解が必要)、多くの一般的な操作は実装が困難または不可能であり、ほとんどの実装ではこれが発生すると合理性がフロートに低下します(たとえば、sin()
合理的に)。
BCD(Binary Coded Decimal)は、「ニブル」(4ビットのグループ)を使用して個々の数字をエンコードします。ニブルは16個の異なる値を保持できますが、10進数には10個しか必要ないため、ニブルごとに6個の「不正な」値があります。10進数と同様に、BCD番号は10進数とまったく同じです。つまり、10進数で実行される計算は、ペンと紙を使用して行った場合と同じように機能します。BCDの算術規則はやや不格好ですが、長所は、文字列への変換が他の形式の一部よりも簡単であるということです。これは、組み込みシステムのようなリソースの少ない環境で特に興味深いものです。
文字列、はい、普通の古い文字列も、小数を表すために使用できます。技術的には、これはBCDと非常によく似ていますが、明示的な小数点があり、10進数ごとに1バイトを使用します。そのため、この形式は無駄です(256の可能な値のうち11のみが使用されます)が、BCDよりも解析および生成が簡単です。さらに、使用される値はすべて「疑わしくなく」、無害で、プラットフォームに中立であるため、文字列エンコードされた数値は問題なくネットワーク上を移動できます。文字列に対して直接行われている算術演算を見つけることは一般的ではありませんが、可能ですが、実行すると、他の10進形式(10進およびBCD)と同じように10進正確になります。