2017-11-12 10 views
1

数値が「NaN」の値である場合、if文をチェックインするにはどうすればよいですか?私はこれは私が「i」は、私は上記の不可解な出力を「NaNの」取得していますように設定にもかかわらず、varがRubyのNaNであるかどうかを確認するにはどうすればよいですか?

2.4.0 :003 > i = Float::NAN 
=> NaN 
2.4.0 :004 > puts "hi" if i 
hi 
=> nil 
2.4.0 :005 > puts "hi" if i != Float::NAN 
hi 
=> nil 
2.4.0 :006 > i 
=> NaN 
2.4.0 :007 > puts "hi" if i == Float::NAN 
=> nil 

仕事しかし、あなたが見ることができるようにするだろうと思いました。

+1

は 'NaN'は何にではなく、さらにNaN''と同じではありません。それは仕様によるものです。その理由は、「NaN」は数字ではなく、あなたが何か考えていないことを伝える条件です。この状態には多くの理由があります。したがって、NaNと同等のものはないと単純に決定されました。 「NaN」は「私は知らない」と同等です...あなたが知らないならば、あなたはまたそれが平等であることも知らないのです! (3値論理のシステムでは、 'NaN == anything'はおそらく' false'の代わりに '分かりません ')でしょう。 –

答えて

4

場合はちょうど私が "i" は "NaNで"、私は上記の不可解な出力を得ているように設定にもかかわらず、頼みます。

これは、IEEĘ754 specificationに従って正しい動作です。仕様を正しく実装していれば、他の言語でも同じことがわかります。

# In Ruby: 
Float::NAN == Float::NAN 
#=> false 

// In JavaScript: 
NaN == NaN 
// false 

明細書はまた、推奨される機能のリストを提供含む:

isnan(x)から"x ≠ x"に相当"x is a NaN"ための述語を、。

Rubyで

、これはFloat#nan?として実装されています

Float::NAN.nan? 
#=> true 

Under the hood, this is indeed asserting that x != x

int 
isnan(double n) 
{ 
    return double_ne(n, n); 
} 

static int 
double_ne(double n1, double n2) 
{ 
    return n1 != n2; 
} 
1

ここで確認する方法は次のとおりです

> i.nan? 
=> true 
2

nan?

i = Float::NAN 
i.nan? 
#=> true 
puts "hi" if i.nan? 
#=> hi 
+0

"バッフリングの出力 " NAN == Float :: NAN'が 'false'です)。 –

関連する問題