diff options
author | Nobuyoshi Nakada <[email protected]> | 2025-01-07 11:38:51 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2025-01-07 11:38:51 +0900 |
commit | b176d4f52e4af67654814dab3e9c5f4bf9170e54 (patch) | |
tree | 51aa1f4095d2e067ea70c8b854e3e442c82fdc4d | |
parent | e9593eb96715628edb0e5b2b5accdffd1d85187d (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.c | 2 | ||||
-rw-r--r-- | test/ruby/test_enumerator.rb | 15 |
2 files changed, 16 insertions, 1 deletions
@@ -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 |