0

編集: サブ秒が浮動小数点数ではなく整数として表されることが 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]

編集: それで、これについての 2 つの質問: それはバグですか? Time クラスでそのような精度が必要な場合、この副作用をどのように処理しますか? アイデアや回避策はありますか?

4

1 に答える 1

0

このエラーの見た目の深刻さは、float が丸められずに float 文字列がトリミングされるという事実に由来します。見ると

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

それをfloatに変換している間、

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

表示されている動作は、機能としてだけでなくバグとして理解される場合があります。私の意見では、これはより直感的な結果に修正する価値があります。私の意見では、http://bugs.ruby-lang.org/にアクセスして驚きを報告する必要があります。

于 2013-02-11T12:01:44.110 に答える