ledestin
5/17/2006 5:54:00 AM
Hello,
Please consider the following test:
t = Time.mktime(2006, 5, 1)
puts t, "sec: #{t.sec}, usec: #{t.usec}"
t2 = t - 1e-6
puts t2, "sec: #{t2.sec}, usec: #{t2.usec}"
t2 = t - 2e-6
puts t2, "sec: #{t2.sec}, usec: #{t2.usec}"
Mon May 01 00:00:00 NZST 2006
sec: 0, usec: 0
Mon May 01 00:00:00 NZST 2006
sec: 0, usec: 0
Sun Apr 30 23:59:59 NZST 2006
sec: 59, usec: 999999
Substracting one microsecond doesn't do anything, substracting 2
microseconds
actually substracts one microsecond.
The problem is that (time_t)1e-6*1e6 yields 0, so I changed it to
(time_t)lround(1e-6*1e6). This way the same Ruby code yields:
Mon May 01 00:00:00 NZST 2006
sec: 0, usec: 0
Sun Apr 30 23:59:59 NZST 2006
sec: 59, usec: 999999
Sun Apr 30 23:59:59 NZST 2006
sec: 59, usec: 999998
--- /home/dmaks/time.c 2006-05-16 19:50:35.000000000 +1200
+++ ruby-1.8.2/time.c 2006-05-17 13:29:50.000000000 +1200
@@ -1285,7 +1285,7 @@
if (f != (double)sec_off)
rb_raise(rb_eRangeError, "time %s %f out of Time range",
sign < 0 ? "-" : "+", v);
- usec_off = (time_t)(d*1e6);
+ usec_off = (time_t)lround(d*1e6);
if (sign < 0) {
sec = tobj->tv.tv_sec - sec_off;