如何检查红宝石中的var是否为NaN?

时间:2017-11-12 21:14:52

标签: ruby floating-point conditional-statements nan

如果数字是“NaN”值,如何签入if语句?我以为这会起作用

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

但正如你所看到的,尽管事实上我把“我”设置为“NaN”,但我得到了令人困惑的输出。

3 个答案:

答案 0 :(得分:4)

  

尽管我设置了"我"到了" NaN",我得到了令人困惑的输出。

根据IEEĘ754 specification,这是正确的行为。假设它已正确实现了规范,您将在任何其他语言中找到相同的东西。

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

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

该规范还提供了推荐功能列表,其中包括:

  

isnan(x) - "x is a NaN"的谓词,相当于"x ≠ x"

在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 :(得分:2)

只询问是否nan?

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

答案 2 :(得分:1)

以下是检查方法:

> i.nan?
=> true