1. ホーム
  2. c

[解決済み] C言語でnanとinfはどのように使うのですか?

2023-01-06 09:14:48

質問

エラーが発生した場合、nanまたはinfを返すことができる数値メソッドを持っています。テスト目的で、状況が正しく処理されていることを確認するために、一時的にnanまたはinfを返すように強制したいと思います。信頼できる コンパイラーに依存しない C で nan と inf の値を作成する信頼できる、コンパイラーに依存しない方法はありますか?

10分ほどググってみたところ、コンパイラに依存した解決策しか見つかりませんでした。

どのように解決するのですか?

実装に備わっているかどうかをテストすることができます。

#include <math.h>
#ifdef NAN
/* NAN is supported */
#endif
#ifdef INFINITY
/* INFINITY is supported */
#endif

の存在は INFINITY の存在は C99 (または少なくとも最新のドラフト) で保証されており、 "は正または符号なしを表す float 型の定数表現に展開されます。 無限大を表す float 型の定数式に展開されます (利用可能な場合)、さもなければ翻訳時にオーバーフローする float 型の正の定数に展開されます。

NAN は定義されていてもいなくてもよく、実装がfloat型のquiet NaNをサポートしている場合のみ、"が定義されます。これは、静かなNaNを表すfloat型の定数式に展開されます."。

浮動小数点値を比較している場合、および行うことに注意してください。

a = NAN;

でも

a == NAN;

が偽であることを確認します。 NaNをチェックする方法の1つは、次のようになります。

#include <math.h>
if (isnan(a)) { ... }

もできます。 a != a をテストするために a がNaNであるかどうかをテストする。

また isfinite() , isinf() , isnormal() そして signbit() のマクロは math.h を C99 で使用することができます。

C99 ではまた nan の関数もあります。

#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);

(参考:N1256)となります。

ドックス・インフィニティ ドキュメントNAN