summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <[email protected]>2025-01-07 11:38:51 +0900
committerNobuyoshi Nakada <[email protected]>2025-01-07 11:38:51 +0900
commitb176d4f52e4af67654814dab3e9c5f4bf9170e54 (patch)
tree51aa1f4095d2e067ea70c8b854e3e442c82fdc4d
parente9593eb96715628edb0e5b2b5accdffd1d85187d (diff)
[Bug #21008] Normalize before sum to float
After switching to `Float`-mode when summing `Numeric` objects, normalization for `Float` is still needed.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/12522
-rw-r--r--enum.c2
-rw-r--r--test/ruby/test_enumerator.rb15
2 files changed, 16 insertions, 1 deletions
diff --git a/enum.c b/enum.c
index 233f56607c..6082daf27d 100644
--- a/enum.c
+++ b/enum.c
@@ -4704,7 +4704,7 @@ sum_iter(VALUE i, struct enum_sum_memo *memo)
}
else switch (TYPE(memo->v)) {
default: sum_iter_some_value(i, memo); return;
- case T_FLOAT: sum_iter_Kahan_Babuska(i, memo); return;
+ case T_FLOAT:
case T_FIXNUM:
case T_BIGNUM:
case T_RATIONAL:
diff --git a/test/ruby/test_enumerator.rb b/test/ruby/test_enumerator.rb
index 7599d43463..cd62cd8acb 100644
--- a/test/ruby/test_enumerator.rb
+++ b/test/ruby/test_enumerator.rb
@@ -1043,4 +1043,19 @@ class TestEnumerator < Test::Unit::TestCase
assert_raise(FrozenError) { e.feed 1 }
assert_raise(FrozenError) { e.rewind }
end
+
+ def test_sum_of_numeric
+ num = Class.new(Numeric) do
+ attr_reader :to_f
+ def initialize(val)
+ @to_f = Float(val)
+ end
+ end
+
+ ary = [5, 10, 20].map {|i| num.new(i)}
+
+ assert_equal(35.0, ary.sum)
+ enum = ary.each
+ assert_equal(35.0, enum.sum)
+ end
end