Number)は、浮動小数点方式において「正規化」して表現できないような、0にごく近い、絶対値が極端に小さい数の表現法により表現された数である。いう名前に定義される最小の正規化数よりも絶対値が小さい(つまりゼロに近い)。概要[編集]一般に浮動小数点方式では、仮数部の上位桁にゼロが出現しないよう表現を調整する。これを「正規化」と言う。非正規化数は、正規化すると、表現に使用しようとしている表現方式で、指数が表現可能な範囲より小さくなってしまう数である(一般に浮動小数点では、仮数部・指数部のどちらも桁数は固定である)。754の倍精度(binary64)では、指数が2−1022までしか表現できない。同じ)としたうえで2−1022を表しているものとし、仮数部は正規化されていない2進表現とする。一般に浮動小数点数方式における仮数部は、位取り記数法による、重み付けの最も大きい方の桁の数字の並びである。ここで、ある桁数pの正の正規化数の仮数部をm0.m1m2m3...mp−2mp−1とする。省略してしまうことも可能である(いわゆるケチ表現)。この省略法を採用している場合、正規化数とは、この「省略された暗黙の1」がある数である、とも言える。(0.m1m2m3...mp−2mp−1)、最小の正規化数よりも絶対値が小さい数を表現する。表現可能な桁数(すなわち相対精度)も低下する[1]。改名され、二進だけでなく十進の形式も規定されている。十進には前述の二進の場合のケチ表現のようなものは無いため、形式としても二進の場合のような違いはない。underflow[編集]演算の結果の絶対値が、厳密なゼロではないが表現可能な最小の正規化数のそれよりも小さい値になった場合を「アンダーフロー」とする。表現される)こともあるが、非正規化数で表現することにより、徐々に精度は失われるが、ある程度は結果が救われることになる。underflowと言う(漸近的、などと訳されるが定訳は(まだ)ない)。背景[編集]非正規化数によって、浮動小数点数の加減算は決して「アンダーフローによるゼロ」にならないことが保証される(乗除算ではそれでも発生し得る)。2つの近い値の浮動小数点数には必ずゼロでない表現可能な差が存在する。いう減算で2つの値に小さな差があったとしても、アンダーフローと判断して差をゼロにしてしまうことになる。すると、漸近的アンダーフローを採用していれば発生しないはずのゼロ除算が発生する原因にもなる。して最終的に採用されたカハンらの提案の中で、この非正規化数の部分が最も議論を呼んだが[2]、この実装が非正規化数が実際に使えることを証明した。FPUの実装によっては非正規化数をハードウェアで直接サポートしておらず、ソフトウェアで実現している。これはユーザーからは透過的だが、非正規化数を使った計算は正規化数による同じ計算よりも性能が悪くなる。性能問題[編集]システムによっては、非正規化数を正規化数と同じ形でハードウェアで扱っている。実装によってはシステムソフトウェアに非正規化数の扱いを任せており、ハードウェアでは正規化数とゼロのみを処理する。非正規化数をソフトウェアで扱うと、性能が大きく低下する。非正規化数を完全にハードウェアで処理したとしても、現代の多くのプロセッサではやはり計算性能が大幅に低下する。アーキテクチャによっては、正規化数の100倍も時間がかかることがある[3][4]。精度を保ち、性能低下も防ぐ目的で、非正規化数を生じないようなコードにしてあるアプリケーションもある。音声処理アプリケーションでは、非正規化数は信号が人間の耳に聞こえないほど小さい場合に出現する。そのため非正規化数となった信号部分はゼロにカットしてしまうという対策をとるのが一般的である[5]。いうハードウェア機能がある。いうハードウェア機能もある。