diff --git a/ChangeLog b/ChangeLog index f0faaa1bb0..661710a2ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Sat Jun 28 01:08:42 2008 Tanaka Akira + + * time.c (time_timespec): fix rounding negative float. + Fri Jun 27 21:38:57 2008 Tanaka Akira * struct.c: __size__ removed. use the length of __members__ instead. diff --git a/test/ruby/test_time.rb b/test/ruby/test_time.rb index 9cbb6eaca6..c0620323fc 100644 --- a/test/ruby/test_time.rb +++ b/test/ruby/test_time.rb @@ -105,6 +105,18 @@ class TestTime < Test::Unit::TestCase assert_equal(100, Time.at(0.0000001).nsec) assert_equal(10, Time.at(0.00000001).nsec) assert_equal(1, Time.at(0.000000001).nsec) + assert_equal(0, Time.at(1e-10).nsec) + assert_equal(0, Time.at(4e-10).nsec) + assert_equal(1, Time.at(6e-10).nsec) + assert_equal(1, Time.at(14e-10).nsec) + assert_equal(2, Time.at(16e-10).nsec) + if negative_time_t? + assert_equal(0, Time.at(-1e-10).nsec) + assert_equal(0, Time.at(-4e-10).nsec) + assert_equal(999999999, Time.at(-6e-10).nsec) + assert_equal(999999999, Time.at(-14e-10).nsec) + assert_equal(999999998, Time.at(-16e-10).nsec) + end end def test_at2 diff --git a/time.c b/time.c index c35c9a15f4..08f4eb8282 100644 --- a/time.c +++ b/time.c @@ -201,6 +201,10 @@ time_timespec(VALUE num, int interval) double f, d; d = modf(RFLOAT_VALUE(num), &f); + if (d < 0) { + d += 1; + f -= 1; + } t.tv_sec = (time_t)f; if (f != t.tv_sec) { rb_raise(rb_eRangeError, "%f out of Time range", RFLOAT_VALUE(num));