浮動小数点例外

浮動小数点例外#

  • 読み: ふどうしょうすうてんれいがい

  • 英名:

浮動小数点演算において発生する例外のこと.IEEE 754(浮動小数点数演算標準)では,Invalid Operation, Division by Zero, Overflow, Underflow, Inexact の 5 つが浮動小数点例外として定義されている.

上記の 5 つのケースは以下のような場合に生じる.

  1. Invalid Operation: 例えば負の数の平方根を計算した場合.この例においてデフォルトでは NaN を返す.

  2. Division by Zero: 例えば 1.0/0.0 を計算した場合.この例においてデフォルトでは inf を返す.

  3. Overflow: 例えば exp(1000) を計算した場合.この例においてデフォルトでは inf を返す.

  4. Underflow: 例えば pow(2, -1024) を計算した場合.この例においてデフォルトでは非正規化数(denormalized number もしくは subnormal number)を返す.通常の浮動小数の bit 表現では,仮数部分の bit の並びに対して先頭に 1 をつけたものを用いている.しかし 2 の -1023 乗未満の数の場合には指数部分の取りうる範囲の限界のため,このような表現を行うことができない.そのため,2 の -1023 乗未満の数の場合には先頭の 1 はないものとして bit 列を用いる.この数値を非正規化数と呼んでいる.非正規化数の場合,有効桁数が減るための精度現象,また,アドホックな表記による計算速度の減少といった制約が生じる.

  5. Inexact: 例えば浮動小数点値を整数に変換した場合.この例においてデフォルトでは丸められた整数値を返す.

IEEE754 では上記の例外に対して,デフォルトではない代替の例外処理も認めている.Linux のコンパイラ gcc4.4.7 においては feclearexcept という関数を用いて上記の例外を検出できる(ただし FE_UNDERFLOW については検出されない).Microsoft Visual Studio 2013 の C++ コンパイラにおいては 1.0/0.0 のような即値のゼロ割についてはコンパイルエラーとするようにしている.

Nuorium Optimizer のモデルを実行する際,特に非線形計画問題において,この例外が発生することがある.変数は初期値を与えないと初期値 0 と解釈されるので変数の割り算は浮動小数点例外の原因となり得る.また,log 関数に 0 を与えてしまった場合も浮動小数点例外が発生する.回避方法としては,変数に適当な初期値を与えたり,適当な非負制約等を加えたりすることが挙げられる.