array.c (rb_ary_sum): use rb_rational_add directly

* rational.c (rb_rational_add): rename from nurat_add.

* array.c (rb_ary_sum): use rb_rational_add directly.

* test/ruby/test_array.rb (test_sum): add assertions for an array of
  Rational values.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54602 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
mrkn 2016-04-15 14:46:35 +00:00
parent a945eb9dda
commit 0a267b79f6
5 changed files with 16 additions and 4 deletions

View File

@ -1,3 +1,12 @@
Fri Apr 15 23:42:00 2016 Kenta Murata <mrkn@mrkn.jp>
* rational.c (rb_rational_add): rename from nurat_add.
* array.c (rb_ary_sum): use rb_rational_add directly.
* test/ruby/test_array.rb (test_sum): add assertions for an array of
Rational values.
Fri Apr 15 22:31:00 2016 Kenta Murata <mrkn@mrkn.jp>
* array.c (rb_ary_sum): apply the precision compensated algorithm

View File

@ -5762,7 +5762,7 @@ rb_ary_sum(int argc, VALUE *argv, VALUE ary)
v = rb_to_float(v);
goto float_value;
}
v = rb_funcall(v, idPLUS, 1, e);
v = rb_rational_add(e, v);
}
return v;
}

View File

@ -1204,6 +1204,7 @@ rb_pid_t rb_fork_ruby(int *status);
void rb_last_status_clear(void);
/* rational.c */
VALUE rb_rational_add(VALUE self, VALUE other);
VALUE rb_lcm(VALUE x, VALUE y);
VALUE rb_rational_reciprocal(VALUE x);
VALUE rb_cstr_to_rat(const char *, int);

View File

@ -741,8 +741,8 @@ f_addsub(VALUE self, VALUE anum, VALUE aden, VALUE bnum, VALUE bden, int k)
* Rational(9, 8) + 4 #=> (41/8)
* Rational(20, 9) + 9.8 #=> 12.022222222222222
*/
static VALUE
nurat_add(VALUE self, VALUE other)
VALUE
rb_rational_add(VALUE self, VALUE other)
{
if (RB_TYPE_P(other, T_FIXNUM) || RB_TYPE_P(other, T_BIGNUM)) {
{
@ -2538,7 +2538,7 @@ Init_Rational(void)
rb_define_method(rb_cRational, "numerator", nurat_numerator, 0);
rb_define_method(rb_cRational, "denominator", nurat_denominator, 0);
rb_define_method(rb_cRational, "+", nurat_add, 1);
rb_define_method(rb_cRational, "+", rb_rational_add, 1);
rb_define_method(rb_cRational, "-", nurat_sub, 1);
rb_define_method(rb_cRational, "*", nurat_mul, 1);
rb_define_method(rb_cRational, "/", nurat_div, 1);

View File

@ -2761,6 +2761,8 @@ class TestArray < Test::Unit::TestCase
assert_float_equal((FIXNUM_MAX+1).to_f, [FIXNUM_MAX, 1, 0.0].sum)
assert_float_equal((FIXNUM_MAX+1).to_f, [0.0, FIXNUM_MAX+1].sum)
assert_rational_equal(5/6r, [1/2r, 1/3r].sum)
assert_equal(2.0+3.0i, [2.0, 3.0i].sum)
assert_int_equal(13, [1, 2].sum(10))