質問

有効な値を保持していない場合のように、<!> quot; empty <!> quot;である可能性のあるdouble(またはfloat)変数があります。組み込み型floatとdoubleでこの条件をどのように表現できますか?

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

<!> quot; special <!> quotが必要な問題を解決するにはどうすればよいですか。数値以外を意味する浮動小数点値?

役に立ちましたか?

解決

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

Cには、 isnan(double) 関数があります。 math.hからインポートできます。

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

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

他のヒント

NaNを使用してこれを実行しました:

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

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

C99には、isnanにこのためのmath.hというマクロがあり、NaN値の浮動小数点数もチェックします。

これは組み込み型ではありませんが、この種のことには通常boost::optionalを使用します。絶対にそれを使用できない場合、おそらくポインターがトリックを行います-ポインターがNULLの場合、結果に有効な値が含まれていないことがわかります。

1つのオプションは、フロート広告とブール値を持つラッパーですが、それは機能しません。 。

それは残念です。 C ++では、実際のdouble(参照)属性に自動変換するテンプレートクラスを作成するのは簡単です。 (または、それ以外の型への参照。)テンプレートクラスでキャスト演算子を使用するだけです。例:演算子TYPE <!> amp; (){戻り値; }その後、通常はdoubleを使用する任意の場所でHasValue <!> lt; double <!> gt;を使用できます。

別のユーザーはNaN(std :: numeric_limits)を使用しています。しかし、変数がNaNであるかどうかを確認する方法はありません。

litb James Schek も述べたように、C99はisnan()を提供します。

しかし、それに注意してください! Nan値は数学を<!> amp;本当に面白いロジック!数値がNOT <!> gt; = fooとNOT <!> lt; = fooの両方になることはないと思います。しかし、NaNでは可能です。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top