正木です。

[ruby-math:00906] での bitsize と[ruby-math:00905] での 
int_sqrt の code を以下のように修正します。

試しにこれを bignum.c に追加して使っていますが、私の環境
(Linux i686) では今のところ期待通り動いているようです。

-------

static int
int_bitsize(i)
    int i;
{
    if (i < 0) rb_raise(rb_eTypeError,"argument is negative");
    int k = 0;
    while (i >> k++);
    return k - 1;
}


static VALUE
rb_bitsize(x)
    VALUE x;
{
    int i;

    if (FIXNUM_P(x)) return INT2FIX(int_bitsize(FIX2INT(x))); 
    if (!RBIGNUM(x)->sign)  rb_raise(rb_eTypeError,"argument is negative");
    i = FIX2INT(rb_big_size(x)) * CHAR_BIT - 1;
    while (FIX2INT(rb_big_aref(x,INT2FIX(i))) == 0) i -= 1;
    return INT2FIX(i + 1);
}



static int
int_sqrt(i)
    int i;
{
    int j, k;
    if (i < 0) rb_raise(rb_eTypeError,"argument is negative");
    if (i == 0) return 0;
    j = int_sqrt(i >> 2) << 1;
    k = j | 1;
    if (k * k > i) return j;
    return k;
}


static VALUE
rb_int_sqrt(x)
    VALUE x;
{
    int j, k;
    VALUE n, m, m2, y;
    if (FIXNUM_P(x)) return INT2FIX(int_sqrt(FIX2INT(x))); 
    if (!RBIGNUM(x)->sign)  rb_raise(rb_eTypeError,"argument is negative");
    y = rb_int_sqrt(rb_big_rshift(x,INT2FIX(2)));
    if (FIXNUM_P(y)) {
	j = FIX2INT(y) << 1;
	k = j | 1;
	n = INT2NUM(j);
	m = INT2NUM(k);
	m2 = rb_big_mul(rb_int2big(k), rb_int2big(k));
    }
    else {
        n = rb_big_lshift(y,INT2FIX(1));
	m = rb_big_or(n,INT2FIX(1));
	m2 = rb_big_mul(m,m);
    }
    if (FIX2INT(rb_big_cmp(x,m2)) == -1) return n;
    return m;
}

    rb_define_method(rb_cInteger,"bitsize",rb_bitsize,0);
    rb_define_method(rb_cInteger,"isqrt",rb_int_sqrt,0);