Bug: Time#-(1e-6) doesn't substract one microsecond.

D

Dmitry Maksyoma

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;
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,777
Messages
2,569,604
Members
45,227
Latest member
Daniella65

Latest Threads

Top