2009-03-12 7 views

答えて

72

あなたはほしいfloat.IsNaN(...)が必要です。 floatの値が何であっても、NaNとの比較は常にfalseを返します。これは浮動小数点の癖の1つです。あなたがこれを行うことができることを意味し

if (f1 != f1) { // This conditional will be true if f1 is NaN. 

は実際には、それはISNANは()どのように動作するかを正確です。

+36

それは邪魔です:) – JaredPar

+3

その後、NaN!= NaN? – alan2here

+0

isNaN()isNaN() – AntonioCS

29

はこれを試してみてください:

if (float.IsNaN(fValue)) 
{ 
} 
7
if(float.isNaN(fValue)) 
{ 
} 
+0

これはC#の質問です。 C#の 'Float'に' isNaN'というメソッドはありません。それは「IsNaN」であり、資本「I」である。 –

2
if (fValue.CompareTo(float.NaN) == 0) 

注:私は知っている、スレッドが死んでいます。

12

FP3が含まれているため、パフォーマンスに重大な影響を受けるコードfloat.IsNaNでは、処理が遅すぎる可能性があります。その場合、あなたは以下の通り(IEEE 754 specificationに応じて)バイナリマスクのチェックを使用することができます。

public static unsafe bool IsNaN (float f) 
{ 
    int binary = *(int*)(&f); 
    return ((binary & 0x7F800000) == 0x7F800000) && ((binary & 0x007FFFFF) != 0); 
} 

それはfloat.IsNaNよりも5倍高速です。私はマイクロソフトがなぜこのような方法でIsNaNを実装しなかったのか不思議です。 IsNaNより

[StructLayout (LayoutKind.Explicit)] 
struct FloatUnion 
{ 
    [FieldOffset (0)] 
    public float value; 

    [FieldOffset (0)] 
    public int binary; 
} 

public static bool IsNaN (float f) 
{ 
    FloatUnion union = new FloatUnion(); 
    union.value = f; 

    return ((union.binary & 0x7F800000) == 0x7F800000) && ((union.binary & 0x007FFFFF) != 0); 
} 

それはまだだ3倍速く:あなたが危険なコードを使用して希望されない場合、あなたはまだ組合のような構造を使用することができます。

+1

"Microsoftがこのような方法でIsNaNを実装しなかった理由は不思議です。"そのコードはプラットフォームに依存し、別の場所で破損するためです。 –

+1

浮動小数点データ構造はIEEE 754で記述されており、プラットフォームに依存しません。さらに、無限のチェックは.NETでバイナリ比較によって実装されています。 '(((((int *)&f))&0x7fffffff == 0x7f800000)'となります。 –

+2

浮動小数点データ構造_はプラットフォームに依存しませんが、エンディアンはありません。 –

関連する問題