最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

浮動小数点数

浮動小数点数

固定小数点数は、妥当なワード サイズを使用して非常に大きい数や非常に小さい数を同時に表すことができないという点において制限されています。この制限は、科学表記法を使用することで克服できます。科学表記法では、2 進数小数点を便利な位置に動的に配置し、2 進数のべき乗を使用してその位置を追跡できます。このため、非常に大きな数から数桁のみの非常に小さな数の範囲を表現できます。

2 進浮動小数点数は、科学表記法の書式で f2e と表現できます。ここで、f は小数部 (または仮数)、2 は基数または基底 (今の場合は 2 進数)、e は基数の指数です。基数は常に正の数値ですが、fe は正または負になります。

算術演算を実行する場合、浮動小数点ハードウェアは符号、指数、および小数部が同じバイナリ ワード内ですべてエンコードされていることを考慮しなければなりません。その結果、2 進固定小数点演算の回路と比較すると、論理回路が複雑になります。

Fixed-Point Designer™ ソフトウェアでは、IEEE® Standard 754 で定義されている単精度と倍精度の浮動小数点数をサポートしています。

科学表記法

科学表記法と基数点の記法の間には、直接的な類似点が存在します。たとえば、小数部に 5 桁の数を使用した科学表記法は、次のような書式になります。

±d.dddd×10p=±ddddd.0×10p4=±0.ddddd×10p+1,

ここで、d=0,...,9 で、p は無制限の範囲をもつ整数です。

小数部に 5 桁を使用した基数点の記法は、基底を除いて同じになります。

±b.bbbb×2q=±bbbbb.0×2q4=±0.bbbbb×2q+1,

ここで、b=0,1 で、q は無制限の範囲をもつ整数です。

固定小数点数の場合、指数は固定されますが、2 進小数点が小数部と連続している必要はありません。詳細については、2 進小数点のみのスケーリングを参照してください。

IEEE 形式

IEEE Standard 754 は広く採用されており、実質的にすべての浮動小数点プロセッサや算術コプロセッサに使用されています。ただし、多くの DSP 浮動小数点プロセッサは例外です。

この規格では 4 種類の浮動小数点数形式を指定していますが、その中で単精度と倍精度が最も広く使用されています。各形式には 3 つの要素が含まれています。これらは、符号ビット、小数部フィールド、および指数フィールドです。これらの要素と、単精度および倍精度の特定の形式については、以下の節で説明します。

符号ビット

符号付き固定小数点数には 2 の補数の表現が推奨されますが、IEEE 浮動小数点数では、符号ビットが明示的にワードに含まれる符号/大きさ表現を使用します。この表現を使用した場合、0 の符号ビットは正の数値を表し、1 の符号ビットは負の数値を表します。

小数部フィールド

一般的に、浮動小数点数は数を 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、8 ビットのバイアス付き指数 e および 23 ビットの小数部 f に分割される 32 ビットのワードです。詳細は、符号ビット指数フィールド、および小数部フィールドを参照してください。この形式表現は次のとおりです。

この形式と実数表現の関係は、次のようにして与えられます。

value={(1)s(2e127)(1.f)normalized, 0<e<255,(1)s(2e126)(0.f)denormalized, e=0, f>0,exceptional value otherwise.

例外的な算術では、非正規化された値について説明しています。

倍精度の形式

IEEE の倍精度浮動小数点形式は、1 ビットの符号インジケーター s、11 ビットのバイアス付き指数 e および 52 ビットの小数部 f に分割される 64 ビットのワードです。詳細は、符号ビット指数フィールドおよび小数部フィールドを参照してください。この形式の表現は、次の図に示すとおりです。

この形式と実数表現の関係は、次のようにして与えられます。

value={(1)s(2e1023)(1.f)normalized, 0<e<2047,(1)s(2e1022)(0.f)denormalized, e=0, f>0exceptional value otherwise.,

例外的な算術では、非正規化された値について説明しています。

半精度形式

IEEE の半精度浮動小数点形式は、1 ビットの符号インジケーター s、5 ビットのバイアス付き指数 e および 10 ビットの小数部 f に分割される 16 ビットのワードです。半精度数は、MATLAB® でのみサポートされます。詳細については、half を参照してください。

範囲と精度

数の範囲は表現を制限する一方、精度は表現内の連続する数の間の距離を与えます。IEEE 浮動小数点数の範囲と精度は特定の形式によって異なります。

範囲

小数部に f ビットが割り当てられ、指数に e ビットが割り当てられ、bias=2(e1)1 で与えられる e のバイアスをもつ IEEE 浮動小数点数の表現可能な数の範囲は以下のとおりです。

ここで、

  • 正規化された正の数値は、2(1bias)(22f)2bias の範囲内で定義されます。

  • 正規化された負の数値は、2(1bias)(22f)2bias の範囲内で定義されます。

  • (22f)2bias より大きい正の数値と (22f_2bias より大きい負の数値はオーバーフローです。

  • 2(1bias) より小さい正の数値と 2(1bias) より小さい負の数値は、アンダーフローまたは非正規化された数のどちらかです。

  • ゼロは特殊なビット パターンで与えられます。ここで、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 になります。

浮動小数点データ型のパラメーター

サポートされている浮動小数点データ型の上限と下限、指数バイアスおよび精度は次の表に示すとおりです。

データ型

下限

上限

指数バイアス

精度

半精度 (MATLAB のみ)

2-14 ≈ 10-4

216 ≈ 105

15

2-10 ≈ 10 · 10-4

単精度

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 および ∞/∞

どちらの種類の NaN も、形式で許容される最大のバイアス付き指数と非ゼロの小数部によって表現されます。quiet NaN のビット パターンは 0.f で与えられ、f の最上位数は 1 でなければなりません。一方、signaling NaN のビット パターンは 0.f で与えられ、f の最上位数はゼロでなければならず、残りの数字の少なくとも 1 つがゼロ以外でなければなりません。