if(value==value) でうまくいくことはわかっていますが、私のアプリケーションには、チェックする必要がある 50 を超える変数があり、それぞれをチェックするのは少し面倒で、おそらく非効率的です。理想的には、私が探しているのはサブルーチンの終了前で、関数を呼び出すことができ (そのような関数が存在する場合)、1 または 0 を返します。アセンブリには、グローバルな浮動をチェックできる関数が存在するので、私は感じています。ポイントステータスレジスタ。そうでない場合、浮動小数点変数ごとに value==value をポーリングするよりも良い方法はありますか?
3 に答える
一般に、「データのどこかにNaNがありますか?」と尋ねる方法はありません。</ p>
浮動小数点オブジェクトの値は、特に50個ある場合は、計算のさまざまなポイントのレジスタだけでなくメモリにも保持されるため、プロセッサの浮動小数点レジスタをチェックするだけでは、この質問に答えるには不十分です。
「無効な操作の例外が発生しましたか?」と尋ねる方法があります。C標準の7.6節では、で定義されたマクロと関数を介した浮動小数点環境へのアクセスを指定しています。さまざまなコンパイラでは、サポートが不十分な場合があります。基本的に、feclearexceptを使用してFE_INVALIDをクリアし、いくつかの計算を実行して、FE_INVALIDがfetestexceptを使用して設定されているかどうかをテストする必要があります。また、「#pragmaSTDFENV_ACESSon」を設定する必要があります。
これは、計算中に無効な操作例外が発生したかどうかをテストするだけです。入力データにNaNが存在するかどうかはテストされません。無効な操作の例外なしに生成されたNaNはテストされません。
isnan
またはを使用できますfpclassify
。どちらも C99 では標準です。
あなたの問題に関しては、変数がすべて共通の場所で宣言されている場合、これらの宣言を一連のisnan
呼び出しに変換する小さなツールを作成します。
たぶん、このようなものが役立つでしょうか?
void registerAddVariable(double *x) {
APPEND(x); // append to some global linked list
}
void registerRemoveVariable(double *x) {
REMOVE(x); // remove from same global linked list
}
void registerDebug() {
list = head;
while(list) {
if (isnan(*(list->variable))) {
output(list);
}
list = list->next;
}
}
void myfun() {
double variable; registerAddVariable(&variable);
...
registerDebug();
....
registerRemoveVariable(&variable);
}