aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-07-10 05:27:27 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-07-10 05:27:27 +0000
commit3f866a267744c8fcc48a78bc70da7b0cc6872b27 (patch)
treeb8f7a15df7947c84aefedad4af07460dc5399b7a
parent852290b2fbd45fc7715915b75bca8ee6e5b1bbda (diff)
downloadruby-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--ChangeLog6
-rw-r--r--test/ruby/test_sprintf.rb4
-rw-r--r--util.c4
3 files changed, 14 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 8269e6d74b..bf613e88d0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/util.c b/util.c
index 8c428b57f0..0b0c935832 100644
--- a/util.c
+++ b/util.c
@@ -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++;