私は(ウォッチウィンドウで見られる)NaNに設定float値を持っているが、私はコードでそれを検出する方法を見つけ出すことはできません。NaNとの比較が常にfalseを返す場合、floatとNaNを比較するにはどうすればよいですか?
if (fValue == float.NaN) // returns false even though fValue is NaN
{
}
私は(ウォッチウィンドウで見られる)NaNに設定float値を持っているが、私はコードでそれを検出する方法を見つけ出すことはできません。NaNとの比較が常にfalseを返す場合、floatとNaNを比較するにはどうすればよいですか?
if (fValue == float.NaN) // returns false even though fValue is NaN
{
}
あなたはほしいfloat.IsNaN(...)
が必要です。 floatの値が何であっても、NaN
との比較は常にfalseを返します。これは浮動小数点の癖の1つです。あなたがこれを行うことができることを意味し
:
if (f1 != f1) { // This conditional will be true if f1 is NaN.
は実際には、それはISNANは()どのように動作するかを正確です。
はこれを試してみてください:
if (float.IsNaN(fValue))
{
}
if(float.isNaN(fValue))
{
}
これはC#の質問です。 C#の 'Float'に' isNaN'というメソッドはありません。それは「IsNaN」であり、資本「I」である。 –
if (fValue.CompareTo(float.NaN) == 0)
注:私は知っている、スレッドが死んでいます。
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倍速く:あなたが危険なコードを使用して希望されない場合、あなたはまだ組合のような構造を使用することができます。
"Microsoftがこのような方法でIsNaNを実装しなかった理由は不思議です。"そのコードはプラットフォームに依存し、別の場所で破損するためです。 –
浮動小数点データ構造はIEEE 754で記述されており、プラットフォームに依存しません。さらに、無限のチェックは.NETでバイナリ比較によって実装されています。 '(((((int *)&f))&0x7fffffff == 0x7f800000)'となります。 –
浮動小数点データ構造_はプラットフォームに依存しませんが、エンディアンはありません。 –
それは邪魔です:) – JaredPar
その後、NaN!= NaN? – alan2here
isNaN()isNaN() – AntonioCS