From: nobu.nakada@... Date: 2004-01-18T16:28:45+09:00 Subject: [ruby-dev:22616] Re: (Time.at(1.1) - 0.2).usec なかだです。 At Sun, 18 Jan 2004 15:46:11 +0900, Tanaka Akira wrote: > 読んでいたら、usec が負になる場合があることに気がつきました。 > > % ruby -e 'p (Time.at(1.1) - 0.2).usec' > -100000 1_000_000を越えることもありますね。 $ ruby -e 'p (Time.at(1.1) + 0.9).usec' 1000000 > なお、こうなったのは 1.8.0 から 1.8.1 の間なようです。 > > % ruby-1.8.0 -e 'p (Time.at(1.1) - 0.2).usec' > 900000 > % ruby-1.8.1 -e 'p (Time.at(1.1) - 0.2).usec' > -100000 とくに変更されてはいないような気がするんですが。 Index: time.c =================================================================== RCS file: /cvs/ruby/src/ruby/time.c,v retrieving revision 1.93 diff -u -2 -p -d -w -r1.93 time.c --- time.c 18 Jan 2004 04:11:09 -0000 1.93 +++ time.c 18 Jan 2004 07:25:48 -0000 @@ -1166,4 +1166,9 @@ time_to_s(time) } +#define ADJUST_USEC(sec, usec) ( \ + (usec < 0) ? (usec += 1000000, sec--) : \ + (usec >= 1000000) ? (usec -= 1000000, sec++) : \ + 0) + /* * call-seq: @@ -1206,5 +1211,5 @@ time_plus(time1, time2) usec = tobj->tv.tv_usec + (time_t)(d*1e6); sec = ( sign > 0 ? tobj->tv.tv_sec + sec : tobj->tv.tv_sec - sec ); - + ADJUST_USEC(sec, usec); #ifdef NEGATIVE_TIME_T if ((tobj->tv.tv_sec >= 0 && sign >= 0 && sec < 0) || @@ -1271,4 +1276,5 @@ time_minus(time1, time2) usec = tobj->tv.tv_usec - (time_t)(d*1e6); sec = ( sign > 0 ? tobj->tv.tv_sec - sec : tobj->tv.tv_sec + sec ); + ADJUST_USEC(sec, usec); #ifdef NEGATIVE_TIME_T if ((tobj->tv.tv_sec <= 0 && sign >= 0 && sec > 0) || -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦