3

为什么false在第二个比较中?我没有加载任何库。

puts RUBY_DESCRIPTION
t = Time.now
t1 = Time.at(t.to_f)
t2 = Time.at(t.to_f)
puts( t1 == t2 )
puts( t == t1 )
puts( t.to_f == t1.to_f )
printf "%.64f\n%.64f\n%.64f\n", t, t1, t2

输出:

ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.4.0]
true
false
true
1347661545.4348440170288085937500000000000000000000000000000000000000000000
1347661545.4348440170288085937500000000000000000000000000000000000000000000
1347661545.4348440170288085937500000000000000000000000000000000000000000000

true在 1.8.7 上得到了所有的 s。这是怎么回事?

据我所知,我更新了脚本以显示浮动是相同的。我错过了什么吗?

4

2 回答 2

4

来自 Time.to_f 上的文档:“请注意,IEEE 754 双精度不足以表示从纪元开始的纳秒数。” 为了说明@oldrinb 的评论:

puts RUBY_DESCRIPTION # ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux]
t = Time.now
p t.subsec #=> (40189433/100000000); # a Rational, note the last digits 33
p t.to_f   #=> 1347661635.4018943   # last digit missing 3

Time#subsec 文档:“#to_f 和 subsec 的最低数字不同,因为 IEEE 754 双精度不足以表示有理数。准确的值由 subsec 返回。”

于 2012-09-14T22:32:45.007 回答
1

我敢打赌,这是一个经典的浮点精度问题。具体来说,当您调用 时#to_f,您可能会丢失原始对象中存在的精度。

如果您比较#nsec每个对象的值,您可以很容易地看到这一点:

1.9.3p194 :059 > t = Time.now
 => 2012-09-14 15:29:59 -0700
1.9.3p194 :060 > t2 = Time.at(t.to_f)
 => 2012-09-14 15:29:59 -0700
1.9.3p194 :062 > t.nsec
 => 489932427
1.9.3p194 :063 > t2.nsec
 => 489932537

可能成功的原因Time.at(t.to_f) == Time.at(t.to_f)是两者在输入中具有相同的浮点精度损失,因此它们的输入确实是相同的。

因此,总而言之,这是错误的行为,但它不是错误/本身/,因为它与浮点算术的基本警告有关。

于 2012-09-14T22:33:11.173 回答