如何检查 ruby​​ 中的 var 是否为 NaN?

1 ruby floating-point nan conditional-statements

如果数字是“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
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*ord 6

尽管我将“i”设置为“NaN”,但我得到了上面令人困惑的输出。

根据IEE?754 规范,这是正确的行为。你会在任何其他语言中发现同样的事情,假设它已经正确地实现了规范。

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

// In JavaScript:
NaN == NaN
// false
Run Code Online (Sandbox Code Playgroud)

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

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

在 ruby​​ 中,这已实现为Float#nan?

Float::NAN.nan?
#=> true
Run Code Online (Sandbox Code Playgroud)

在幕后,这确实是在断言x != x

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

static int
double_ne(double n1, double n2)
{
    return n1 != n2;
}
Run Code Online (Sandbox Code Playgroud)