メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

浮動小数点での無効な演算

オペランドが NaN でない浮動小数点演算の結果が NaN になる

説明

このチェックでは、浮動小数点演算の結果が NaN になるかどうかを判別します。このチェックは、NaN を組み込んだ検証モードを有効にし、結果が NaN になる演算を検証で強調表示するように指定している場合にのみ実行されます。

検証で NaN について警告を生成するように指定している場合、チェックは次のようになります。

  • ソフトウェアで考慮されるすべての実行パスで演算が NaN になり、オペランドが NaN でない場合はレッド

  • オペランドが NaN でないときに一部の実行パスで演算が NaN になる場合はオレンジ

  • オペランドが NaN でなければ演算が NaN にならない場合はグリーン

検証で NaN を禁止するように指定している場合、チェックの色は演算の結果にのみ依存します。色はオペランドには依存しません。

このチェックでは、浮動小数点変数が NaN になる可能性のある、浮動小数点変数から整数への変換も強調表示します。この場合、NaN を検証に組み込んでいて、変換に対する入力として NaN を許可していないと、必ずこのチェックが実行されます。

この検証モードを有効にするには、以下のオプションを使用します。

すべて展開する

forbid モードでの結果:

double func(void) {
    double x=1.0/0.0;
    double y=x-x;
    return y;
}
この例では、- 演算のどちらのオペランドも NaN ではありませんが、結果が NaN になります。- 演算に対する [浮動小数点での無効な演算] チェックはレッドになります。forbid モードでは、レッド チェックの後、検証は停止されます。たとえば、return ステートメントの y に対する [未初期化ローカル変数] チェックは表示されません。

warn-first モードでの結果:

double func(void) {
    double x=1.0/0.0;
    double y=x-x;
    return y;
}
この例では、- 演算のどちらのオペランドも NaN ではありませんが、結果が NaN になります。- 演算に対する [浮動小数点での無効な演算] チェックはレッドになります。warn-first モードでのレッド チェックは、他のチェック タイプのレッド チェックとは異なります。レッド チェックの後、検証が停止されません。たとえば、return ステートメントの y に対するグリーンの [未初期化ローカル変数] チェックが表示されます。検証結果の y にカーソルを置くと、値が NaN になっていることがわかります。

forbid モードでの結果:

double func(double arg1, double arg2) {
    double ret=arg1-arg2;
    return ret;
}
この例では、arg1arg2 の値を検証で特定できません。検証では、たとえば arg1arg2 の両方が無限大になる場合などを想定し、arg1-arg2 の結果が NaN になる可能性があると仮定されます。forbid モードでは、このチェックの後、検証では結果が NaN になる実行パスが終了されます。return ステートメントの ret にカーソルを置くと、値は NaN になっていません。

warn-first モードでの結果:

double func(double arg1, double arg2) {
    double ret=arg1-arg2;
    return ret;
}
この例では、arg1arg2 の値を検証で特定できません。検証では、たとえば arg1arg2 の両方が無限大になる場合などを想定し、arg1-arg2 の結果が NaN になる可能性があると仮定されます。warn-first モードでのオレンジ チェックは、他のチェック タイプのオレンジ チェックとは異なります。このチェックの後、検証では結果が NaN になる実行パスが終了されません。return ステートメントの ret にカーソルを置くと、他の可能な値と一緒に値 NaN が引き続き表示されます。

double func(double arg1, double arg2) {
    double z=arg1-arg2;
    return z;
}

void caller() {
    double x=1.0/0.0;
    double y=x-x;
    func(x,x);
    func(y,y);
}

この例では、func 内の - 演算の結果は常に NaN になりますが、[浮動小数点での無効な演算] チェックがレッドではなくオレンジになります。

  • func の最初の呼び出しでは、オペランド arg1arg2 がどちらも NaN ではありませんが、結果が NaN になります。したがって、チェックはレッドになります。

  • func の 2 番目の呼び出しでは、オペランド arg1arg2 がどちらも NaN であるため、結果が NaN になります。したがって、チェックはグリーンになり、オペランドが NaN でなければ結果が NaN にならないことを示します。

func の 2 つの呼び出しに対する色の組み合わせにより、チェックはオレンジになります。

この例では、オプション -check-nan warn-first を使用しました。

void func() {
    double x= 1.0/0.0;
    double y= x-x;
    int z = y;
}

この例では、[浮動小数点での無効な演算] チェックにより、整数変数 z への NaN の代入が検出されます。

このチェックが有効になるのは、検証で非有限の浮動小数点が考慮されなければならないことを指定している場合です。このチェックは、非有限の浮動小数点に対する警告を許可、禁止、または要求しているかどうかにかかわらず、同じ実行パスに対してさらに詳しく検証することをブロックします。

結果情報

グループ: 数値
言語: C | C++
頭字語: INVALID_FLOAT_OP

バージョン履歴

R2016a で導入