gpt4 book ai didi

ruby - 具有 NaN 值的变量在 Ruby 中不等于自身

转载 作者:数据小太阳 更新时间:2023-10-29 07:26:06 25 4
gpt4 key购买 nike

当我偶然发现一些非常有趣的东西时,我正在测试我的一些 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;
}

关于ruby - 具有 NaN 值的变量在 Ruby 中不等于自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11352655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com