Oracle® Solaris Studio 12.4: 数値計算ガイド

印刷ビューの終了

更新: 2015 年 1 月
 
 

2.3.2 IEEE 演算でのアンダーフローの処理方法

IEEE 規格 754 では、アンダーフローの結果を処理するための望ましい方法として段階的アンダーフローが選択されています。この方法では、格納された値のための 2 つの表現として、正規と非正規を定義します。

正規の浮動小数点数の IEEE 形式は、次のように示されます。

(-1)s × (2(e–bias)) × 1.f

ここで、s は符号ビット、e はバイアス付き指数、f は小数部です。数値を完全に指定するために格納する必要があるのは、se、および f だけです。仮数の暗黙的先行ビットは正規数では 1 であると定義されているため、格納する必要はありません。

そのため、格納できる最小の正の正規数は、最大の大きさの負の指数とすべてが 0 の小数部を持っています。先行ビットを 1 ではなく 0 であると見なすことによって、さらに小さい数値にも対応できます。倍精度形式では、小数部の長さが 52 ビット (10 進数では約 16 桁) であるため、これによって最小の指数が 10‐308 から実質的に 10‐324 に拡張されます。これらが非正規数であり、アンダーフローした結果を 0 にフラッシュするのではなく、非正規数を返す方法が段階的アンダーフローです。

明らかに、非正規数が小さくなるほど、その小数部に含まれる 0 以外のビットは少なくなります。非正規数の結果を生成する計算には、相対的な丸め誤差に関して、正規数のオペランドに対する計算と同じ制限は適用されません。ただし、段階的アンダーフローに関して重要な点は、その使用によって次のことが暗黙的に示されることです。

  • アンダーフローした結果が、通常の丸め誤差からの結果を超える、大きな正確性の損失を招くことはありません。

  • 加算、減算、比較、および剰余は、その結果が非常に小さい場合でも常に正確です。

非正規の浮動小数点数の IEEE 形式は、次のように示されます。

(-1)s × (2(-bias+1)) × 0.f

ここで、s は符号ビット、バイアス付き指数 e は 0、f は小数部です。暗黙的な 2 のべき乗のバイアスが正規数の形式でのバイアスより 1 大きく、小数部の暗黙的先行ビットが 0 であることに注意してください。

段階的アンダーフローを使用すると、表現可能な数値の小さい方の範囲を拡張できます。ある値を疑わしくするのは小ささではなく、それに関連する誤差です。非正規数を活用するアルゴリズムでは、誤差制限がほかのシステムより小さくなります。次のセクションでは、段階的アンダーフローに対する数学的なある程度の正当化を示します。