【问题标题】:Rounding error in Ruby TimeRuby Time 中的舍入错误
【发布时间】:2013-02-11 08:40:28
【问题描述】:

编辑:它出现在 timev.h 中,亚秒表示为整数而不是浮点数?

即使我知道与实现 IEEE 754 浮点值相关的舍入误差,我还是对此感到非常惊讶:

Time.utc(1970,1,1,0,0,12.860).strftime("%H:%M:%S,%L") # => "00:00:12,859"

通常,逗号后的第 8 位或第 10 位会报告精度错误,我很理解为什么。但是在这种情况下,我的值​​的最后一个有效数字受到影响,并且它似乎比其他众所周知的精度情况更严重。此外,这是 Time 类的一部分,我不知道有什么方法可以在程序中修复它。其他报告的舍入浮点错误有时可以通过使用不同的类来修复,但在这种情况下,我没有看到任何有趣的类可以使用。

我的环境:

phil@eldiablo ~ % uname -a                                                                11-02-2013 09:38:49 
Linux eldiablo.loria.fr 3.5.0-23-generic #35-Ubuntu SMP Thu Jan 24 13:05:29 UTC 2013 i686 i686 i686 GNU/Linux
/home/phil
phil@eldiablo ~ % ruby -v                                                                 11-02-2013 09:38:51 
ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux]

编辑:所以,关于这个有两个问题:这是否是一个错误?如果我需要 Time 类的这种精度,如何处理这种副作用?有什么想法或解决方法吗?

【问题讨论】:

  • 由于我不知道 Time 类的内部实现,我想确定它不是一个错误,这可以被认为是我的第一个问题。第二个问题是,如果我需要 Time 类的这种精度,如何处理这种副作用?
  • 更令人惊讶的是:如果我很好地理解源代码,Time 类中的子秒被定义为 VALUE,即作为无符号整数,即不是作为浮点数。在这种情况下,怎么会发生这种错误?

标签: ruby time rounding-error


【解决方案1】:

这个错误的严重性源于这样一个事实,即浮点字符串被修剪而浮点数没有被四舍五入。当你看

Time.utc( 1970, 1, 1, 0, 0, 12.860 ).subsec
#=> ( 60517119992791 / 70368744177664 )

将其转换为浮点数时会给出

Time.utc( 1970, 1, 1, 0, 0, 12.860 ).subsec.to_f
#=> 0.8599999999999994

您看到的行为可能被理解为错误和功能。在我看来,这应该被纠正为更直观的结果。在我看来,你应该去http://bugs.ruby-lang.org/ 并在那里报告惊喜。

【讨论】:

  • 这就是 SO 的用途 :-) 当您在这里待得更久时,您将了解所有关于礼仪以及 SO 内容纳粹的知识 :-)
猜你喜欢
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 2023-04-09
相关资源
最近更新 更多