summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-05 02:52:31 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-05 02:52:31 +0000
commit5b52d585f492bf9929738c27241c028aefebbf2c (patch)
treeb09c5601852a60ddabe9dd6ac2fb5037fae54dc0
parent93bceb14a426f4c2266a47b50cd5ff79d5f5a1c8 (diff)
merge revision(s) 53533: [Backport #12895]
* sprintf.c (rb_str_format): format exact number more exactly. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@56567 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog4
-rw-r--r--sprintf.c12
-rw-r--r--test/ruby/test_sprintf.rb5
-rw-r--r--version.h2
4 files changed, 19 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index b0f9d048d3..e09a4056cb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Sat Nov 5 11:49:41 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * sprintf.c (rb_str_format): format exact number more exactly.
+
Sat Nov 5 11:45:32 2016 Kazuki Yamaguchi <k@rhe.jp>
* ext/openssl/ossl.c (Init_openssl): register an ex_data index for
diff --git a/sprintf.c b/sprintf.c
index a93ba8ffaf..b022c5decc 100644
--- a/sprintf.c
+++ b/sprintf.c
@@ -1036,13 +1036,19 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
int sign = (flags&FPLUS) ? 1 : 0, zero = 0;
long len, done = 0;
int prefix = 0;
- if (!RB_TYPE_P(val, T_RATIONAL)) {
+ if (FIXNUM_P(val) || RB_TYPE_P(val, T_BIGNUM)) {
+ den = INT2FIX(1);
+ num = val;
+ }
+ else if (RB_TYPE_P(val, T_RATIONAL)) {
+ den = rb_rational_den(val);
+ num = rb_rational_num(val);
+ }
+ else {
nextvalue = val;
goto float_value;
}
if (!(flags&FPREC)) prec = default_float_precision;
- den = rb_rational_den(val);
- num = rb_rational_num(val);
if (FIXNUM_P(num)) {
if ((SIGNED_VALUE)num < 0) {
long n = -FIX2LONG(num);
diff --git a/test/ruby/test_sprintf.rb b/test/ruby/test_sprintf.rb
index 66ae4db853..8aa0cbfea5 100644
--- a/test/ruby/test_sprintf.rb
+++ b/test/ruby/test_sprintf.rb
@@ -149,6 +149,11 @@ class TestSprintf < Test::Unit::TestCase
assert_equal(" Inf", sprintf("% e", inf), '[ruby-dev:34002]')
end
+ def test_bignum
+ assert_match(/\A10{120}\.0+\z/, sprintf("%f", 100**60))
+ assert_match(/\A10{180}\.0+\z/, sprintf("%f", 1000**60))
+ end
+
def test_rational
assert_match(/\A0\.10+\z/, sprintf("%.60f", 0.1r))
assert_match(/\A0\.010+\z/, sprintf("%.60f", 0.01r))
diff --git a/version.h b/version.h
index 9f1145caac..4a49f20a95 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.3.2"
#define RUBY_RELEASE_DATE "2016-11-05"
-#define RUBY_PATCHLEVEL 203
+#define RUBY_PATCHLEVEL 204
#define RUBY_RELEASE_YEAR 2016
#define RUBY_RELEASE_MONTH 11