5

有効な値を保持していない場合のように、「空」である可能性のある double (または float) 変数があります。組み込み型 float および double でこの状態をどのように表現できますか?

1 つのオプションは float と boolean を持つラッパーですが、私のライブラリには double として動作するオブジェクトではなく double を格納するコンテナーがあるため、これは機能しません。もう 1 つは NaN (std::numeric_limits) を使用することです。しかし、変数が NaN であることを確認する方法がわかりません。

数値以外の何かを意味する「特別な」浮動小数点値が必要であるという問題を解決するにはどうすればよいですか?

4

4 に答える 4

7

NaN を使用してそれを行いました。

double d = std::numeric_limits<double>::signaling_NaN();
bool isNaN = (d != d);

NaN 値がそれ自体と等しいかどうかを比較すると、false が返されます。これは NaN をテストする方法ですが、真の場合にのみ有効なようstd::numeric_limits<double>::is_iec559です (そうであれば、ieee754 にも準拠しています)。

isnanC99 には、このために呼び出されるマクロがありmath.h、浮動小数点数の NaN 値もチェックします。

于 2008-12-02T00:50:55.253 に答える
6

_isnan(double)Visual C++ には、を介してインポートできる非標準関数がありますfloat.h

C には、isnan(double)を通じてインポートできる関数がありますmath.h

C++ には、 を通じてインポートできる isnan(double) 関数がありますcmath

他の人が指摘したように、NaN を使用するのは非常に面倒です。これらは、NULL ポインターのように処理する必要がある特殊なケースです。違いは、NaN は通常、コア ダンプやアプリケーション エラーを引き起こすことはありませんが、追跡が非常に難しいことです。NaN を使用する場合は、できるだけ使用しないでください。NaN の乱用は、攻撃的なコーディング手法です。

于 2008-12-02T00:59:11.697 に答える
2

ビルトインタイプではありませんが、だいたいこんな用途boost::optionalで使っています。絶対にそれを使用できない場合は、おそらくポインターでうまくいくでしょう。ポインターが NULL の場合、結果に有効な値が含まれていないことがわかります。

于 2008-12-02T01:04:52.027 に答える
1

1つのオプションは、floatとbooleanを持つラッパーですが、私のライブラリにはdoubleを格納するコンテナがあり、doubleとして動作するオブジェクトはないため、これは機能しません。

残念です。C ++では、実際のdouble(参照)属性に自動変換するテンプレートクラスを作成するのは簡単です。(または、その他のタイプへの参照。)テンプレート化されたクラスでキャスト演算子を使用するだけです。例:演算子TYPE&(){戻り値; その後、通常はdoubleを使用する場所であればどこでもHasValue<double>を使用できます。

もう1つは、NaN(std :: neuro_limits)を使用することです。しかし、変数がNaNであるかどうかを確認する方法がわかりません。

litbとJamesSchekも述べているように、C99はisnan()を提供します

しかし、それに注意してください!Nanの値は、数学と論理を本当に面白くします。数値をNOT>=fooとNOT<=fooの両方にすることはできないと思います。しかし、NaNを使用すれば、それは可能です。

ツールボックスにWARN-IF-NAN(X)マクロを保持するのには理由があります。過去にいくつかの興味深い問題が発生しました。

于 2008-12-02T06:36:04.217 に答える