[#32185] Date#+に大きな数字を与えるとおかしな日付に — "madoka yamamoto" <yamamotomadoka@...>

こんにちは、山本と申します。

26 messages 2007/11/08
[#32186] Re: Date#+に大きな数字を与えるとおかしな日付に — Tadayoshi Funaba <tadf@...> 2007/11/08

> Dateオブジェクトに+で大きな数字を与えるとおかしくなるようです。

[#32188] Re: Date#+に大きな数字を与えるとおかしな日付に — "madoka yamamoto" <yamamotomadoka@...> 2007/11/09

山本です。

[#32191] Re: Date#+に大きな数字を与えるとおかしな日付に — tadf@... 2007/11/09

> アルゴリズムの意味がわからないで書いた、表層的なパッチなので

[#32194] Re: Date#+に大きな数字を与えるとおかしな日付に — Yukihiro Matsumoto <matz@...> 2007/11/09

Hi,

[#32200] Re: rational (Re: Date#+に大きな数字を与えるとおかしな日付に) — Tadayoshi Funaba <tadf@...> 2007/11/10

> 1.9ではRationalとComplexを組み込みに、という話はありましたが、

[#32225] Re: rational (Re: Date#+に大きな数字を与えるとおかしな日付に) — Shin-ichiro HARA <sinara@...> 2007/11/12

原です。

[#32198] [提案] Array#tail — "Yusuke ENDOH" <mame@...>

遠藤と申します。

21 messages 2007/11/09
[#32199] Re: [提案] Array#tail — Yukihiro Matsumoto <matz@...> 2007/11/10

まつもと ゆきひろです

[#32352] 1.9.1のリリース時期について — KIMURA Koichi <hogemuta@...>

木村です。

16 messages 2007/11/24
[#32353] Re: 1.9.1のリリース時期について — Yukihiro Matsumoto <matz@...> 2007/11/24

まつもと ゆきひろです

[#32403] Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Takahiro Kambe <taca@...>

こんばんは。

32 messages 2007/11/29
[#32414] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Urabe Shyouhei <shyouhei@...> 2007/11/30

卜部です。

[#32444] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Yukihiro Matsumoto <matz@...> 2007/12/03

まつもと ゆきひろです

[#32488] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Urabe Shyouhei <shyouhei@...> 2007/12/08

卜部です。

[#32525] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — "Yusuke ENDOH" <mame@...> 2007/12/10

遠藤と申します。

[#32643] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — "Yusuke ENDOH" <mame@...> 2007/12/19

遠藤です。

[#32409] Re: [ruby-cvs:21293] Ruby:r14056 (trunk): * signal.c (trap_signm): SIGVTALRM no longer used for green — SASADA Koichi <ko1@...>

 ささだです.

10 messages 2007/11/30

[ruby-dev:32193] Re: Date#+に大きな数字を与えるとおかしな日付に

From: "madoka yamamoto" <yamamotomadoka@...>
Date: 2007-11-09 03:09:23 UTC
List: ruby-dev #32193
山本です。

> date には速度の課題があって、一番の理由は、rational の速度なのですが、
> rational の速度を改善するか、なんらかの形で rational を排除するか考え
> ていました。僕としては、rational の速度の改善に期待していましたが、難
> しいようです。

なるほど、確かに手元の簡単なベンチマークでもrationalにしたものでは
3倍くらい遅くなりました。ずいぶんな違いが出るようですね。

でも個人的には最初に報告したエラーにもならず
おかしな日付になる現象はあまり良くないと思います。
僕の好みとしては遅くとも正しい結果が出るほうが好みです。
一意見としてお聞きください。

すごいいまさらですが、mathnなくても大丈夫でしたのでパッチのせておきます。

Index: date.rb
===================================================================
--- date.rb     (revision 13846)
+++ date.rb     (working copy)
@@ -385,10 +385,10 @@
        y -= 1
        m += 12
       end
-      a = (y / 100.0).floor
-      b = 2 - a + (a / 4.0).floor
-      jd = (365.25 * (y + 4716)).floor +
-       (30.6001 * (m + 1)).floor +
+      a = Rational(y, 100).to_i
+      b = 2 - a + Rational(a, 4).to_i
+      jd = (Rational(36525, 100) * (y + 4716)).to_i +
+       (Rational(306001, 10000) * (m + 1)).to_i +
        d + b - 1524
       if jd < sg
        jd -= b
@@ -406,14 +406,14 @@
       if jd < sg
        a = jd
       else
-       x = ((jd - 1867216.25) / 36524.25).floor
-       a = jd + 1 + x - (x / 4.0).floor
+       x = ((jd - Rational(186721625, 100)) / Rational(3652425, 100)).to_i
+       a = jd + 1 + x - Rational(x, 4).to_i
       end
       b = a + 1524
-      c = ((b - 122.1) / 365.25).floor
-      d = (365.25 * c).floor
-      e = ((b - d) / 30.6001).floor
-      dom = b - d - (30.6001 * e).floor
+      c = ((b - Rational(1221, 10)) / Rational(36525, 100)).to_i
+      d = (Rational(36525, 100) * c).to_i
+      e = ((b - d) / Rational(306001, 10000)).to_i
+      dom = b - d - (Rational(306001, 10000) * e).to_i
       if e <= 13
        m = e - 1
        y = c - 4716

In This Thread