代码之家  ›  专栏  ›  技术社区  ›  user7055375

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

  •  1
  • user7055375  · 技术社区  · 7 年前

    如果一个数字是“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
    

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

    3 回复  |  直到 7 年前
        1
  •  6
  •   Tom Lord    7 年前

    尽管我将“I”设置为“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;
    }
    
        2
  •  2
  •   spickermann    7 年前

    只要问一下 nan?

    i = Float::NAN
    i.nan?
    #=> true
    puts "hi" if i.nan?
    #=> hi
    
        3
  •  1
  •   Cristian Lupascu    7 年前

    以下是检查方法:

    > i.nan?
    => true