[前][次][番号順一覧][スレッド一覧]

ruby-changes:19744

From: yugui <ko1@a...>
Date: Mon, 30 May 2011 07:53:01 +0900 (JST)
Subject: [ruby-changes:19744] yugui:r31790 (ruby_1_9_2): merges r31158 from trunk into ruby_1_9_2.

yugui	2011-05-30 07:48:15 +0900 (Mon, 30 May 2011)

  New Revision: 31790

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31790

  Log:
    merges r31158 from trunk into ruby_1_9_2.
    --
    * numeric.c (flo_round): fix inaccurate results.

  Modified files:
    branches/ruby_1_9_2/ChangeLog
    branches/ruby_1_9_2/include/ruby/intern.h
    branches/ruby_1_9_2/numeric.c
    branches/ruby_1_9_2/test/ruby/test_float.rb
    branches/ruby_1_9_2/version.h

Index: ruby_1_9_2/include/ruby/intern.h
===================================================================
--- ruby_1_9_2/include/ruby/intern.h	(revision 31789)
+++ ruby_1_9_2/include/ruby/intern.h	(revision 31790)
@@ -114,6 +114,7 @@
 VALUE rb_big_minus(VALUE, VALUE);
 VALUE rb_big_mul(VALUE, VALUE);
 VALUE rb_big_div(VALUE, VALUE);
+VALUE rb_big_idiv(VALUE, VALUE);
 VALUE rb_big_modulo(VALUE, VALUE);
 VALUE rb_big_divmod(VALUE, VALUE);
 VALUE rb_big_pow(VALUE, VALUE);
Index: ruby_1_9_2/ChangeLog
===================================================================
--- ruby_1_9_2/ChangeLog	(revision 31789)
+++ ruby_1_9_2/ChangeLog	(revision 31790)
@@ -1,3 +1,7 @@
+Wed Mar 23 08:07:33 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* numeric.c (flo_round): fix inaccurate results.
+
 Wed Mar 23 00:12:16 2011  Tajima Akio <artonx@y...>
 
 	* win32/win32.c: wait process real termination after reading 
Index: ruby_1_9_2/numeric.c
===================================================================
--- ruby_1_9_2/numeric.c	(revision 31789)
+++ ruby_1_9_2/numeric.c	(revision 31790)
@@ -97,6 +97,9 @@
 }
 #endif
 
+static VALUE fix_mul(VALUE x, VALUE y);
+static VALUE int_pow(long x, unsigned long y);
+
 static ID id_coerce, id_to_i, id_eq;
 
 VALUE rb_cNumeric;
@@ -1450,7 +1453,15 @@
 	if (ndigits < 0) number = 0;
     }
     else {
-	if (ndigits < 0) number /= f;
+	if (ndigits < 0) {
+	    if (fabs(number) < f) return INT2FIX(0);
+	    if (!FIXABLE(number)) {
+		VALUE f10 = int_pow(10, -ndigits);
+		num = rb_big_idiv(rb_dbl2big(number), f10);
+		return FIXNUM_P(num) ? fix_mul(num, f10) : rb_big_mul(num, f10);
+	    }
+	    number /= f;
+	}
 	else number *= f;
 	number = round(number);
 	if (ndigits < 0) number *= f;
Index: ruby_1_9_2/version.h
===================================================================
--- ruby_1_9_2/version.h	(revision 31789)
+++ ruby_1_9_2/version.h	(revision 31790)
@@ -1,5 +1,5 @@
 #define RUBY_VERSION "1.9.2"
-#define RUBY_PATCHLEVEL 217
+#define RUBY_PATCHLEVEL 218
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 9
 #define RUBY_VERSION_TEENY 1
Index: ruby_1_9_2/test/ruby/test_float.rb
===================================================================
--- ruby_1_9_2/test/ruby/test_float.rb	(revision 31789)
+++ ruby_1_9_2/test/ruby/test_float.rb	(revision 31790)
@@ -295,6 +295,8 @@
     assert_equal(1.110, 1.111.round(2))
     assert_equal(11110.0, 11111.1.round(-1))
     assert_equal(11100.0, 11111.1.round(-2))
+
+    assert_equal(10**300, 1.1e300.round(-300))
   end
 
   VS = [

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]