C ユーザーズガイド

非標準浮動小数点

IEEE 754 のデフォルトの浮動小数点演算機能は「無停止」であり、アンダーフローは「段階的」です。ここではこの 2 つの用語を説明します。詳細については『数値計算ガイド』を参照してください。

「無停止」とは、ゼロによる除算、浮動小数点のオーバーフロー、不正演算例外などが生じても実行を停止しないことを意味します。たとえば次の式で、x はゼロ、y は正の数であるとします。

z = y / x;

デフォルトでは、z の値は +Inf になりますが、プログラムの実行は続けられます。ただし、-fnonstd オプションを使用した場合は、このコードによってプログラムが終了します (コアダンプなど)。

次に、段階的アンダーフローの動作を説明するために、次のようなコードを例として考えます。


x = 10;
for (i = 0; i < LARGE_NUMBER; i++)
     x = x / 10;

ループを 1 回通ると x1 になり、2 回目で 0.1、3 回目で 0.01 と続き、やがてはマシンによって値を表現できる許容範囲の下限に到達します。

次にループを実行すると、表現可能な最小の数は次のようになると考えられます。

1.234567e-38

次にループを実行すると、仮数部から「盗んだ」ものを指数部に「与える」ことによって数値が修正され、次の式のようになります。

1.23456e-39

その次はさらに、

1.2345e-40

と続いていきます。これがデフォルト動作である「段階的アンダーフロー」です。非標準の動作では、仮数部から「盗む」ことをせず、通常は単に x をゼロに設定します。