Project

General

Profile

Actions

Bug #1468

closed

exact Time and inexact Time

Added by mame (Yusuke Endoh) almost 15 years ago. Updated about 13 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
Backport:
[ruby-dev:38446]

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
=end


Related issues 1 (0 open1 closed)

Has duplicate Ruby master - Bug #1481: exact Time and inexact TimeClosedActions
Actions #1

Updated by shyouhei (Shyouhei Urabe) almost 15 years ago

=begin
卜部です。

Tanaka Akira さんは書きました:

In article ,
Yusuke ENDOH 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

Actions #2

Updated by mame (Yusuke Endoh) almost 15 years ago

=begin
遠藤です。

2009/05/15 0:00 Tanaka Akira :

一般に数値計算では、値が持つ誤差よりも充分に高い精度を持って
いる数値表現を使う必要があるんじゃないでしょうか。

数値計算の問題もあるかもしれませんが、私はインターフェイスの
問題を気にしています。

卜部さんもおっしゃっていますが、Rational は「誤差がない数値」を
表現しているようにしか見えず、「十分に高い精度を持っている数値」
として使われているとは考え付きません。

そのため、最低でも Float から Rational に暗黙に変換されることが
あるのは、何らかの処置をすべき問題だと思います。具体的な方法は
ともかく。

しかし、異なる Epoch へ変換するという用途では double では充
分でないこともあるでしょう。

どちらも Time 同士の引き算で実現できますが、必要な精度は異な
ります。

いろいろ考えたんですが、Time#to_r を用意したらどうでしょう。
誤差なく Epoch 変換したい人は、to_r して正確な Unix Epoch に
してから、Time でなく Rational でやってくれということで。

--
Yusuke ENDOH

=end

Actions #3

Updated by mame (Yusuke Endoh) almost 15 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
Applied in changeset r23490.
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0