Bug #1468
closedexact Time and inexact Time
Description
=begin
遠藤です。
現在、Time#- が Rational を返すようになっています。
$ ./ruby -e 'p Time.now - Time.now'
(-7/156250)
しかし、Time.now のように inexact な時刻の差分が、exact の
ように見える Rational になるのはよくないと思います。
Time.gm(2000) などは exact な時刻と考えられますが、それでも
以下で Rational が返るのは好ましくないと思います。
$ ./ruby -e 'p Time.gm(2000) + 0.1 - Time.gm(2000)'
(3602879701896397/36028797018963968)
よって Time オブジェクトに exact かどうかをあらわすフラグを
持たせる必要があるのではないでしょうか。
ただ、Time#- が Rational を返してもよいと思われる例は、
$ ./ruby -e 'p Time.gm(2000) + Rational(1, 2) - Time.gm(2000)'
(1/2)
くらいしか思いつきません。なので Time#- の結果を常に Integer
または Float にするという選択もあるかもしれません。
とりあえず問題提起と提案です。どう思われますでしょう。
--
Yusuke ENDOH mame@tsg.ne.jp
=end
Updated by shyouhei (Shyouhei Urabe) almost 16 years ago
=begin
卜部です。
Tanaka Akira さんは書きました:
In article e0b1e5700905132145i32bed2f0y80faef19c119824f@mail.gmail.com,
Yusuke ENDOH mame@tsg.ne.jp writes:現在、Time#- が Rational を返すようになっています。
$ ./ruby -e 'p Time.now - Time.now'
(-7/156250)しかし、Time.now のように inexact な時刻の差分が、exact の
ように見える Rational になるのはよくないと思います。一般に数値計算では、値が持つ誤差よりも充分に高い精度を持って
いる数値表現を使う必要があるんじゃないでしょうか。
無闇矢鱈に高けりゃいいってもんでもないはずです。
たとえばRationalは無限に高い精度を持つものと考えるのが一般的であると思います。
すると、もしTime.nowが誤差を含んでいるのだとしたら、それをRationalで表現すると
「誤差を含んでいる」という情報を失いますので、Rationalは不適切です。
どのぐらいの誤差を許容できるかが用法によって異なるのに本気で取り組む気があるな
ら、きちんと誤差を扱えるデータ構造、たとえばBigDecimalなどを採用すべきだと思い
ます。
Attachment: signature.asc
=end
Updated by mame (Yusuke Endoh) almost 16 years ago
=begin
遠藤です。
2009/05/15 0:00 Tanaka Akira akr@fsij.org:
一般に数値計算では、値が持つ誤差よりも充分に高い精度を持って
いる数値表現を使う必要があるんじゃないでしょうか。
数値計算の問題もあるかもしれませんが、私はインターフェイスの
問題を気にしています。
卜部さんもおっしゃっていますが、Rational は「誤差がない数値」を
表現しているようにしか見えず、「十分に高い精度を持っている数値」
として使われているとは考え付きません。
そのため、最低でも Float から Rational に暗黙に変換されることが
あるのは、何らかの処置をすべき問題だと思います。具体的な方法は
ともかく。
しかし、異なる Epoch へ変換するという用途では double では充
分でないこともあるでしょう。どちらも Time 同士の引き算で実現できますが、必要な精度は異な
ります。
いろいろ考えたんですが、Time#to_r を用意したらどうでしょう。
誤差なく Epoch 変換したい人は、to_r して正確な Unix Epoch に
してから、Time でなく Rational でやってくれということで。
--
Yusuke ENDOH mame@tsg.ne.jp
=end
Updated by mame (Yusuke Endoh) almost 16 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
Applied in changeset r23490.
=end