mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* bignum.c (rb_big_fdiv): flo.fdiv(NaN) should result NaN.
* numeric.c (num_quo): renamed and moved from bignum.c. [ruby-dev:34582] * bignum.c (rb_big_fdiv): update RDoc description * rational.c (nurat_s_new_m): small refactoring. * bignum.c (rb_big2dbl): no need for forceful warning when converting to float. overflow is a nature of float values. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16308 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
f7b3f1c528
commit
fa16110326
6 changed files with 44 additions and 59 deletions
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
|||
Wed May 7 13:02:56 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* bignum.c (rb_big_fdiv): flo.fdiv(NaN) should result NaN.
|
||||
|
||||
* numeric.c (num_quo): renamed and moved from bignum.c.
|
||||
[ruby-dev:34582]
|
||||
|
||||
* bignum.c (rb_big_fdiv): update RDoc description
|
||||
|
||||
* rational.c (nurat_s_new_m): small refactoring.
|
||||
|
||||
* bignum.c (rb_big2dbl): no need for forceful warning when
|
||||
converting to float. overflow is a nature of float values.
|
||||
|
||||
Wed May 7 00:54:25 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* ext/zlib/zlib.c (gzreader_gets): may cause infinite loop.
|
||||
|
|
17
bignum.c
17
bignum.c
|
@ -1219,7 +1219,7 @@ rb_big2dbl(VALUE x)
|
|||
double d = big2dbl(x);
|
||||
|
||||
if (isinf(d)) {
|
||||
rb_warn("Bignum out of Float range");
|
||||
rb_warning("Bignum out of Float range");
|
||||
d = HUGE_VAL;
|
||||
}
|
||||
return d;
|
||||
|
@ -1975,23 +1975,16 @@ static VALUE big_shift(VALUE x, int n)
|
|||
|
||||
/*
|
||||
* call-seq:
|
||||
* big.quo(numeric) -> float
|
||||
* big.fdiv(numeric) -> float
|
||||
* big.fdiv(numeric) -> float
|
||||
*
|
||||
* Returns the floating point result of dividing <i>big</i> by
|
||||
* <i>numeric</i>.
|
||||
*
|
||||
* -1234567890987654321.quo(13731) #=> -89910996357705.5
|
||||
* -1234567890987654321.quo(13731.24) #=> -89909424858035.7
|
||||
* -1234567890987654321.fdiv(13731) #=> -89910996357705.5
|
||||
* -1234567890987654321.fdiv(13731.24) #=> -89909424858035.7
|
||||
*
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
rb_big_quo(VALUE x, VALUE y)
|
||||
{
|
||||
return rb_funcall(rb_rational_raw1(x), '/', 1, rb_Rational1(y));
|
||||
}
|
||||
|
||||
static VALUE
|
||||
rb_big_fdiv(VALUE x, VALUE y)
|
||||
{
|
||||
|
@ -2021,6 +2014,7 @@ rb_big_fdiv(VALUE x, VALUE y)
|
|||
return DOUBLE2NUM(ldexp(big2dbl(z), ex - ey));
|
||||
}
|
||||
case T_FLOAT:
|
||||
if (isnan(RFLOAT_VALUE(y))) return y;
|
||||
y = dbl2big(ldexp(frexp(RFLOAT_VALUE(y), &ey), DBL_MANT_DIG));
|
||||
ey -= DBL_MANT_DIG;
|
||||
goto bignum;
|
||||
|
@ -2688,7 +2682,6 @@ Init_Bignum(void)
|
|||
rb_define_method(rb_cBignum, "divmod", rb_big_divmod, 1);
|
||||
rb_define_method(rb_cBignum, "modulo", rb_big_modulo, 1);
|
||||
rb_define_method(rb_cBignum, "remainder", rb_big_remainder, 1);
|
||||
rb_define_method(rb_cBignum, "quo", rb_big_quo, 1);
|
||||
rb_define_method(rb_cBignum, "fdiv", rb_big_fdiv, 1);
|
||||
rb_define_method(rb_cBignum, "**", rb_big_pow, 1);
|
||||
rb_define_method(rb_cBignum, "&", rb_big_and, 1);
|
||||
|
|
17
numeric.c
17
numeric.c
|
@ -249,15 +249,14 @@ num_uminus(VALUE num)
|
|||
/*
|
||||
* call-seq:
|
||||
* num.quo(numeric) => result
|
||||
* num.fdiv(numeric) => result
|
||||
*
|
||||
* Equivalent to <code>Numeric#/</code>, but overridden in subclasses.
|
||||
* Returns most exact division (rational for integers, float for floats).
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
num_quo(VALUE x, VALUE y)
|
||||
{
|
||||
return rb_funcall(x, '/', 1, y);
|
||||
return rb_funcall(rb_rational_raw1(x), '/', 1, y);
|
||||
}
|
||||
|
||||
|
||||
|
@ -2215,23 +2214,16 @@ fixdivmod(long x, long y, long *divp, long *modp)
|
|||
|
||||
/*
|
||||
* call-seq:
|
||||
* fix.quo(numeric) => float
|
||||
* fix.fdiv(numeric) => float
|
||||
*
|
||||
* Returns the floating point result of dividing <i>fix</i> by
|
||||
* <i>numeric</i>.
|
||||
*
|
||||
* 654321.quo(13731) #=> 47.6528293642124
|
||||
* 654321.quo(13731.24) #=> 47.6519964693647
|
||||
* 654321.fdiv(13731) #=> 47.6528293642124
|
||||
* 654321.fdiv(13731.24) #=> 47.6519964693647
|
||||
*
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
fix_quo(VALUE x, VALUE y)
|
||||
{
|
||||
return rb_funcall(rb_rational_raw1(x), '/', 1, y);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
fix_fdiv(VALUE x, VALUE y)
|
||||
{
|
||||
|
@ -3225,7 +3217,6 @@ Init_Numeric(void)
|
|||
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, "quo", fix_quo, 1);
|
||||
rb_define_method(rb_cFixnum, "fdiv", fix_fdiv, 1);
|
||||
rb_define_method(rb_cFixnum, "**", fix_pow, 1);
|
||||
|
||||
|
|
40
rational.c
40
rational.c
|
@ -500,10 +500,8 @@ nurat_s_canonicalize(int argc, VALUE *argv, VALUE klass)
|
|||
{
|
||||
VALUE num, den;
|
||||
|
||||
switch (rb_scan_args(argc, argv, "11", &num, &den)) {
|
||||
case 1:
|
||||
if (rb_scan_args(argc, argv, "11", &num, &den) == 1) {
|
||||
den = ONE;
|
||||
break;
|
||||
}
|
||||
|
||||
nurat_int_check(num);
|
||||
|
@ -514,22 +512,25 @@ nurat_s_canonicalize(int argc, VALUE *argv, VALUE klass)
|
|||
#endif
|
||||
|
||||
static VALUE
|
||||
nurat_s_new(int argc, VALUE *argv, VALUE klass)
|
||||
nurat_s_new(VALUE klass, VALUE num, VALUE den)
|
||||
{
|
||||
VALUE num, den;
|
||||
|
||||
switch (rb_scan_args(argc, argv, "11", &num, &den)) {
|
||||
case 1:
|
||||
den = ONE;
|
||||
break;
|
||||
}
|
||||
|
||||
nurat_int_check(num);
|
||||
nurat_int_check(den);
|
||||
|
||||
return nurat_s_canonicalize_internal(klass, num, den);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
nurat_s_new_m(int argc, VALUE *argv, VALUE klass)
|
||||
{
|
||||
VALUE num, den;
|
||||
|
||||
if (rb_scan_args(argc, argv, "11", &num, &den) == 1) {
|
||||
den = ONE;
|
||||
}
|
||||
return nurat_s_new(klass, num, den);
|
||||
}
|
||||
|
||||
inline static VALUE
|
||||
f_rational_new1(VALUE klass, VALUE x)
|
||||
{
|
||||
|
@ -1425,9 +1426,9 @@ nurat_s_convert(int argc, VALUE *argv, VALUE klass)
|
|||
{
|
||||
VALUE a1, a2;
|
||||
|
||||
a1 = Qnil;
|
||||
a2 = Qnil;
|
||||
rb_scan_args(argc, argv, "02", &a1, &a2);
|
||||
if (rb_scan_args(argc, argv, "02", &a1, &a2) == 1) {
|
||||
a2 = ONE;
|
||||
}
|
||||
|
||||
switch (TYPE(a1)) {
|
||||
case T_COMPLEX:
|
||||
|
@ -1486,12 +1487,7 @@ nurat_s_convert(int argc, VALUE *argv, VALUE klass)
|
|||
return f_div(a1, a2);
|
||||
}
|
||||
|
||||
{
|
||||
VALUE argv2[2];
|
||||
argv2[0] = a1;
|
||||
argv2[1] = a2;
|
||||
return nurat_s_new(argc, argv2, klass);
|
||||
}
|
||||
return nurat_s_new(klass, a1, a2);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
@ -1533,7 +1529,7 @@ Init_Rational(void)
|
|||
rb_funcall(rb_cRational, rb_intern("private_class_method"), 1,
|
||||
ID2SYM(rb_intern("new!")));
|
||||
|
||||
rb_define_singleton_method(rb_cRational, "new", nurat_s_new, -1);
|
||||
rb_define_singleton_method(rb_cRational, "new", nurat_s_new_m, -1);
|
||||
rb_funcall(rb_cRational, rb_intern("private_class_method"), 1,
|
||||
ID2SYM(rb_intern("new")));
|
||||
|
||||
|
|
|
@ -263,14 +263,14 @@ class TestBignum < Test::Unit::TestCase
|
|||
assert_equal(T32.to_f, T32.quo(1.0))
|
||||
assert_equal(T32.to_f, T32.quo(T_ONE))
|
||||
|
||||
assert_raise(ArgumentError) { T32.quo("foo") }
|
||||
assert_raise(TypeError) { T32.quo("foo") }
|
||||
|
||||
assert_equal(1024**1024, (1024**1024).quo(1))
|
||||
assert_equal(1024**1024, (1024**1024).quo(1.0))
|
||||
assert_equal(1024**1024*2, (1024**1024*2).quo(1))
|
||||
inf = 1 / 0.0; nan = inf / inf
|
||||
|
||||
assert_raise(FloatDomainError) { (1024**1024*2).quo(nan) }
|
||||
assert((1024**1024*2).quo(nan).nan?)
|
||||
end
|
||||
|
||||
def test_pow
|
||||
|
|
|
@ -51,16 +51,7 @@ class TestNumeric < Test::Unit::TestCase
|
|||
end
|
||||
|
||||
def test_quo
|
||||
DummyNumeric.class_eval do
|
||||
def /(x); :div; end
|
||||
end
|
||||
|
||||
assert_equal(:div, DummyNumeric.new.quo(0))
|
||||
|
||||
ensure
|
||||
DummyNumeric.class_eval do
|
||||
remove_method :/
|
||||
end
|
||||
assert_raise(ArgumentError) {DummyNumeric.new.quo(1)}
|
||||
end
|
||||
|
||||
def test_divmod
|
||||
|
|
Loading…
Reference in a new issue