diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-06-27 16:10:46 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-06-27 16:10:46 +0000 |
commit | 6e90749f807a42265e0346aa9db806723a07c7de (patch) | |
tree | 03e5f0f2cae1d6e50183444e3c486d276f2d854b | |
parent | e509574dea10ee5122ee6e7c56ebeeddc7e4d21c (diff) |
* time.c: fix rounding negative float.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17617 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | test/ruby/test_time.rb | 12 | ||||
-rw-r--r-- | time.c | 4 |
3 files changed, 20 insertions, 0 deletions
@@ -1,3 +1,7 @@ +Sat Jun 28 01:08:42 2008 Tanaka Akira <akr@fsij.org> + + * time.c (time_timespec): fix rounding negative float. + Fri Jun 27 21:38:57 2008 Tanaka Akira <akr@fsij.org> * 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 @@ -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)); |