加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

具有NaN值的变量在Ruby中不等于它自己

发布时间:2020-12-17 03:38:40 所属栏目:百科 来源:网络整理
导读:当我偶然发现一些非常有趣的东西时,我正在测试我的一些 Ruby 1.9代码.我希望有人可以解释为什么会这样. 这是代码: inf = Float::INFINITYx = inf - infy = 0.0/0.0puts "X is #{x}"puts "Y is #{y}"puts "X and Y are both NaN." if x.nan? y.nan?puts "Thi
当我偶然发现一些非常有趣的东西时,我正在测试我的一些 Ruby 1.9代码.我希望有人可以解释为什么会这样.

这是代码:

inf = Float::INFINITY

x = inf - inf
y = 0.0/0.0

puts "X is #{x}"
puts "Y is #{y}"

puts "X and Y are both NaN." if x.nan? && y.nan?

puts "This is all as we expected,but here is the mystery..."

puts "X is not equal to Y." if x == y

puts "Surprisingly not even X is equal to X." if x == x

这是输出:

X is NaN
Y is NaN
X and Y are both NaN.
This is all as we expected,but here is the mystery...

我已经以两种不同的方式将NaN值分配给两个变量,当我测试它们是否相等时,情况并非如此.之后我测试了一个变量是否与自身相等,甚至不是这样.期望某些价值等于自身是合乎逻辑的,但正如我们所能看到的那样,事实并非如此.

我不知道这是否是测试NaN值的正确方法,但我真的想知道所有这些背后的原因是什么原因让Ruby表现得像这样?

谢谢

解决方法

如果我们考虑一下,它似乎合乎逻辑.你通过从另一个无限大数中减去一个无限大数来获得x?结果是什么?我们不知道.

我们如何比较我们不知道的事情?

为了备份我的逻辑,这里是Float#==的来源

static VALUE flo_eq(VALUE x,VALUE y)
{
    volatile double a,b;

    switch (TYPE(y)) {
      case T_FIXNUM:
        b = (double)FIX2LONG(y);
        break;
      case T_BIGNUM:
        b = rb_big2dbl(y);
        break;
      case T_FLOAT:
        b = RFLOAT_VALUE(y);
#if defined(_MSC_VER) && _MSC_VER < 1300
        if (isnan(b)) return Qfalse;
#endif
        break;
      default:
        return num_equal(x,y);
    }
    a = RFLOAT_VALUE(x);
#if defined(_MSC_VER) && _MSC_VER < 1300
    if (isnan(a)) return Qfalse;
#endif
    return (a == b)?Qtrue:Qfalse;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读