非正規化数(Subnormal Number)とは
非正規化数(ひせいきかすう)または非正規数(ひせいきすう)とは、
浮動小数点数において、正規化された形式で表現できないほど非常にゼロに近い、絶対値が極端に小さい数を表現する方法です。英語ではSubnormal Numberとも呼ばれます。
例えば、C言語の倍精度(double)では、`float.h`で定義される`DBL_MIN`(最小の正規化数)よりもさらに絶対値が小さい、つまりゼロに近い数を指します。
概要
一般的に、
浮動小数点数の表現では、仮数部の最上位桁がゼロにならないように調整されます。これは「正規化」と呼ばれ、例えば
0.
0123という数は1.23×1
0^-2と表現されます。しかし、正規化を行うと、指数部が表現可能な最小値を下回ってしまうような極めて小さい数が存在します。このような数を表現するために非正規化数が用いられます。
IEEE 754の倍精度(binary64)の場合、指数部が2^-1
022までしか表現できません。これより小さな数を表現するために、指数部のビットを全てゼロにし、2^-1
022を表すものとして扱います。そして、仮数部には正規化されていない2進表現が用いられます。
非正規化数の表現
浮動小数点数の仮数部は、
位取り記数法における最上位桁の数字の並びです。正規化された数では、最上位桁は常にゼロ以外(2進数では常に1)となります。そのため、コンピュータ内部では最上位ビットを省略する「ケチ表現」が用いられることがあります。非正規化数では、指数部の制約からケチ表現は使われず、最上位桁にゼロが埋められた形で表現されます。
この表現方法により、最小の正規化数よりもさらに小さな数を表現できるようになりますが、同時に表現可能な桁数、すなわち相対精度は低下します。
IEEE 754-2
008では、非正規化数はsubnormal numberと改名され、2進数だけでなく1
0進数の形式も規定されています。1
0進数の場合は、2進数のようなケチ表現がないため、形式的な違いはありません。
gradual underflow(漸近的アンダーフロー)
演算結果の絶対値がゼロではないものの、表現可能な最小の正規化数よりも小さい場合、「アンダーフロー」が発生します。アンダーフロー時に結果をゼロに丸める(フラッシュ)処理を行うこともありますが、非正規化数を用いることで、徐々に精度は失われるものの、ある程度の精度を保ったまま結果を表現できます。このようなアンダーフローの処理をgradual underflow(漸近的アンダーフロー)と呼びます。
非正規化数の背景
非正規化数を用いることで、
浮動小数点数の加減算において、アンダーフローによって結果がゼロになることを防ぎます。これにより、2つの近い値の
浮動小数点数には、必ずゼロではない表現可能な差が存在することが保証されます。もし漸近的アンダーフローを認めないと、微小な差を持つ2つの値の減算結果がアンダーフローでゼロにされてしまい、その後の計算で
ゼロ除算が発生する原因にもなり得ます。
非正規化数は、
IEEE 754標準策定時にIntel 8
087で実装されました。この実装が、非正規化数が実際に利用可能であることを証明しました。ただし、
FPU(浮動小数点演算ユニット)によっては、非正規化数を
ハードウェアで直接サポートしておらず、
ソフトウェアで処理している場合もあります。この場合、非正規化数を含む計算は、正規化数による計算よりも性能が低下します。
性能問題
システムによっては、非正規化数を正規化数と同様に
ハードウェアで扱いますが、
ソフトウェアで処理する場合は性能が大きく低下します。最新のプロセッサであっても、非正規化数の計算は正規化数の計算と比較して大幅に時間がかかることがあります(場合によっては1
00倍程度)。
精度を保ちつつ性能低下を防ぐため、非正規化数が生じないように設計されたアプリケーションも存在します。例えば、音声処理では、非正規化数は人間の耳に聞こえないほど小さい信号に対して現れるため、そのような信号をゼロにカットするという対策が取られます。
Intel製のプロセッサでは、
IA-64やSSEにおいて、演算結果がgradual underflowを起こす場合に、ゼロに丸めるFlush-to-Zero(FZ, FTZ)という
ハードウェア機能が提供されています。また、SSE拡張では、非正規化数をゼロとして扱うDenormals-Are-Zero (DAZ)という機能も提供されています。これらの機能は、制御/ステータスレジスタ(CSR)でマスクを設定することで利用できます。
まとめ
非正規化数は、
浮動小数点数の表現において、極めて小さな数を表現し、アンダーフローによる計算誤差を抑制するために重要な役割を果たします。しかし、計算性能に影響を与える可能性もあるため、適切に理解し、状況に応じて使い分けることが重要です。
参考文献
Eric Schwarz, Martin Schmookler and Son Dao Trong (June 2003). "Hardware Implementations of Denormalized Numbers" (PDF). Proceedings 16th IEEE Symposium on Computer Arithmetic (Arith16). 16th IEEE Symposium on Computer Arithmetic. IEEE Computer Society. pp. 104–111. ISBN 0-7695-1894-X。
ウィリアム・カハンのウェブサイト [1] には非正規化数を使うことで計算結果を改善する例を示した論文などがあります。
外部リンク
IEEE754 倍精度浮動小数点数のフォーマット
計算機における数の表現(PDF)