bignum.c, math.c: type predicates
* bignum.c, math.c: use type predicate macros instead of TYPE(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42873 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a77ae1eced
commit
c26293dccf
224
bignum.c
224
bignum.c
@ -5391,18 +5391,15 @@ rb_big_cmp(VALUE x, VALUE y)
|
|||||||
{
|
{
|
||||||
int cmp;
|
int cmp;
|
||||||
|
|
||||||
switch (TYPE(y)) {
|
if (FIXNUM_P(y)) {
|
||||||
case T_FIXNUM:
|
|
||||||
y = rb_int2big(FIX2LONG(y));
|
y = rb_int2big(FIX2LONG(y));
|
||||||
break;
|
}
|
||||||
|
else if (RB_TYPE_P(y, T_BIGNUM)) {
|
||||||
case T_BIGNUM:
|
}
|
||||||
break;
|
else if (RB_FLOAT_TYPE_P(y)) {
|
||||||
|
|
||||||
case T_FLOAT:
|
|
||||||
return rb_integer_float_cmp(x, y);
|
return rb_integer_float_cmp(x, y);
|
||||||
|
}
|
||||||
default:
|
else {
|
||||||
return rb_num_coerce_cmp(x, y, rb_intern("<=>"));
|
return rb_num_coerce_cmp(x, y, rb_intern("<=>"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5429,27 +5426,21 @@ big_op(VALUE x, VALUE y, enum big_op_t op)
|
|||||||
VALUE rel;
|
VALUE rel;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
switch (TYPE(y)) {
|
if (FIXNUM_P(y) || RB_TYPE_P(y, T_BIGNUM)) {
|
||||||
case T_FIXNUM:
|
|
||||||
case T_BIGNUM:
|
|
||||||
rel = rb_big_cmp(x, y);
|
rel = rb_big_cmp(x, y);
|
||||||
break;
|
}
|
||||||
|
else if (RB_FLOAT_TYPE_P(y)) {
|
||||||
case T_FLOAT:
|
|
||||||
rel = rb_integer_float_cmp(x, y);
|
rel = rb_integer_float_cmp(x, y);
|
||||||
break;
|
}
|
||||||
|
else {
|
||||||
default:
|
ID id = 0;
|
||||||
{
|
switch (op) {
|
||||||
ID id = 0;
|
case big_op_gt: id = '>'; break;
|
||||||
switch (op) {
|
case big_op_ge: id = rb_intern(">="); break;
|
||||||
case big_op_gt: id = '>'; break;
|
case big_op_lt: id = '<'; break;
|
||||||
case big_op_ge: id = rb_intern(">="); break;
|
case big_op_le: id = rb_intern("<="); break;
|
||||||
case big_op_lt: id = '<'; break;
|
|
||||||
case big_op_le: id = rb_intern("<="); break;
|
|
||||||
}
|
|
||||||
return rb_num_coerce_relop(x, y, id);
|
|
||||||
}
|
}
|
||||||
|
return rb_num_coerce_relop(x, y, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NIL_P(rel)) return Qfalse;
|
if (NIL_P(rel)) return Qfalse;
|
||||||
@ -5534,16 +5525,16 @@ big_le(VALUE x, VALUE y)
|
|||||||
VALUE
|
VALUE
|
||||||
rb_big_eq(VALUE x, VALUE y)
|
rb_big_eq(VALUE x, VALUE y)
|
||||||
{
|
{
|
||||||
switch (TYPE(y)) {
|
if (FIXNUM_P(y)) {
|
||||||
case T_FIXNUM:
|
|
||||||
if (bignorm(x) == y) return Qtrue;
|
if (bignorm(x) == y) return Qtrue;
|
||||||
y = rb_int2big(FIX2LONG(y));
|
y = rb_int2big(FIX2LONG(y));
|
||||||
break;
|
}
|
||||||
case T_BIGNUM:
|
else if (RB_TYPE_P(y, T_BIGNUM)) {
|
||||||
break;
|
}
|
||||||
case T_FLOAT:
|
else if (RB_FLOAT_TYPE_P(y)) {
|
||||||
return rb_integer_float_eq(x, y);
|
return rb_integer_float_eq(x, y);
|
||||||
default:
|
}
|
||||||
|
else {
|
||||||
return rb_equal(y, x);
|
return rb_equal(y, x);
|
||||||
}
|
}
|
||||||
if (RBIGNUM_SIGN(x) != RBIGNUM_SIGN(y)) return Qfalse;
|
if (RBIGNUM_SIGN(x) != RBIGNUM_SIGN(y)) return Qfalse;
|
||||||
@ -5874,8 +5865,7 @@ rb_big_plus(VALUE x, VALUE y)
|
|||||||
{
|
{
|
||||||
long n;
|
long n;
|
||||||
|
|
||||||
switch (TYPE(y)) {
|
if (FIXNUM_P(y)) {
|
||||||
case T_FIXNUM:
|
|
||||||
n = FIX2LONG(y);
|
n = FIX2LONG(y);
|
||||||
if ((n > 0) != RBIGNUM_SIGN(x)) {
|
if ((n > 0) != RBIGNUM_SIGN(x)) {
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
@ -5887,14 +5877,14 @@ rb_big_plus(VALUE x, VALUE y)
|
|||||||
n = -n;
|
n = -n;
|
||||||
}
|
}
|
||||||
return bigadd_int(x, n);
|
return bigadd_int(x, n);
|
||||||
|
}
|
||||||
case T_BIGNUM:
|
else if (RB_TYPE_P(y, T_BIGNUM)) {
|
||||||
return bignorm(bigadd(x, y, 1));
|
return bignorm(bigadd(x, y, 1));
|
||||||
|
}
|
||||||
case T_FLOAT:
|
else if (RB_FLOAT_TYPE_P(y)) {
|
||||||
return DBL2NUM(rb_big2dbl(x) + RFLOAT_VALUE(y));
|
return DBL2NUM(rb_big2dbl(x) + RFLOAT_VALUE(y));
|
||||||
|
}
|
||||||
default:
|
else {
|
||||||
return rb_num_coerce_bin(x, y, '+');
|
return rb_num_coerce_bin(x, y, '+');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5911,8 +5901,7 @@ rb_big_minus(VALUE x, VALUE y)
|
|||||||
{
|
{
|
||||||
long n;
|
long n;
|
||||||
|
|
||||||
switch (TYPE(y)) {
|
if (FIXNUM_P(y)) {
|
||||||
case T_FIXNUM:
|
|
||||||
n = FIX2LONG(y);
|
n = FIX2LONG(y);
|
||||||
if ((n > 0) != RBIGNUM_SIGN(x)) {
|
if ((n > 0) != RBIGNUM_SIGN(x)) {
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
@ -5924,14 +5913,14 @@ rb_big_minus(VALUE x, VALUE y)
|
|||||||
n = -n;
|
n = -n;
|
||||||
}
|
}
|
||||||
return bigsub_int(x, n);
|
return bigsub_int(x, n);
|
||||||
|
}
|
||||||
case T_BIGNUM:
|
else if (RB_TYPE_P(y, T_BIGNUM)) {
|
||||||
return bignorm(bigadd(x, y, 0));
|
return bignorm(bigadd(x, y, 0));
|
||||||
|
}
|
||||||
case T_FLOAT:
|
else if (RB_FLOAT_TYPE_P(y)) {
|
||||||
return DBL2NUM(rb_big2dbl(x) - RFLOAT_VALUE(y));
|
return DBL2NUM(rb_big2dbl(x) - RFLOAT_VALUE(y));
|
||||||
|
}
|
||||||
default:
|
else {
|
||||||
return rb_num_coerce_bin(x, y, '-');
|
return rb_num_coerce_bin(x, y, '-');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6004,18 +5993,15 @@ bigmul0(VALUE x, VALUE y)
|
|||||||
VALUE
|
VALUE
|
||||||
rb_big_mul(VALUE x, VALUE y)
|
rb_big_mul(VALUE x, VALUE y)
|
||||||
{
|
{
|
||||||
switch (TYPE(y)) {
|
if (FIXNUM_P(y)) {
|
||||||
case T_FIXNUM:
|
|
||||||
y = rb_int2big(FIX2LONG(y));
|
y = rb_int2big(FIX2LONG(y));
|
||||||
break;
|
}
|
||||||
|
else if (RB_TYPE_P(y, T_BIGNUM)) {
|
||||||
case T_BIGNUM:
|
}
|
||||||
break;
|
else if (RB_FLOAT_TYPE_P(y)) {
|
||||||
|
|
||||||
case T_FLOAT:
|
|
||||||
return DBL2NUM(rb_big2dbl(x) * RFLOAT_VALUE(y));
|
return DBL2NUM(rb_big2dbl(x) * RFLOAT_VALUE(y));
|
||||||
|
}
|
||||||
default:
|
else {
|
||||||
return rb_num_coerce_bin(x, y, '*');
|
return rb_num_coerce_bin(x, y, '*');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6136,27 +6122,22 @@ rb_big_divide(VALUE x, VALUE y, ID op)
|
|||||||
{
|
{
|
||||||
VALUE z;
|
VALUE z;
|
||||||
|
|
||||||
switch (TYPE(y)) {
|
if (FIXNUM_P(y)) {
|
||||||
case T_FIXNUM:
|
|
||||||
y = rb_int2big(FIX2LONG(y));
|
y = rb_int2big(FIX2LONG(y));
|
||||||
break;
|
}
|
||||||
|
else if (RB_TYPE_P(y, T_BIGNUM)) {
|
||||||
case T_BIGNUM:
|
}
|
||||||
break;
|
else if (RB_FLOAT_TYPE_P(y)) {
|
||||||
|
if (op == '/') {
|
||||||
case T_FLOAT:
|
return DBL2NUM(rb_big2dbl(x) / RFLOAT_VALUE(y));
|
||||||
{
|
|
||||||
if (op == '/') {
|
|
||||||
return DBL2NUM(rb_big2dbl(x) / RFLOAT_VALUE(y));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
double dy = RFLOAT_VALUE(y);
|
|
||||||
if (dy == 0.0) rb_num_zerodiv();
|
|
||||||
return rb_dbl2big(rb_big2dbl(x) / dy);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
default:
|
double dy = RFLOAT_VALUE(y);
|
||||||
|
if (dy == 0.0) rb_num_zerodiv();
|
||||||
|
return rb_dbl2big(rb_big2dbl(x) / dy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
return rb_num_coerce_bin(x, y, op);
|
return rb_num_coerce_bin(x, y, op);
|
||||||
}
|
}
|
||||||
bigdivmod(x, y, &z, 0);
|
bigdivmod(x, y, &z, 0);
|
||||||
@ -6206,15 +6187,10 @@ rb_big_modulo(VALUE x, VALUE y)
|
|||||||
{
|
{
|
||||||
VALUE z;
|
VALUE z;
|
||||||
|
|
||||||
switch (TYPE(y)) {
|
if (FIXNUM_P(y)) {
|
||||||
case T_FIXNUM:
|
|
||||||
y = rb_int2big(FIX2LONG(y));
|
y = rb_int2big(FIX2LONG(y));
|
||||||
break;
|
}
|
||||||
|
else if (!RB_TYPE_P(y, T_BIGNUM)) {
|
||||||
case T_BIGNUM:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return rb_num_coerce_bin(x, y, '%');
|
return rb_num_coerce_bin(x, y, '%');
|
||||||
}
|
}
|
||||||
bigdivmod(x, y, 0, &z);
|
bigdivmod(x, y, 0, &z);
|
||||||
@ -6236,15 +6212,10 @@ rb_big_remainder(VALUE x, VALUE y)
|
|||||||
{
|
{
|
||||||
VALUE z;
|
VALUE z;
|
||||||
|
|
||||||
switch (TYPE(y)) {
|
if (FIXNUM_P(y)) {
|
||||||
case T_FIXNUM:
|
|
||||||
y = rb_int2big(FIX2LONG(y));
|
y = rb_int2big(FIX2LONG(y));
|
||||||
break;
|
}
|
||||||
|
else if (!RB_TYPE_P(y, T_BIGNUM)) {
|
||||||
case T_BIGNUM:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return rb_num_coerce_bin(x, y, rb_intern("remainder"));
|
return rb_num_coerce_bin(x, y, rb_intern("remainder"));
|
||||||
}
|
}
|
||||||
bigdivrem(x, y, 0, &z);
|
bigdivrem(x, y, 0, &z);
|
||||||
@ -6264,15 +6235,10 @@ rb_big_divmod(VALUE x, VALUE y)
|
|||||||
{
|
{
|
||||||
VALUE div, mod;
|
VALUE div, mod;
|
||||||
|
|
||||||
switch (TYPE(y)) {
|
if (FIXNUM_P(y)) {
|
||||||
case T_FIXNUM:
|
|
||||||
y = rb_int2big(FIX2LONG(y));
|
y = rb_int2big(FIX2LONG(y));
|
||||||
break;
|
}
|
||||||
|
else if (!RB_TYPE_P(y, T_BIGNUM)) {
|
||||||
case T_BIGNUM:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return rb_num_coerce_bin(x, y, rb_intern("divmod"));
|
return rb_num_coerce_bin(x, y, rb_intern("divmod"));
|
||||||
}
|
}
|
||||||
bigdivmod(x, y, &div, &mod);
|
bigdivmod(x, y, &div, &mod);
|
||||||
@ -6354,28 +6320,24 @@ rb_big_fdiv(VALUE x, VALUE y)
|
|||||||
double dx, dy;
|
double dx, dy;
|
||||||
|
|
||||||
dx = big2dbl(x);
|
dx = big2dbl(x);
|
||||||
switch (TYPE(y)) {
|
if (FIXNUM_P(y)) {
|
||||||
case T_FIXNUM:
|
|
||||||
dy = (double)FIX2LONG(y);
|
dy = (double)FIX2LONG(y);
|
||||||
if (isinf(dx))
|
if (isinf(dx))
|
||||||
return big_fdiv_int(x, rb_int2big(FIX2LONG(y)));
|
return big_fdiv_int(x, rb_int2big(FIX2LONG(y)));
|
||||||
break;
|
}
|
||||||
|
else if (RB_TYPE_P(y, T_BIGNUM)) {
|
||||||
case T_BIGNUM:
|
|
||||||
dy = rb_big2dbl(y);
|
dy = rb_big2dbl(y);
|
||||||
if (isinf(dx) || isinf(dy))
|
if (isinf(dx) || isinf(dy))
|
||||||
return big_fdiv_int(x, y);
|
return big_fdiv_int(x, y);
|
||||||
break;
|
}
|
||||||
|
else if (RB_FLOAT_TYPE_P(y)) {
|
||||||
case T_FLOAT:
|
|
||||||
dy = RFLOAT_VALUE(y);
|
dy = RFLOAT_VALUE(y);
|
||||||
if (isnan(dy))
|
if (isnan(dy))
|
||||||
return y;
|
return y;
|
||||||
if (isinf(dx))
|
if (isinf(dx))
|
||||||
return big_fdiv_float(x, y);
|
return big_fdiv_float(x, y);
|
||||||
break;
|
}
|
||||||
|
else {
|
||||||
default:
|
|
||||||
return rb_num_coerce_bin(x, y, rb_intern("fdiv"));
|
return rb_num_coerce_bin(x, y, rb_intern("fdiv"));
|
||||||
}
|
}
|
||||||
return DBL2NUM(dx / dy);
|
return DBL2NUM(dx / dy);
|
||||||
@ -6402,22 +6364,19 @@ rb_big_pow(VALUE x, VALUE y)
|
|||||||
|
|
||||||
again:
|
again:
|
||||||
if (y == INT2FIX(0)) return INT2FIX(1);
|
if (y == INT2FIX(0)) return INT2FIX(1);
|
||||||
switch (TYPE(y)) {
|
if (RB_FLOAT_TYPE_P(y)) {
|
||||||
case T_FLOAT:
|
|
||||||
d = RFLOAT_VALUE(y);
|
d = RFLOAT_VALUE(y);
|
||||||
if ((!RBIGNUM_SIGN(x) && !BIGZEROP(x)) && d != round(d))
|
if ((!RBIGNUM_SIGN(x) && !BIGZEROP(x)) && d != round(d))
|
||||||
return rb_funcall(rb_complex_raw1(x), rb_intern("**"), 1, y);
|
return rb_funcall(rb_complex_raw1(x), rb_intern("**"), 1, y);
|
||||||
break;
|
}
|
||||||
|
else if (RB_TYPE_P(y, T_BIGNUM)) {
|
||||||
case T_BIGNUM:
|
|
||||||
y = bignorm(y);
|
y = bignorm(y);
|
||||||
if (FIXNUM_P(y))
|
if (FIXNUM_P(y))
|
||||||
goto again;
|
goto again;
|
||||||
rb_warn("in a**b, b may be too big");
|
rb_warn("in a**b, b may be too big");
|
||||||
d = rb_big2dbl(y);
|
d = rb_big2dbl(y);
|
||||||
break;
|
}
|
||||||
|
else if (FIXNUM_P(y)) {
|
||||||
case T_FIXNUM:
|
|
||||||
yy = FIX2LONG(y);
|
yy = FIX2LONG(y);
|
||||||
|
|
||||||
if (yy < 0)
|
if (yy < 0)
|
||||||
@ -6433,20 +6392,19 @@ rb_big_pow(VALUE x, VALUE y)
|
|||||||
(xbits * yy > BIGLEN_LIMIT)) {
|
(xbits * yy > BIGLEN_LIMIT)) {
|
||||||
rb_warn("in a**b, b may be too big");
|
rb_warn("in a**b, b may be too big");
|
||||||
d = (double)yy;
|
d = (double)yy;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
for (mask = FIXNUM_MAX + 1; mask; mask >>= 1) {
|
else {
|
||||||
if (z) z = bigsq(z);
|
for (mask = FIXNUM_MAX + 1; mask; mask >>= 1) {
|
||||||
if (yy & mask) {
|
if (z) z = bigsq(z);
|
||||||
z = z ? bigtrunc(bigmul0(z, x)) : x;
|
if (yy & mask) {
|
||||||
|
z = z ? bigtrunc(bigmul0(z, x)) : x;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return bignorm(z);
|
||||||
}
|
}
|
||||||
return bignorm(z);
|
|
||||||
}
|
}
|
||||||
/* NOTREACHED */
|
}
|
||||||
break;
|
else {
|
||||||
|
|
||||||
default:
|
|
||||||
return rb_num_coerce_bin(x, y, rb_intern("**"));
|
return rb_num_coerce_bin(x, y, rb_intern("**"));
|
||||||
}
|
}
|
||||||
return DBL2NUM(pow(rb_big2dbl(x), d));
|
return DBL2NUM(pow(rb_big2dbl(x), d));
|
||||||
|
6
math.c
6
math.c
@ -444,7 +444,7 @@ math_log(int argc, VALUE *argv)
|
|||||||
|
|
||||||
rb_scan_args(argc, argv, "11", &x, &base);
|
rb_scan_args(argc, argv, "11", &x, &base);
|
||||||
|
|
||||||
if (TYPE(x) == T_BIGNUM && RBIGNUM_POSITIVE_P(x) &&
|
if (RB_TYPE_P(x, T_BIGNUM) && RBIGNUM_POSITIVE_P(x) &&
|
||||||
DBL_MAX_EXP <= (numbits = rb_absint_numwords(x, 1, NULL))) {
|
DBL_MAX_EXP <= (numbits = rb_absint_numwords(x, 1, NULL))) {
|
||||||
numbits -= DBL_MANT_DIG;
|
numbits -= DBL_MANT_DIG;
|
||||||
x = rb_big_rshift(x, SIZET2NUM(numbits));
|
x = rb_big_rshift(x, SIZET2NUM(numbits));
|
||||||
@ -501,7 +501,7 @@ math_log2(VALUE obj, VALUE x)
|
|||||||
double d0, d;
|
double d0, d;
|
||||||
size_t numbits = 0;
|
size_t numbits = 0;
|
||||||
|
|
||||||
if (TYPE(x) == T_BIGNUM && RBIGNUM_POSITIVE_P(x) &&
|
if (RB_TYPE_P(x, T_BIGNUM) && RBIGNUM_POSITIVE_P(x) &&
|
||||||
DBL_MAX_EXP <= (numbits = rb_absint_numwords(x, 1, NULL))) {
|
DBL_MAX_EXP <= (numbits = rb_absint_numwords(x, 1, NULL))) {
|
||||||
numbits -= DBL_MANT_DIG;
|
numbits -= DBL_MANT_DIG;
|
||||||
x = rb_big_rshift(x, SIZET2NUM(numbits));
|
x = rb_big_rshift(x, SIZET2NUM(numbits));
|
||||||
@ -540,7 +540,7 @@ math_log10(VALUE obj, VALUE x)
|
|||||||
double d0, d;
|
double d0, d;
|
||||||
size_t numbits = 0;
|
size_t numbits = 0;
|
||||||
|
|
||||||
if (TYPE(x) == T_BIGNUM && RBIGNUM_POSITIVE_P(x) &&
|
if (RB_TYPE_P(x, T_BIGNUM) && RBIGNUM_POSITIVE_P(x) &&
|
||||||
DBL_MAX_EXP <= (numbits = rb_absint_numwords(x, 1, NULL))) {
|
DBL_MAX_EXP <= (numbits = rb_absint_numwords(x, 1, NULL))) {
|
||||||
numbits -= DBL_MANT_DIG;
|
numbits -= DBL_MANT_DIG;
|
||||||
x = rb_big_rshift(x, SIZET2NUM(numbits));
|
x = rb_big_rshift(x, SIZET2NUM(numbits));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user