2013-01-05 9 views
8

可能性の重複:
NaN Literal in C?ANSI CでNaN値を定義する方法は?

私はパラメータとして2つの数値を受け取り、ANSI Cで関数を書いています。パラメータは、intまたはfloatタイプです。番号は、私のフィルタによれば有効かもしれません。何らかの価値を意味する失敗を返すにはどうすればよいですか?戻り値の型はfloatです。私の頭に浮かぶ最初のものは、NaN抽象タイプでした。しかし、私は

ANSI Cでそれを表現する方法がわからない(私の悪い英語のため申し訳ありません。英語は私の母国語ではない)

+0

@OliCharlesworth:でもそれはC99 – Jack

+0

です。答えの1つは「0.0/0.0'」です。 –

+1

絶対に移植可能な方法はありません。NaNはC89には存在せず、C99では必須でもありません。 – effeffe

答えて

12

NaNは抽象型ではありません。これは浮動小数点データの値です。

「ANSI C」によってあなたは(同じくらい、それが1つを持っているように、用語の実際の意味である)標準Cを、意味場合<math.h>とナンを生成するためにNANマクロを使用し、isnan(x)を含む1つを検出するために、 。

"ANSI C"とは、長らく置き換えられたC89標準(正式なものではないものの、形式的に正しいものでも)を意味する場合、0./0.でNaN値を生成し、x != x

+0

コード内に小さなラッパーを作成して、コードがC99以上にコンパイルされていないかどうかを検出し、その答えにマクロ「NAN」と「isnan」を定義することもできます。 – Will

+0

@ウィル:確かに、私は「0/0。'正式には' NAN'マクロの要件を満たしています(つまり、静的初期化には使用可能でなければなりません)。それでもおそらくほとんどのユーザーにとって心配はありません。 –

+2

@StephenCanon '0。/0'は定数式なので、静的初期化では問題ありません。 – ouah

4

質問数がに応じて有効ではない可能性があり、私のc。で述べたように

if (x != x) // x is NaN 

:?「フィルタは、その後どのように私はあなたがこれを使用することができ

失敗を意味するいくつかの値を返す代わりにはNaNに対して数を比較しますこの式0.f/0.fを使用して、C89にfloatのNaN値を生成することができます。

+0

OPはNaNをチェックする方法を尋ねませんでした。 –

-2

は、あなたがそれを行うことはできません。この

if(your_variable != your_variable) 
{ 
    return 0; //catch 0 as the failure returned value 
} 
else 
{ 
    //your code 
} 
+0

-1この回答は何も説明していないので、NaNの使い方をすぐに知ることができない人には非常に混乱するようなコードが含まれています。 '0'は完全に合理的な戻り値かもしれないからです。 –

2

のようなものを持って、あなたは、2つの変数が、値の1、失敗フラグのための1つを返さなければなりません。

たとえば、通常の操作の場合、関数がtrueを返すように設定できます。 (NaN)の場合。

結果を格納する変数は、パラメータとして参照渡しされ、成功した場合には戻り値を保持します。

BOOL myFunction(int inInt, float inFloat, float *outResult) 
{ 
    /* 
     PROCESSING HERE 
    */ 

    // in case of failure 

    if(/* failure condition here */) 
    { 
     *outResult = 0; 
     return false; 
    } 

    *outResult = /* your result */ 

    return true; 
} 


// how to use the function 

int a; 
float b; 
float result; 
BOOL success; 

success = myFunction(a, b, &result); 

if(success) 
{ 
    // do whatever with your "result" 
} 
else 
{ 
    // NaN 
} 
関連する問題