非正規化数

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

情報工学において、非正規化数(ひせいきかすう、Denormalized Number)または非正規数(ひせいきすう、Denormal Number)は、浮動小数点数での0の周辺のギャップを埋める数である。英語の場合、最近では Subnormal Number とも呼ぶ。非正規化数は最小の正規化数(正常に表せる浮動小数点数)よりも小さい(つまりゼロに近い)。

概要[編集]

正規の浮動小数点数では、仮数の上位桁にゼロが出現しないよう指数部を調整する。従って、0.0123 は 1.23 × 10-2 と表現される。非正規化数は正規化しようとすると指数が小さすぎて表現できなくなる数である(一般に指数部には表せる範囲がある)。そのような数は仮数部の上位桁をゼロにすることで表す。これが非正規化数である。

浮動小数点数の仮数は、最も大きい方の桁の数字の並びである。正の正規化数の場合、仮数は m0.m1m2m3...mp-2mp-1 と表され、mは大きい方の各桁の数字、p は精度(有効桁数)であり、m0 はゼロ以外の数字となる。基数が2、つまり二進数の場合、先頭の桁は常に 1 となる。非正規化数では、指数部をそれ以上小さくできないため、仮数部の先頭桁をゼロにすることで(0.m1m2m3...mp-2mp-1)、最小の正規化数よりもゼロに近い数を表現する。

このようにアンダーフローギャップを埋めることで、仮数の表せる桁数が小さくなるが、アンダーフローが発生したときのゼロへのフラッシュほどではない(その場合は全ての有効数字を失う)。計算結果が非常に小さい値の場合、それを使った計算によって徐々に精度が失われるため、非正規化数が生まれることを「漸近的アンダーフロー(gradual underflow)」とも呼ぶ。

IEEE 754-2008 では、非正規化数は subnormal number と改名され、二進だけでなく十進の形式も規定されている。二進形式での非正規化数は、指数は最小の正規化数と同じで「暗黙の整数ビット」を0の値として符号化するため、これを表す特別な指数部の値(バイアスされた値が0、最小の指数より1小さい)が用意されている。十進形式では暗黙の整数ビットが存在せず、非正規化数も特別な符号化をすることなく表現できる。

背景[編集]

非正規化数によって、浮動小数点数の加減算は決してアンダーフローとならないことが保証される。2つの近い値の浮動小数点数には必ずゼロでない表現可能な差が存在する。漸近的アンダーフローを認めない場合、ab という減算で2つの値に小さな差があったとしても、アンダーフローと判断して差をゼロにしてしまうことになる。すると、漸近的アンダーフローを採用していれば発生しないはずのゼロ除算が発生する原因にもなる。

IEEE 754 標準が作成されている間に、非正規化数は Intel 8087実装された。IEEE 754 として最終的に採用されたカハンらの提案の中で、この非正規化数の部分が最も議論を呼んだが[1]、この実装が非正規化数が実際に使えることを証明した。FPUの実装によっては非正規化数をハードウェアで直接サポートしておらず、ソフトウェアで実現している。これはユーザーからは透過的だが、非正規化数を使った計算は正規化数による同じ計算よりも性能が悪くなる。

性能問題[編集]

システムによっては、非正規化数を正規化数と同じ形でハードウェアで扱っている。実装によってはシステムソフトウェアに非正規化数の扱いを任せており、ハードウェアでは正規化数とゼロのみを処理する。非正規化数をソフトウェアで扱うと、性能が大きく低下する。しかし、非正規化数を完全にハードウェアで処理したとしても、現代の多くのプロセッサではやはり計算性能が大幅に低下する。アーキテクチャによっては、正規化数の100倍も時間がかかることがある[2][3]

精度を保ち、性能低下も防ぐ目的で、非正規化数を生じないようなコードにしてあるアプリケーションもある。例えば音声処理アプリケーションでは、非正規化数は信号が人間の耳に聞こえないほど小さい場合に出現する。そのため非正規化数となった信号部分はゼロにカットしてしまうという対策をとるのが一般的である[4]インテルはSSE2拡張で非正規化数をゼロに丸めるという機能をハードウェアで実装している[5]

脚注[編集]

  1. ^ An Interview with the Old Man of Floating-Point Reminiscences elicited from William Kahan by Charles Severance
  2. ^ Dooley, Isaac; Kale, Laxmikant (2006年9月12日). “Quantifying the Interference Caused by Subnormal Floating-Point Values”. 2010年11月30日閲覧。
  3. ^ Fog, Agner. “Instruction tables: Lists of instruction latencies, throughputs and microoperation breakdowns for Intel, AMD and VIA CPUs”. 2011年1月25日閲覧。
  4. ^ Serris, John (2002年4月16日). “Pentium 4 denormalization: CPU spikes in audio applications”. 2010年9月3日閲覧。
  5. ^ Casey, Shawn (2008年10月16日). “x87 and SSE Floating Point Assists in IA-32: Flush-To-Zero (FTZ) and Denormals-Are-Zero (DAZ)”. 2010年9月3日閲覧。

参考文献[編集]

ウィリアム・カハンのウェブサイト [1] には非正規化数を使うことで計算結果を改善する例を示した論文などがある。

外部リンク[編集]