算術アンダーフロー(浮動小数点アンダーフロー、または単にアンダーフローとも呼ばれる)とは、コンピュータプログラムにおいて、計算結果が、コンピュータが中央処理装置(CPU)のメモリに実際に表現できるよりも精度の高い絶対値を持つ数値になる状態を指します。
算術アンダーフローは、浮動小数点演算の真の結果が、対象データ型で通常の浮動小数点数として表現できる最小値よりも小さい場合(つまり、ゼロに近い場合)に発生する可能性があります。[ 1 ]アンダーフローは、浮動小数点値の指数部の負のオーバーフローとみなすこともできます。たとえば、指数部が -128 から 127 までの値を表すことができる場合、-128より小さい値の結果はアンダーフローを引き起こす可能性があります。
−fminNとfminNの間の区間(fminNは最小の正の正規浮動小数点値)は、アンダーフローギャップと呼ばれます。これは、この区間のサイズが、ギャップのすぐ外側にある隣接する正規浮動小数点値間の距離よりも何桁も大きいためです。たとえば、浮動小数点データ型が 20 ビットを表現できる場合、アンダーフローギャップは、ギャップのすぐ外側にある隣接する浮動小数点値間の絶対距離の 2 21倍になります。[ 2 ]
従来の設計では、アンダーフローギャップにはゼロという1つの有効な値しかありませんでした。アンダーフローが発生すると、実際の結果はゼロに置き換えられました(ハードウェアによる直接的な処理、またはアンダーフロー状態を処理するシステムソフトウェアによる処理)。この置き換えは「ゼロへのフラッシュ」と呼ばれます。
IEEE 754の 1984 年版では、サブノーマル数が導入されました。サブノーマル数 (ゼロを含む) は、隣接する値間の絶対距離がアンダーフローギャップのすぐ外側の隣接する値間の絶対距離と同じになる値でアンダーフローギャップを埋めます。これにより、「緩やかなアンダーフロー」が可能になり、可能な場合は最も近いノーマル値を使用するのと同様に、最も近いサブノーマル値が使用されます。緩やかなアンダーフローを使用する場合でも、最も近い値はゼロになることがあります。[ 3 ]
ギャップのすぐ外側にある隣接する浮動小数点値間の絶対距離はマシンイプシロンと呼ばれ、1と次に大きい浮動小数点数の差として定義されます。[ 4 ]これは最小値です。満たす、 どこは、実数値を浮動小数点表現に変換する関数です。マシンイプシロンはアンダーフローレベル(非正規数の場合)と混同すべきではありませんが、密接に関連しています。マシンイプシロンは仮数部を構成するビット数に依存しますが、アンダーフローレベルは指数部を構成する桁数に依存します。ほとんどの浮動小数点システムでは、アンダーフローレベルはマシンイプシロンよりも小さくなります。
アンダーフローが発生すると、(「スティッキー」)ステータスビットが設定されたり、例外が発生したり、ハードウェアレベルで割り込みが発生したり、あるいはこれらの効果が組み合わさって発生する可能性があります。
IEEE 754で規定されているように、アンダーフロー状態は精度損失も発生した場合にのみ通知されます。通常、これは最終結果が不正確であることによって判断されます。ただし、ユーザーがアンダーフローをトラップしている場合は、精度損失の有無に関わらず発生する可能性があります。IEEE 754 におけるアンダーフロー (およびその他の例外) のデフォルトの処理は、アンダーフローが発生したことを浮動小数点ステータスとして記録することです。これはアプリケーションプログラミングレベルで規定されていますが、ハードウェアレベルでの処理方法として解釈されることもよくあります。