浮動小数点数
浮動小数点数
固定小数点数は、妥当なワード サイズを使用して非常に大きい数や非常に小さい数を同時に表すことができないという点において制限されています。この制限は、科学表記法を使用することで克服できます。科学表記法では、2 進数小数点を便利な位置に動的に配置し、2 進数のべき乗を使用してその位置を追跡できます。このため、非常に大きな数から数桁のみの非常に小さな数の範囲を表現できます。
2 進浮動小数点数は、科学表記法の書式で f2e と表現できます。ここで、f は小数部 (または仮数)、2
は基数または基底 (この場合は 2 進数)、e は基数の指数です。基数は常に正の数値ですが、f と e は正または負になります。
算術演算を実行する場合、浮動小数点ハードウェアは符号、指数、および小数部が同じバイナリ ワード内ですべてエンコードされていることを考慮しなければなりません。その結果、2 進固定小数点演算の回路と比較すると、論理回路が複雑になります。
Fixed-Point Designer™ ソフトウェアでは、IEEE® Standard 754 で定義されている半精度、単精度、および倍精度の浮動小数点数をサポートしています。
科学表記法
科学表記法と基数点の記法の間には、直接的な類似点が存在します。たとえば、小数部に 5 桁の数を使用した科学表記法は、次のような書式になります。
ここで、 で、p は無制限の範囲をもつ整数です。
小数部に 5 桁を使用した基数点の記法は、基底を除いて同じになります。
ここで、 で、q は無制限の範囲をもつ整数です。
固定小数点数の場合、指数は固定されますが、2 進小数点が小数部と連続している必要はありません。詳細については、2 進小数点の解釈を参照してください。
IEEE Standard 754 の浮動小数点数
IEEE Standard 754 は広く採用されており、実質的にすべての浮動小数点プロセッサや算術コプロセッサに使用されています。ただし、多くの DSP 浮動小数点プロセッサは例外です。
この規格ではいくつかの浮動小数点数形式を指定していますが、その中で single と double が最も広く使用されています。各形式には 3 つの要素が含まれています。これらは、符号ビット、小数部フィールド、および指数フィールドです。
符号ビット
IEEE 浮動小数点数では、符号ビットが明示的にワードに含まれる符号/大きさ表現を使用します。符号/大きさ表現を使用した場合、0 の符号ビットは正の数値を表し、1 の符号ビットは負の数値を表します。これは、符号付き固定小数点数で 2 の補数表現が推奨されるのとは対照的です。
小数部フィールド
浮動小数点数は数を 2 進小数点の左または右にシフトし、2 進数の指数を対応する量だけ減らすか増やすことによって、さまざまな多くの方法で表現できます。
浮動小数点数での演算を単純化するために、これらは IEEE 形式で正規化されます。正規化された 2 進数は、1.f の形式の小数部を含みます。ここで、f は特定のデータ型の固定サイズをもちます。左端の小数部ビットは常に 1 であるので、このビットを格納する必要はなく、したがって暗黙的 (または非表示) になります。このため、n ビットの小数部は n+1 ビットの数を格納します。IEEE 形式は非正規化された数もサポートしています。この数にも、0.f の書式の小数部があります。
指数フィールド
IEEE 形式では、指数表現にはバイアスが付けられます。つまり、固定値 (バイアス) を指数フィールドから減算することで、真の指数値が求められます。たとえば、指数フィールドが 8 ビットの場合は、0 ~ 255 の数が表現され、127 のバイアスが存在します。一部の指数値は Inf
(無限大)、NaN
(Not-a-Number)、および非正規化された値のフラグ設定用に予約されているので、真の指数値の範囲は -126 ~ 127 になります。詳細については、InfおよびNaNを参照してください。
倍精度の形式
IEEE の倍精度浮動小数点形式は、1 ビットの符号インジケーター s、11 ビットのバイアス付き指数 e、および 52 ビットの小数部 f に分割される 64 ビットのワードです。
倍精度形式と実数表現の関係は、次のようにして与えられます。
詳細については、例外的な算術を参照してください。
単精度の形式
IEEE の単精度浮動小数点形式は、1 ビットのインジケーター s、8 ビットのバイアス付き指数 e および 23 ビットの小数部 f に分割される 32 ビットのワードです。
単精度形式と実数表現の関係は、次のようにして与えられます。
詳細については、例外的な算術を参照してください。
半精度形式
IEEE の半精度浮動小数点形式は、1 ビットの符号インジケーター s、5 ビットのバイアス付き指数 e および 10 ビットの小数部 f に分割される 16 ビットのワードです。
半精度数は、MATLAB® と Simulink® でサポートされます。詳細については、half
およびSimulink の半精度データ型を参照してください。
範囲と精度
数の範囲は表現を制限します。精度は表現内の連続する数の間の距離を与えます。IEEE 浮動小数点数の範囲と精度は特定の形式によって異なります。
範囲
小数部に f ビットが割り当てられ、指数に e ビットが割り当てられ、bias = 2(e−1)−1 で与えられる e のバイアスをもつ IEEE 浮動小数点数の表現可能な数の範囲は以下のとおりです。
ここで、
正規化された正の数値は、2(1−bias) ~ (2−2−f)2bias の範囲内で定義されます。
正規化された負の数値は、−2(1−bias) ~ −(2−2−f)2bias の範囲内で定義されます。
(2−2−f)2bias より大きい正の数値と −(2−2−f)2bias より小さい負の数値はオーバーフローです。
2(1−bias) より小さい正の数値と −2(1−bias) より大きい負の数値は、アンダーフローまたは非正規化された数のどちらかです。
ゼロは特殊なビット パターンで与えられます。ここで、e = 0 および f = 0 です。
オーバーフローとアンダーフローは例外的な算術状態によって発生します。定義されている範囲外の浮動小数点数は常に ±Inf
にマッピングされます。
メモ
MATLAB の realmin
コマンドと realmax
コマンドを使用すると、使用しているコンピューターの倍精度浮動小数点値のダイナミック レンジを判断できます。
精度
ワード サイズが有限であることから、浮動小数点数は "真" の値の近似でしかありません。したがって、浮動小数点結果の精度を理解しておくことが重要になります。精度が q の値 v は、v ± q で指定されます。IEEE 浮動小数点数の場合は以下のようになります。
v = (−1)s(2e–bias)(1.f)
および
q = 2–f × 2e–bias
したがって、精度は小数部フィールドのビット数に関連付けられています。
メモ
MATLAB ソフトウェアでは、浮動小数点の相対精度は eps
コマンドによって与えられ、1.0 から次に大きい浮動小数点数までの距離が返されます。IEEE Standard 754 をサポートしているコンピューターの場合は、eps
= 2−52 または 2.22045 · 10-16 になります。
浮動小数点データ型のパラメーター
サポートされている浮動小数点データ型の範囲、バイアス、および精度は次の表に示すとおりです。
データ型 | 下限 | 上限 | 指数バイアス | 精度 |
---|---|---|---|---|
half | 2−14 ≈ 6.1·10−5 | (2−2-10) ·215≈ 6.5·104 | 15 | 2−10 ≈ 10−3 |
single | 2−126 ≈ 10−38 | 2128 ≈ 3 · 1038 | 127 | 2−23 ≈ 10−7 |
倍精度 | 2−1022 ≈ 2 · 10−308 | 21024 ≈ 2 · 10308 | 1023 | 2−52 ≈ 10−16 |
浮動小数点数は符号/大きさを使用して表現されるため、ゼロには正と負の 2 つの表現があります。両方の表現に対し、e = 0 および f.0 = 0.0 となります。
例外的な算術
IEEE Standard 754 では、ハードウェアのプラットフォームに依存せず、予期した結果となるような手法と手順を指定しています。非正規化された数、Inf
および NaN
が、例外的な算術 (アンダーフローとオーバーフロー) に対処するために定義されています。
アンダーフローまたはオーバーフローが Inf
または NaN
によって処理される場合は、この例外に対処するためにかなりのプロセッサのオーバーヘッドが必要になります。IEEE Standard 754 では一貫した方法で例外的算術状態に対処するための手法と手順を指定していますが、マイクロプロセッサのメーカーではこれらの状態に標準とは異なる方法で対処する場合があります。
非正規化された数
非正規化された数は、指数のアンダーフローに対処するために使用されます。結果の指数が小さすぎる (つまり絶対値が大きすぎる負の指数) 場合、結果は小数部を右にシフトし、指数をその最小値のままにすることで非正規化されます。非正規化された数の使用は段階的アンダーフローとも呼ばれます。非正規化された数が存在しない場合、表現可能なゼロ以外の最小数とゼロとのギャップは、表現可能なゼロ以外の最小数とその次に大きな数とのギャップよりもはるかに大きくなります。段階的アンダーフローはこのギャップを埋め、指数のアンダーフローによる影響を、正規化された数の丸めと同程度のレベルにまで緩和します。非正規化された数は、精度を犠牲にして小さな数の範囲を拡張します。
Inf
Inf
(無限大) を含む算術は、制限付きの実数算術として取り扱われ、無限値は表現可能な数の範囲外、つまり −∞ ≤ (representable numbers) < ∞ として定義されます。以下に示す特殊な例外 (NaN
)、Inf
を使用した算術演算は Inf
の結果を生み出します。Inf
は、形式とゼロの小数部によって許容される最大のバイアス付き指数によって表現されます。
NaN
NaN
(Not-a-Number) は、浮動小数点形式にエンコードされるシンボリック エンティティです。NaN
は 2 種類あります。これらは signaling と quiet です。signaling NaN
は、無効な演算例外の信号を出力します。quiet NaN
は例外の信号を出力せずに、ほとんどすべての算術演算を伝播します。次の演算結果は NaN
になります。∞–∞、–∞+∞、0×∞、0/0 および ∞/∞。
signaling NaN
と quiet NaN
のどちらも、形式で許容される最大のバイアス付き指数と非ゼロの小数部によって表現されます。quiet NaN
のビット パターンは 0.f で与えられ、f の最上位ビットは 1 でなければなりません。signaling NaN
のビット パターンは 0.f で与えられ、f の最上位ビットはゼロでなければならず、残りのビットの少なくとも 1 つが非ゼロでなければなりません。