Articles

浮動小数点数

浮動小数点数が必要な理由

コンピュータのメモリが制限されているため、二進分数や十進分数を使用するかどうかにかかわらず、無限の精度で数値を格納することはできません。ある時点でカットオフする必要があります。 しかし、どのくらいの精度が必要ですか? そして、それはどこに必要ですか? どのように多くの整数桁とどのように多くの小数桁?

  • 高速道路を建設するエンジニアには、10メートルか10メートルかは関係ありません。0001メートル幅-彼らの測定値は、おそらく最初の場所でその正確ではありません。
  • マイクロチップを設計する人にとって、0.0001メートル(ミリメートルの十分の一)は大きな違いですが、0.1メートルを超える距離に対処する必要はありません。
  • 物理学者は、同じ計算で光の速度(約300000000)とニュートンの重力定数(約0.0000000000667)を一緒に使用する必要があります。

エンジニアとチップ設計者を満足させるためには、数値形式は非常に異なる大きさで数値の精度を提供する必要があります。 ただし、相対的な精度のみが必要です。 物理学者を満足させるためには、異なる大きさの数を含む計算を行うことが可能でなければならない。

基本的に、固定数の整数と小数の桁を持つことは有用ではなく、解決策は浮動小数点の形式です。

浮動小数点数の仕組み

アイデアは、二つの主要な部分の数を構成することです。

  • 数字の桁を含む仮数。 負の仮数は負の数を表します。
  • 仮数部の先頭に対して10進(または2進)点が相対的に配置される場所を示す指数。 負の指数は、非常に小さい(つまりゼロに近い)数値を表します。

このような形式は、すべての要件を満たしています。

  • 大きく異なる大きさで数値を表すことができます(指数の長さによって制限されます)
  • すべての大きさで同じ相対精度を提供します(仮数の長さによって制限されます)
  • 大きさにわたって計算することができます: 非常に大きい数と非常に小さい数を乗算すると、結果の両方の精度が維持されます。

十進浮動小数点数は、通常、常に1桁目と2桁目の間にある暗黙のポイントを持つ科学表記法の形式をとります。 指数は基数を含めて明示的に書かれているか、または仮数からそれを分離するためにeが使用されます。

標準

ほぼすべてのハードウェアおよびプログラミング言語は、IEEE754標準で定義されている同じバイナリ形式の浮動小数点数を使用します。 通常の形式は、全長が32ビットまたは64ビットです:

Format Total bits Significand bits Exponent bits Smallest number Largest number
Single precision 32 23 + 1 sign 8 ca. 1.2 ⋅ 10-38 ca. 3.4 ⋅ 1038
Double precision 64 52 + 1 sign 11 ca. 2.2 ⋅ 10-308 ca. 1.8⋅10308

いくつかの特殊性があることに注意してください。

  • 実際のビットシーケンスは、最初に符号ビット
  • 指数には符号がなく、代わりに指数バイアスが減算されます(単精度の場合は127、倍精度の場合は1023)。 これとビットシーケンスにより、浮動小数点数を整数として解釈する場合でも、浮動小数点数を正しく比較してソートすることができます。
  • 仮数部の最上位桁は省略され、1とみなされますが、すべて0の指数でマークされ、精度を犠牲にして上の表で与えられた最小の数値を超える数の範囲を許可する非正規数を除きます。
  • 正と負のゼロ値が別々にあり、符号ビットが異なり、他のすべてのビットは0です。 ビットパターンが異なっていても、これらは等しいと見なされなければなりません。
  • 特別な正と負の無限大の値があり、指数はすべて1ビットで、仮数はすべて0ビットです。 これらは、指数の正の範囲を超えた計算の結果、または通常の数値をゼロで除算した結果です。
  • 指数がすべて1ビットで、仮数がすべて0ビットではない特別なnot a number(またはNaN)値があります。 これらは、さまざまな未定義の計算の結果を表します(0と無限大の乗算、NaN値を含むすべての計算、またはアプリケーション固有のケースなど)。 ビットが同一のNaN値であっても、等しいと見なされるべきではありません。これがあまりにも抽象的で、IEE754で特定の値がどのように見えるかを確認したい場合は、Float Toy、またはIEEE754Visualization、またはFloat Exposedを試してみてください。