1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14034 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2007-11-27 17:42:12 +00:00
parent 0cdd3bced5
commit 6eea7a7c71
3 changed files with 35 additions and 28 deletions

View file

@ -1,3 +1,12 @@
Wed Nov 28 02:42:10 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
* 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@atdot.net>
* compile.c (iseq_compile_each): "when *[],1" dumps core.
@ -61,11 +70,6 @@ Mon Nov 26 23:18:46 2007 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp>
* test/drb/test_drb.rb (TestDRbEval): ignored.
Mon Nov 26 18:38:00 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
* sprintf.c (rb_str_format): always trim preceding zeros.
[ruby-dev:32351]
Mon Nov 26 17:32:16 2007 Tanaka Akira <akr@fsij.org>
* re.c (Init_Regexp): new method Regexp#fixed_encoding?

View file

@ -786,18 +786,18 @@ static long
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 @@ big2str_find_n1(VALUE x, int base)
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 @@ rb_big2str0(VALUE x, int base, int trim)
{
int off;
VALUE ss, xx;
long n1, len, hbase;
long n1, n2, len, hbase;
char* ptr;
if (FIXNUM_P(x)) {
@ -911,8 +911,9 @@ rb_big2str0(VALUE x, int base, int trim)
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 @@ rb_big2str0(VALUE x, int base, int trim)
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 @@ static VALUE
rb_big_odd_p(VALUE num)
{
if (BDIGITS(num)[0] & 1) {
return Qtrue;
return Qtrue;
}
return Qfalse;
}
@ -2458,7 +2459,7 @@ static VALUE
rb_big_even_p(VALUE num)
{
if (BDIGITS(num)[0] & 1) {
return Qfalse;
return Qfalse;
}
return Qtrue;
}

View file

@ -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 @@ remove_sign_bits(char *str, int base)
}
}
else if (base == 8) {
if (*t == '3') t++;
*t |= EXTENDSIGN(3, strlen(t));
while (*t == '7') {
t++;
}
@ -662,7 +664,7 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
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 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
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++;
}