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 | 12cda012c722926c13906f806a3033e5c4355a27 (patch) | |
| tree | 03e5f0f2cae1d6e50183444e3c486d276f2d854b | |
| parent | 71dae1f7b4f70a73731a2f4ad794dfcb5e019344 (diff) | |
| download | ruby-12cda012c722926c13906f806a3033e5c4355a27.tar.gz ruby-12cda012c722926c13906f806a3033e5c4355a27.tar.xz ruby-12cda012c722926c13906f806a3033e5c4355a27.zip | |
* time.c: fix rounding negative float.
git-svn-id: http://svn.ruby-lang.org/repos/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 9cbb6eaca..c0620323f 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)); |
