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

This commit was generated by cvs2svn to compensate for changes in r11,

which included commits to RCS files with non-trunk default branches.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 1998-01-16 12:19:22 +00:00
parent 62e41d3f2e
commit 7ea2ceddb8
79 changed files with 8922 additions and 8253 deletions

176
numeric.c
View file

@ -12,11 +12,6 @@
#include "ruby.h"
#include <math.h>
#if defined (HAVE_STRING_H)
# include <string.h>
#else
# include <strings.h>
#endif
static ID coerce;
static ID to_i;
@ -42,7 +37,7 @@ static VALUE
num_coerce(x, y)
VALUE x, y;
{
return assoc_new(f_float(x,x),f_float(y,y));
return assoc_new(rb_Float(x),rb_Float(y));
}
VALUE
@ -116,7 +111,7 @@ num_chr(num)
VALUE num;
{
char c;
int i = NUM2INT(num);
INT i = NUM2INT(num);
if (i < 0 || 0xff < i)
Fail("%d out of char range", i);
@ -147,11 +142,11 @@ float_new(d)
static VALUE
flo_to_s(flt)
struct RFloat *flt;
VALUE flt;
{
char buf[32];
sprintf(buf, "%g", flt->value);
sprintf(buf, "%g", RFLOAT(flt)->value);
if (strchr(buf, '.') == 0) {
int len = strlen(buf);
char *ind = strchr(buf, 'e');
@ -172,27 +167,27 @@ static VALUE
flo_coerce(x, y)
VALUE x, y;
{
return assoc_new(f_float(x, y), x);
return assoc_new(rb_Float(y), x);
}
static VALUE
flo_uminus(flt)
struct RFloat *flt;
VALUE flt;
{
return float_new(-flt->value);
return float_new(-RFLOAT(flt)->value);
}
static VALUE
flo_plus(x, y)
struct RFloat *x, *y;
VALUE x, y;
{
switch (TYPE(y)) {
case T_FIXNUM:
return float_new(x->value + (double)FIX2INT(y));
return float_new(RFLOAT(x)->value + (double)FIX2INT(y));
case T_BIGNUM:
return float_new(x->value + big2dbl(y));
return float_new(RFLOAT(x)->value + big2dbl(y));
case T_FLOAT:
return float_new(x->value + y->value);
return float_new(RFLOAT(x)->value + RFLOAT(y)->value);
case T_STRING:
return str_plus(obj_as_string(x), y);
default:
@ -202,15 +197,15 @@ flo_plus(x, y)
static VALUE
flo_minus(x, y)
struct RFloat *x, *y;
VALUE x, y;
{
switch (TYPE(y)) {
case T_FIXNUM:
return float_new(x->value - (double)FIX2INT(y));
return float_new(RFLOAT(x)->value - (double)FIX2INT(y));
case T_BIGNUM:
return float_new(x->value - big2dbl(y));
return float_new(RFLOAT(x)->value - big2dbl(y));
case T_FLOAT:
return float_new(x->value - y->value);
return float_new(RFLOAT(x)->value - RFLOAT(y)->value);
default:
return num_coerce_bin(x, y);
}
@ -218,17 +213,17 @@ flo_minus(x, y)
static VALUE
flo_mul(x, y)
struct RFloat *x, *y;
VALUE x, y;
{
switch (TYPE(y)) {
case T_FIXNUM:
return float_new(x->value * (double)FIX2INT(y));
return float_new(RFLOAT(x)->value * (double)FIX2INT(y));
case T_BIGNUM:
return float_new(x->value * big2dbl(y));
return float_new(RFLOAT(x)->value * big2dbl(y));
case T_FLOAT:
return float_new(x->value * y->value);
return float_new(RFLOAT(x)->value * RFLOAT(y)->value);
case T_STRING:
return str_times(y, INT2FIX((int)x->value));
return str_times(y, INT2FIX((int)RFLOAT(x)->value));
default:
return num_coerce_bin(x, y);
}
@ -236,23 +231,23 @@ flo_mul(x, y)
static VALUE
flo_div(x, y)
struct RFloat *x, *y;
VALUE x, y;
{
int f_y;
INT f_y;
double d;
switch (TYPE(y)) {
case T_FIXNUM:
f_y = FIX2INT(y);
if (f_y == 0) num_zerodiv();
return float_new(x->value / (double)f_y);
return float_new(RFLOAT(x)->value / (double)f_y);
case T_BIGNUM:
d = big2dbl(y);
if (d == 0.0) num_zerodiv();
return float_new(x->value / d);
return float_new(RFLOAT(x)->value / d);
case T_FLOAT:
if (y->value == 0.0) num_zerodiv();
return float_new(x->value / y->value);
if (RFLOAT(y)->value == 0.0) num_zerodiv();
return float_new(RFLOAT(x)->value / RFLOAT(y)->value);
default:
return num_coerce_bin(x, y);
}
@ -260,7 +255,7 @@ flo_div(x, y)
static VALUE
flo_mod(x, y)
struct RFloat *x, *y;
VALUE x, y;
{
double value;
@ -272,16 +267,16 @@ flo_mod(x, y)
value = big2dbl(y);
break;
case T_FLOAT:
value = y->value;
value = RFLOAT(y)->value;
break;
default:
return num_coerce_bin(x, y);
}
#ifdef HAVE_FMOD
value = fmod(x->value, value);
value = fmod(RFLOAT(x)->value, value);
#else
{
double value1 = x->value;
double value1 = RFLOAT(x)->value;
double value2;
modf(value1/value, &value2);
@ -294,15 +289,15 @@ flo_mod(x, y)
VALUE
flo_pow(x, y)
struct RFloat *x, *y;
VALUE x, y;
{
switch (TYPE(y)) {
case T_FIXNUM:
return float_new(pow(x->value, (double)FIX2INT(y)));
return float_new(pow(RFLOAT(x)->value, (double)FIX2INT(y)));
case T_BIGNUM:
return float_new(pow(x->value, big2dbl(y)));
return float_new(pow(RFLOAT(x)->value, big2dbl(y)));
case T_FLOAT:
return float_new(pow(x->value, y->value));
return float_new(pow(RFLOAT(x)->value, RFLOAT(y)->value));
default:
return num_coerce_bin(x, y);
}
@ -327,16 +322,16 @@ num_equal(x, y)
static VALUE
flo_eq(x, y)
struct RFloat *x, *y;
VALUE x, y;
{
switch (TYPE(y)) {
case T_FIXNUM:
if (x->value == FIX2INT(y)) return TRUE;
if (RFLOAT(x)->value == FIX2INT(y)) return TRUE;
return FALSE;
case T_BIGNUM:
return (x->value == big2dbl(y))?TRUE:FALSE;
return (RFLOAT(x)->value == big2dbl(y))?TRUE:FALSE;
case T_FLOAT:
return (x->value == y->value)?TRUE:FALSE;
return (RFLOAT(x)->value == RFLOAT(y)->value)?TRUE:FALSE;
default:
return num_equal(x, y);
}
@ -344,13 +339,13 @@ flo_eq(x, y)
static VALUE
flo_hash(num)
struct RFloat *num;
VALUE num;
{
double d;
char *c;
int i, hash;
d = num->value;
d = RFLOAT(num)->value;
c = (char*)&d;
for (hash=0, i=0; i<sizeof(double);i++) {
hash += c[i] * 971;
@ -361,11 +356,11 @@ flo_hash(num)
static VALUE
flo_cmp(x, y)
struct RFloat *x, *y;
VALUE x, y;
{
double a, b;
a = x->value;
a = RFLOAT(x)->value;
switch (TYPE(y)) {
case T_FIXNUM:
b = (double)FIX2INT(y);
@ -376,7 +371,7 @@ flo_cmp(x, y)
break;
case T_FLOAT:
b = y->value;
b = RFLOAT(y)->value;
break;
default:
@ -389,19 +384,20 @@ flo_cmp(x, y)
static VALUE
flo_eql(x, y)
struct RFloat *x, *y;
VALUE x, y;
{
if (TYPE(y) == T_FLOAT) {
if (x->value == y->value) return TRUE;
if (RFLOAT(x)->value == RFLOAT(y)->value) return TRUE;
}
return FALSE;
}
static VALUE
flo_to_i(num)
struct RFloat *num;
VALUE num;
{
double f = num->value;
int val;
double f = RFLOAT(num)->value;
INT val;
if (!FIXABLE(f)) {
return dbl2big(f);
@ -419,9 +415,9 @@ flo_to_f(num)
static VALUE
flo_abs(flt)
struct RFloat *flt;
VALUE flt;
{
double val = fabs(flt->value);
double val = fabs(RFLOAT(flt)->value);
return float_new(val);
}
@ -472,7 +468,7 @@ VALUE
num2fix(val)
VALUE val;
{
int v;
INT v;
if (NIL_P(val)) return INT2FIX(0);
switch (TYPE(val)) {
@ -515,12 +511,12 @@ fix2str(x, base)
VALUE x;
int base;
{
char fmt[3], buf[12];
char fmt[4], buf[22];
fmt[0] = '%'; fmt[2] = '\0';
if (base == 10) fmt[1] = 'd';
else if (base == 16) fmt[1] = 'x';
else if (base == 8) fmt[1] = 'o';
fmt[0] = '%'; fmt[1] = 'l'; fmt[3] = '\0';
if (base == 10) fmt[2] = 'd';
else if (base == 16) fmt[2] = 'x';
else if (base == 8) fmt[2] = 'o';
else Fatal("fixnum cannot treat base %d", base);
sprintf(buf, fmt, FIX2INT(x));
@ -536,13 +532,12 @@ fix_to_s(in)
static VALUE
fix_plus(x, y)
VALUE x;
struct RFloat *y;
VALUE x, y;
{
switch (TYPE(y)) {
case T_FIXNUM:
{
int a, b, c;
INT a, b, c;
VALUE r;
a = FIX2INT(x);
@ -556,7 +551,7 @@ fix_plus(x, y)
return r;
}
case T_FLOAT:
return float_new((double)FIX2INT(x) + y->value);
return float_new((double)FIX2INT(x) + RFLOAT(y)->value);
default:
return num_coerce_bin(x, y);
}
@ -564,13 +559,12 @@ fix_plus(x, y)
static VALUE
fix_minus(x, y)
VALUE x;
struct RFloat *y;
VALUE x, y;
{
switch (TYPE(y)) {
case T_FIXNUM:
{
int a, b, c;
INT a, b, c;
VALUE r;
a = FIX2INT(x);
@ -584,7 +578,7 @@ fix_minus(x, y)
return r;
}
case T_FLOAT:
return float_new((double)FIX2INT(x) - y->value);
return float_new((double)FIX2INT(x) - RFLOAT(y)->value);
default:
return num_coerce_bin(x, y);
}
@ -592,13 +586,12 @@ fix_minus(x, y)
static VALUE
fix_mul(x, y)
VALUE x;
struct RFloat *y;
VALUE x, y;
{
switch (TYPE(y)) {
case T_FIXNUM:
{
int a, b, c;
INT a, b, c;
VALUE r;
a = FIX2INT(x);
@ -614,7 +607,7 @@ fix_mul(x, y)
return r;
}
case T_FLOAT:
return float_new((double)FIX2INT(x) * y->value);
return float_new((double)FIX2INT(x) * RFLOAT(y)->value);
default:
return num_coerce_bin(x, y);
}
@ -622,10 +615,9 @@ fix_mul(x, y)
static VALUE
fix_div(x, y)
VALUE x;
struct RFloat *y;
VALUE x, y;
{
int i;
INT i;
if (TYPE(y) == T_FIXNUM) {
i = FIX2INT(y);
@ -640,7 +632,7 @@ static VALUE
fix_mod(x, y)
VALUE x, y;
{
int i;
INT i;
if (TYPE(y) == T_FIXNUM) {
i = FIX2INT(y);
@ -656,7 +648,7 @@ fix_pow(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
int a, b;
INT a, b;
b = FIX2INT(y);
if (b == 0) return INT2FIX(1);
@ -689,7 +681,7 @@ fix_cmp(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
int a = FIX2INT(x), b = FIX2INT(y);
INT a = FIX2INT(x), b = FIX2INT(y);
if (a == b) return INT2FIX(0);
if (a > b) return INT2FIX(1);
@ -705,7 +697,7 @@ fix_gt(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
int a = FIX2INT(x), b = FIX2INT(y);
INT a = FIX2INT(x), b = FIX2INT(y);
if (a > b) return TRUE;
return FALSE;
@ -720,7 +712,7 @@ fix_ge(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
int a = FIX2INT(x), b = FIX2INT(y);
INT a = FIX2INT(x), b = FIX2INT(y);
if (a >= b) return TRUE;
return FALSE;
@ -735,7 +727,7 @@ fix_lt(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
int a = FIX2INT(x), b = FIX2INT(y);
INT a = FIX2INT(x), b = FIX2INT(y);
if (a < b) return TRUE;
return FALSE;
@ -750,7 +742,7 @@ fix_le(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
int a = FIX2INT(x), b = FIX2INT(y);
INT a = FIX2INT(x), b = FIX2INT(y);
if (a <= b) return TRUE;
return FALSE;
@ -876,14 +868,14 @@ static VALUE
fix_type(fix)
VALUE fix;
{
return str_new2("Fixnum");
return cFixnum;
}
static VALUE
fix_abs(fix)
VALUE fix;
{
int i = FIX2INT(fix);
INT i = FIX2INT(fix);
if (i < 0) i = -i;
@ -903,7 +895,7 @@ static VALUE
fix_succ(fix)
VALUE fix;
{
int i = FIX2INT(fix) + 1;
INT i = FIX2INT(fix) + 1;
return int2inum(i);
}
@ -912,7 +904,7 @@ static VALUE
fix_size(fix)
VALUE fix;
{
return INT2FIX(sizeof(VALUE));
return INT2FIX(sizeof(INT));
}
VALUE
@ -951,7 +943,7 @@ num_step(from, to, step)
ID cmp;
if (step == INT2FIX(0)) {
IndexError("step cannot be 0");
ArgError("step cannot be 0");
}
if (RTEST(rb_funcall(step, '>', 1, INT2FIX(0)))) {
@ -986,7 +978,7 @@ VALUE
fix_upto(from, to)
VALUE from, to;
{
int i, end;
INT i, end;
if (!FIXNUM_P(to)) return num_upto(from, to);
end = FIX2INT(to);
@ -1001,7 +993,7 @@ static VALUE
fix_downto(from, to)
VALUE from, to;
{
int i, end;
INT i, end;
if (!FIXNUM_P(to)) return num_downto(from, to);
end = FIX2INT(to);
@ -1016,7 +1008,7 @@ static VALUE
fix_step(from, to, step)
VALUE from, to, step;
{
int i, end, diff;
INT i, end, diff;
if (!FIXNUM_P(to) || !FIXNUM_P(step))
return num_step(from, to, step);
@ -1044,7 +1036,7 @@ static VALUE
fix_dotimes(num)
VALUE num;
{
int i, end;
INT i, end;
end = FIX2INT(num);
for (i=0; i<end; i++) {