mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
matz
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@816 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a60db057a2
commit
d1375688cd
18 changed files with 389 additions and 149 deletions
200
numeric.c
200
numeric.c
|
@ -132,12 +132,26 @@ num_divmod(x, y)
|
|||
return rb_assoc_new(div, mod);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
num_modulo(x, y)
|
||||
VALUE x, y;
|
||||
{
|
||||
return rb_funcall(x, '%', 1, y);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
num_remainder(x, y)
|
||||
VALUE x, y;
|
||||
{
|
||||
rb_warn("remainder is deprecated; use %% opearator");
|
||||
return rb_funcall(x, '%', 1, y);
|
||||
VALUE z = rb_funcall(x, '%', 1, y);
|
||||
|
||||
if ((RTEST(rb_funcall(x, '<', 1, INT2FIX(0))) &&
|
||||
RTEST(rb_funcall(y, '>', 1, INT2FIX(0)))) ||
|
||||
(RTEST(rb_funcall(x, '>', 1, INT2FIX(0))) &&
|
||||
RTEST(rb_funcall(y, '<', 1, INT2FIX(0))))) {
|
||||
return rb_funcall(z, '-', 1, y);
|
||||
}
|
||||
return z;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
@ -308,7 +322,7 @@ flodivmod(x, y, divp, modp)
|
|||
double x, y;
|
||||
double *divp, *modp;
|
||||
{
|
||||
double mod;
|
||||
double div, mod;
|
||||
|
||||
#ifdef HAVE_FMOD
|
||||
mod = fmod(x, y);
|
||||
|
@ -320,10 +334,13 @@ flodivmod(x, y, divp, modp)
|
|||
mod = x - z * x;
|
||||
}
|
||||
#endif
|
||||
if (modp) *modp = mod;
|
||||
if (divp) {
|
||||
*divp = (x - mod) / y;
|
||||
div = (x - mod) / y;
|
||||
if (y*mod < 0) {
|
||||
mod += y;
|
||||
div -= 1.0;
|
||||
}
|
||||
if (modp) *modp = mod;
|
||||
if (divp) *divp = div;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
@ -582,19 +599,63 @@ flo_eql(x, y)
|
|||
}
|
||||
|
||||
static VALUE
|
||||
flo_to_i(num)
|
||||
flo_to_f(num)
|
||||
VALUE num;
|
||||
{
|
||||
double f = RFLOAT(num)->value;
|
||||
long val;
|
||||
|
||||
if (!FIXABLE(f)) {
|
||||
return rb_dbl2big(f);
|
||||
}
|
||||
val = f;
|
||||
return INT2FIX(val);
|
||||
return num;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
flo_abs(flt)
|
||||
VALUE flt;
|
||||
{
|
||||
double val = fabs(RFLOAT(flt)->value);
|
||||
return rb_float_new(val);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
flo_zero_p(num)
|
||||
VALUE num;
|
||||
{
|
||||
if (RFLOAT(num)->value == 0.0) {
|
||||
return Qtrue;
|
||||
}
|
||||
return Qfalse;
|
||||
}
|
||||
|
||||
static VALUE flo_is_nan_p(num)
|
||||
VALUE num;
|
||||
{
|
||||
|
||||
double value = RFLOAT(num)->value;
|
||||
|
||||
return isnan(value) ? Qtrue : Qfalse;
|
||||
}
|
||||
|
||||
static VALUE flo_is_infinite_p(num)
|
||||
VALUE num;
|
||||
{
|
||||
double value = RFLOAT(num)->value;
|
||||
|
||||
if (isinf(value)) {
|
||||
return INT2FIX( value < 0 ? -1 : +1 );
|
||||
}
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
static VALUE flo_is_finite_p(num)
|
||||
VALUE num;
|
||||
{
|
||||
double value = RFLOAT(num)->value;
|
||||
|
||||
if (isinf(value) || isnan(value))
|
||||
return Qfalse;
|
||||
|
||||
return Qtrue;
|
||||
}
|
||||
|
||||
|
||||
static VALUE
|
||||
flo_floor(num)
|
||||
VALUE num;
|
||||
|
@ -641,63 +702,49 @@ flo_round(num)
|
|||
}
|
||||
|
||||
static VALUE
|
||||
flo_to_f(num)
|
||||
flo_truncate(num)
|
||||
VALUE num;
|
||||
{
|
||||
return num;
|
||||
}
|
||||
double f = RFLOAT(num)->value;
|
||||
long val;
|
||||
|
||||
static VALUE
|
||||
flo_abs(flt)
|
||||
VALUE flt;
|
||||
{
|
||||
double val = fabs(RFLOAT(flt)->value);
|
||||
return rb_float_new(val);
|
||||
}
|
||||
if (f > 0.0) f = floor(f);
|
||||
if (f < 0.0) f = ceil(f);
|
||||
|
||||
static VALUE
|
||||
flo_zero_p(num)
|
||||
VALUE num;
|
||||
{
|
||||
if (RFLOAT(num)->value == 0.0) {
|
||||
return Qtrue;
|
||||
if (!FIXABLE(f)) {
|
||||
return rb_dbl2big(f);
|
||||
}
|
||||
return Qfalse;
|
||||
val = f;
|
||||
return INT2FIX(val);
|
||||
}
|
||||
|
||||
static VALUE flo_is_nan_p(num)
|
||||
VALUE num;
|
||||
{
|
||||
|
||||
double value = RFLOAT(num)->value;
|
||||
|
||||
return isnan(value) ? Qtrue : Qfalse;
|
||||
static VALUE
|
||||
num_floor(num)
|
||||
VALUE num;
|
||||
{
|
||||
return flo_floor(rb_Float(num));
|
||||
}
|
||||
|
||||
static VALUE flo_is_infinite_p(num)
|
||||
VALUE num;
|
||||
{
|
||||
double value = RFLOAT(num)->value;
|
||||
|
||||
if (isinf(value)) {
|
||||
return INT2FIX( value < 0 ? -1 : +1 );
|
||||
}
|
||||
|
||||
return Qnil;
|
||||
static VALUE
|
||||
num_ceil(num)
|
||||
VALUE num;
|
||||
{
|
||||
return flo_ceil(rb_Float(num));
|
||||
}
|
||||
|
||||
|
||||
static VALUE flo_is_finite_p(num)
|
||||
VALUE num;
|
||||
{
|
||||
double value = RFLOAT(num)->value;
|
||||
|
||||
if (isinf(value) || isnan(value))
|
||||
return Qfalse;
|
||||
|
||||
return Qtrue;
|
||||
static VALUE
|
||||
num_round(num)
|
||||
VALUE num;
|
||||
{
|
||||
return flo_round(rb_Float(num));
|
||||
}
|
||||
|
||||
static VALUE
|
||||
num_truncate(num)
|
||||
VALUE num;
|
||||
{
|
||||
return flo_truncate(rb_Float(num));
|
||||
}
|
||||
|
||||
static VALUE
|
||||
to_integer(val)
|
||||
|
@ -825,6 +872,13 @@ rb_num2fix(val)
|
|||
return INT2FIX(v);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
int_to_i(num)
|
||||
VALUE num;
|
||||
{
|
||||
return num;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
int_int_p(num)
|
||||
VALUE num;
|
||||
|
@ -1017,6 +1071,10 @@ fixdivmod(x, y, divp, modp)
|
|||
div = x / y;
|
||||
}
|
||||
mod = x - div*y;
|
||||
if ((mod < 0 && y > 0) || (mod > 0 && y < 0)) {
|
||||
mod += y;
|
||||
div -= 1;
|
||||
}
|
||||
if (divp) *divp = div;
|
||||
if (modp) *modp = mod;
|
||||
}
|
||||
|
@ -1265,13 +1323,6 @@ fix_aref(fix, idx)
|
|||
return INT2FIX(0);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
fix_to_i(num)
|
||||
VALUE num;
|
||||
{
|
||||
return num;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
fix_to_f(num)
|
||||
VALUE num;
|
||||
|
@ -1507,6 +1558,7 @@ Init_Numeric()
|
|||
rb_define_method(rb_cNumeric, "===", num_equal, 1);
|
||||
rb_define_method(rb_cNumeric, "eql?", num_eql, 1);
|
||||
rb_define_method(rb_cNumeric, "divmod", num_divmod, 1);
|
||||
rb_define_method(rb_cNumeric, "modulo", num_modulo, 1);
|
||||
rb_define_method(rb_cNumeric, "remainder", num_remainder, 1);
|
||||
rb_define_method(rb_cNumeric, "abs", num_abs, 0);
|
||||
|
||||
|
@ -1514,6 +1566,11 @@ Init_Numeric()
|
|||
rb_define_method(rb_cNumeric, "zero?", num_zero_p, 0);
|
||||
rb_define_method(rb_cNumeric, "nonzero?", num_nonzero_p, 0);
|
||||
|
||||
rb_define_method(rb_cNumeric, "floor", num_floor, 0);
|
||||
rb_define_method(rb_cNumeric, "ceil", num_ceil, 0);
|
||||
rb_define_method(rb_cNumeric, "round", num_round, 0);
|
||||
rb_define_method(rb_cNumeric, "truncate", num_truncate, 0);
|
||||
|
||||
rb_cInteger = rb_define_class("Integer", rb_cNumeric);
|
||||
rb_define_method(rb_cInteger, "integer?", int_int_p, 0);
|
||||
rb_define_method(rb_cInteger, "upto", int_upto, 1);
|
||||
|
@ -1524,6 +1581,11 @@ Init_Numeric()
|
|||
rb_define_method(rb_cInteger, "succ", int_succ, 0);
|
||||
rb_define_method(rb_cInteger, "next", int_succ, 0);
|
||||
rb_define_method(rb_cInteger, "chr", int_chr, 0);
|
||||
rb_define_method(rb_cInteger, "to_i", int_to_i, 0);
|
||||
rb_define_method(rb_cInteger, "floor", int_to_i, 0);
|
||||
rb_define_method(rb_cInteger, "ceil", int_to_i, 0);
|
||||
rb_define_method(rb_cInteger, "round", int_to_i, 0);
|
||||
rb_define_method(rb_cInteger, "truncate", int_to_i, 0);
|
||||
|
||||
rb_cFixnum = rb_define_class("Fixnum", rb_cInteger);
|
||||
rb_include_module(rb_cFixnum, rb_mPrecision);
|
||||
|
@ -1543,6 +1605,7 @@ Init_Numeric()
|
|||
rb_define_method(rb_cFixnum, "*", fix_mul, 1);
|
||||
rb_define_method(rb_cFixnum, "/", fix_div, 1);
|
||||
rb_define_method(rb_cFixnum, "%", fix_mod, 1);
|
||||
rb_define_method(rb_cFixnum, "modulo", fix_mod, 1);
|
||||
rb_define_method(rb_cFixnum, "divmod", fix_divmod, 1);
|
||||
rb_define_method(rb_cFixnum, "**", fix_pow, 1);
|
||||
|
||||
|
@ -1564,7 +1627,6 @@ Init_Numeric()
|
|||
rb_define_method(rb_cFixnum, "<<", fix_lshift, 1);
|
||||
rb_define_method(rb_cFixnum, ">>", fix_rshift, 1);
|
||||
|
||||
rb_define_method(rb_cFixnum, "to_i", fix_to_i, 0);
|
||||
rb_define_method(rb_cFixnum, "to_f", fix_to_f, 0);
|
||||
|
||||
rb_define_method(rb_cFixnum, "succ", fix_succ, 0);
|
||||
|
@ -1592,6 +1654,7 @@ Init_Numeric()
|
|||
rb_define_method(rb_cFloat, "*", flo_mul, 1);
|
||||
rb_define_method(rb_cFloat, "/", flo_div, 1);
|
||||
rb_define_method(rb_cFloat, "%", flo_mod, 1);
|
||||
rb_define_method(rb_cFloat, "modulo", flo_mod, 1);
|
||||
rb_define_method(rb_cFloat, "divmod", flo_divmod, 1);
|
||||
rb_define_method(rb_cFloat, "**", flo_pow, 1);
|
||||
rb_define_method(rb_cFloat, "==", flo_eq, 1);
|
||||
|
@ -1602,14 +1665,15 @@ Init_Numeric()
|
|||
rb_define_method(rb_cFloat, "<=", flo_le, 1);
|
||||
rb_define_method(rb_cFloat, "eql?", flo_eql, 1);
|
||||
rb_define_method(rb_cFloat, "hash", flo_hash, 0);
|
||||
rb_define_method(rb_cFloat, "to_i", flo_to_i, 0);
|
||||
rb_define_method(rb_cFloat, "to_f", flo_to_f, 0);
|
||||
rb_define_method(rb_cFloat, "abs", flo_abs, 0);
|
||||
rb_define_method(rb_cFloat, "zero?", flo_zero_p, 0);
|
||||
|
||||
rb_define_method(rb_cFloat, "to_i", flo_truncate, 0);
|
||||
rb_define_method(rb_cFloat, "floor", flo_floor, 0);
|
||||
rb_define_method(rb_cFloat, "ceil", flo_ceil, 0);
|
||||
rb_define_method(rb_cFloat, "round", flo_round, 0);
|
||||
rb_define_method(rb_cFloat, "truncate", flo_truncate, 0);
|
||||
|
||||
rb_define_method(rb_cFloat, "nan?", flo_is_nan_p, 0);
|
||||
rb_define_method(rb_cFloat, "infinite?", flo_is_infinite_p, 0);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue