From 1301d1f5bccc10daf93c816ef4e177776d0668de Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 14 Jan 2016 07:12:42 +0000 Subject: [PATCH] sprintf.c: exact number * sprintf.c (rb_str_format): format exact number more exactly. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53533 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ sprintf.c | 12 +++++++++--- test/ruby/test_sprintf.rb | 5 +++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 51416fcd25..15ce86f766 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Thu Jan 14 16:12:09 2016 Nobuyoshi Nakada + + * sprintf.c (rb_str_format): format exact number more exactly. + Thu Jan 14 15:08:43 2016 Tony Arcieri * Remove 512-bit DH group. It's affected by LogJam Attack. diff --git a/sprintf.c b/sprintf.c index 84d5fd112b..1984cec805 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 714ef8b4e2..e196e7cfbd 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))