具有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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |