ruby-changes:2543
From: ko1@a...
Date: 28 Nov 2007 02:42:30 +0900
Subject: [ruby-changes:2543] nobu - Ruby:r14034 (trunk): * bignum.c (big2str_find_n1): removed extraneous element.
nobu 2007-11-28 02:42:12 +0900 (Wed, 28 Nov 2007) New Revision: 14034 Modified files: trunk/ChangeLog trunk/bignum.c trunk/sprintf.c Log: * bignum.c (big2str_find_n1): removed extraneous element. [ruby-dev:32351], [ruby-dev:32365] * bignum.c (big2str_find_n1): returns necessary digits now. * sprintf.c (remove_sign_bits): extends sign bit first. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14034&r2=14033 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bignum.c?r1=14034&r2=14033 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/sprintf.c?r1=14034&r2=14033 Index: ChangeLog =================================================================== --- ChangeLog (revision 14033) +++ ChangeLog (revision 14034) @@ -1,3 +1,12 @@ +Wed Nov 28 02:42:10 2007 Nobuyoshi Nakada <nobu@r...> + + * bignum.c (big2str_find_n1): removed extraneous element. + [ruby-dev:32351], [ruby-dev:32365] + + * bignum.c (big2str_find_n1): returns necessary digits now. + + * sprintf.c (remove_sign_bits): extends sign bit first. + Tue Nov 27 15:53:43 2007 Koichi Sasada <ko1@a...> * compile.c (iseq_compile_each): "when *[],1" dumps core. @@ -61,11 +70,6 @@ * test/drb/test_drb.rb (TestDRbEval): ignored. -Mon Nov 26 18:38:00 2007 Yukihiro Matsumoto <matz@r...> - - * sprintf.c (rb_str_format): always trim preceding zeros. - [ruby-dev:32351] - Mon Nov 26 17:32:16 2007 Tanaka Akira <akr@f...> * re.c (Init_Regexp): new method Regexp#fixed_encoding? Index: sprintf.c =================================================================== --- sprintf.c (revision 14033) +++ sprintf.c (revision 14034) @@ -19,6 +19,8 @@ #include <stdarg.h> #define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */ +#define BITSPERDIG (SIZEOF_BDIGITS*CHAR_BIT) +#define EXTENDSIGN(n, l) (((~0 << (n)) >> (((n)*(l)) % BITSPERDIG)) & ~(~0 << (n))) static void fmt_setup(char*,int,int,int,int); @@ -35,7 +37,7 @@ } } else if (base == 8) { - if (*t == '3') t++; + *t |= EXTENDSIGN(3, strlen(t)); while (*t == '7') { t++; } @@ -662,7 +664,7 @@ val = rb_big_clone(val); rb_big_2comp(val); } - tmp1 = tmp = rb_big2str0(val, base, Qtrue); + tmp1 = tmp = rb_big2str0(val, base, RBIGNUM_SIGN(val)); s = RSTRING_PTR(tmp); if (*s == '-') { if (base == 10) { @@ -695,7 +697,7 @@ if (*p == 'X') { char *pp = s; int c; - while (c = (int)*pp) { + while ((c = (int)(unsigned char)*pp) != 0) { *pp = rb_enc_toupper(c, enc); pp++; } Index: bignum.c =================================================================== --- bignum.c (revision 14033) +++ bignum.c (revision 14034) @@ -786,18 +786,18 @@ big2str_find_n1(VALUE x, int base) { static const double log_2[] = { - 1.0, 1.58496250072116, 2.0, - 2.32192809488736, 2.584962500721, 2.58496250072116, - 2.8073549220576, 3.0, 3.16992500144231, - 3.32192809488736, 3.4594316186373, 3.58496250072116, - 3.70043971814109, 3.8073549220576, 3.90689059560852, - 4.0, 4.08746284125034, 4.16992500144231, - 4.24792751344359, 4.32192809488736, 4.39231742277876, - 4.4594316186373, 4.52356195605701, 4.58496250072116, - 4.64385618977472, 4.70043971814109, 4.75488750216347, - 4.8073549220576, 4.85798099512757, 4.90689059560852, - 4.95419631038688, 5.0, 5.04439411935845, - 5.08746284125034, 5.12928301694497, 5.16992500144231 + 1.0, 1.58496250072116, 2.0, + 2.32192809488736, 2.58496250072116, 2.8073549220576, + 3.0, 3.16992500144231, 3.32192809488736, + 3.4594316186373, 3.58496250072116, 3.70043971814109, + 3.8073549220576, 3.90689059560852, 4.0, + 4.08746284125034, 4.16992500144231, 4.24792751344359, + 4.32192809488736, 4.39231742277876, 4.4594316186373, + 4.52356195605701, 4.58496250072116, 4.64385618977472, + 4.70043971814109, 4.75488750216347, 4.8073549220576, + 4.85798099512757, 4.90689059560852, 4.95419631038688, + 5.0, 5.04439411935845, 5.08746284125034, + 5.12928301694497, 5.16992500144231 }; long bits; @@ -814,7 +814,7 @@ bits = BITSPERDIG*RBIGNUM_LEN(x); } - return (long)ceil(bits/(2*log_2[base - 2])); + return (long)ceil(bits/log_2[base - 2]); } static long @@ -898,7 +898,7 @@ { int off; VALUE ss, xx; - long n1, len, hbase; + long n1, n2, len, hbase; char* ptr; if (FIXNUM_P(x)) { @@ -911,8 +911,9 @@ if (base < 2 && 36 < base) rb_raise(rb_eArgError, "illegal radix %d", base); - n1 = big2str_find_n1(x, base); - ss = rb_str_new(0, 2*n1 + 1); /* plus one for sign */ + n2 = big2str_find_n1(x, base); + n1 = (n2 + 1) / 2; + ss = rb_str_new(0, n2 + 1); /* plus one for sign */ ptr = RSTRING_PTR(ss); ptr[0] = RBIGNUM_SIGN(x) ? '+' : '-'; @@ -924,11 +925,11 @@ xx = rb_big_clone(x); RBIGNUM_SET_SIGN(xx, 1); if (n1 <= KARATSUBA_DIGITS) { - len = off + big2str_orig(xx, base, ptr + off, 2*n1, hbase, trim); + len = off + big2str_orig(xx, base, ptr + off, n2, hbase, trim); } else { len = off + big2str_karatsuba(xx, base, ptr + off, n1, - 2*n1, hbase, trim); + n2, hbase, trim); } ptr[len] = '\0'; @@ -2442,7 +2443,7 @@ rb_big_odd_p(VALUE num) { if (BDIGITS(num)[0] & 1) { - return Qtrue; + return Qtrue; } return Qfalse; } @@ -2458,7 +2459,7 @@ rb_big_even_p(VALUE num) { if (BDIGITS(num)[0] & 1) { - return Qfalse; + return Qfalse; } return Qtrue; } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml