diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-07-10 05:27:27 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-07-10 05:27:27 +0000 |
commit | 3f866a267744c8fcc48a78bc70da7b0cc6872b27 (patch) | |
tree | b8f7a15df7947c84aefedad4af07460dc5399b7a | |
parent | 852290b2fbd45fc7715915b75bca8ee6e5b1bbda (diff) | |
download | ruby-3f866a267744c8fcc48a78bc70da7b0cc6872b27.tar.gz |
util.c: round nearly middle value
* util.c (ruby_dtoa): [EXPERIMENTAL] adjust the case that the
Float value is close to the exact but unrepresentable middle
value of two values in the given precision, as r55604.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55621 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | test/ruby/test_sprintf.rb | 4 | ||||
-rw-r--r-- | util.c | 4 |
3 files changed, 14 insertions, 0 deletions
@@ -1,3 +1,9 @@ +Sun Jul 10 14:27:25 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * util.c (ruby_dtoa): [EXPERIMENTAL] adjust the case that the + Float value is close to the exact but unrepresentable middle + value of two values in the given precision, as r55604. + Sun Jul 10 08:57:20 2016 SHIBATA Hiroshi <hsbt@ruby-lang.org> * thread.c: Fixed implicit conversion error with Apple clang-800.0.31 diff --git a/test/ruby/test_sprintf.rb b/test/ruby/test_sprintf.rb index 5732cecbf9..440cd1d6ab 100644 --- a/test/ruby/test_sprintf.rb +++ b/test/ruby/test_sprintf.rb @@ -282,6 +282,10 @@ class TestSprintf < Test::Unit::TestCase assert_equal(" 0x1.000p+0", sprintf("%20.3a", 1), bug3979) end + def test_float_prec + assert_equal("5.03", sprintf("%.2f",5.025)) + end + BSIZ = 120 def test_skip @@ -3452,8 +3452,12 @@ ruby_dtoa(double d_, int mode, int ndigits, int *decpt, int *sign, char **rve) ilim = i; *s++ = '0' + (int)L; if (i == ilim) { + double x; if (dval(d) > 0.5 + dval(eps)) goto bump_up; + else if (!isinf(x = d_ * tens[ilim-1] + 0.5) && + dval(d) > modf(x, &x)) + goto bump_up; else if (dval(d) < 0.5 - dval(eps)) { while (*--s == '0') ; s++; |