diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-11-11 22:37:54 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-11-11 22:37:54 +0000 |
commit | 972c6abfca5e0a323d6c35b5aeadde814fb6036f (patch) | |
tree | d70061c4ffb2b9e060985fb93fe16465ef4348b2 | |
parent | a240b37c74876507f8ed8d0cd122bf4b42825bb3 (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_2@56728 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | sprintf.c | 12 | ||||
-rw-r--r-- | test/ruby/test_sprintf.rb | 5 | ||||
-rw-r--r-- | version.h | 2 |
4 files changed, 19 insertions, 4 deletions
@@ -1,3 +1,7 @@ +Sat Nov 12 07:37:30 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * sprintf.c (rb_str_format): format exact number more exactly. + Sat Nov 12 07:34:03 2016 Kazuki Yamaguchi <k@rhe.jp> * ext/openssl/ossl.c (Init_openssl): register an ex_data index for @@ -1024,13 +1024,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 ff4f9a5631..d429ef0ddc 100644 --- a/test/ruby/test_sprintf.rb +++ b/test/ruby/test_sprintf.rb @@ -148,6 +148,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)) @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.2.6" #define RUBY_RELEASE_DATE "2016-11-12" -#define RUBY_PATCHLEVEL 386 +#define RUBY_PATCHLEVEL 387 #define RUBY_RELEASE_YEAR 2016 #define RUBY_RELEASE_MONTH 11 |