summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYusuke Endoh <mame@ruby-lang.org>2023-09-13 18:56:24 +0900
committerYusuke Endoh <mame@ruby-lang.org>2023-09-13 21:40:05 +0900
commit411572661a3995a0daacb6c866ea3ac6b52ad25b (patch)
tree377a8f96e33f6a412df37d8315c168b01f0ab5fb
parent4655d2108ef14e66f64496f9029f65ba2302d9ea (diff)
math.c: Fix Math.log against huge bignum [Bug #19878]
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/8429
-rw-r--r--math.c4
-rw-r--r--test/ruby/test_math.rb1
2 files changed, 3 insertions, 2 deletions
diff --git a/math.c b/math.c
index 6f0ddf9ec5..24e52ba59c 100644
--- a/math.c
+++ b/math.c
@@ -561,14 +561,14 @@ rb_math_log(int argc, const VALUE *argv)
return DBL2NUM(-0.0);
}
d = log_intermediate(d) / log_intermediate(b);
- numbits -= numbits_2;
+ d += (numbits - numbits_2) * M_LN2 / log(b);
}
else {
/* check for pole error */
if (d == 0.0) return DBL2NUM(-HUGE_VAL);
d = log(d);
+ d += numbits * M_LN2;
}
- d += numbits * M_LN2;
return DBL2NUM(d);
}
diff --git a/test/ruby/test_math.rb b/test/ruby/test_math.rb
index bc2172d680..6e67099c6b 100644
--- a/test/ruby/test_math.rb
+++ b/test/ruby/test_math.rb
@@ -168,6 +168,7 @@ class TestMath < Test::Unit::TestCase
assert_nothing_raised { assert_nan(Math.log(1.0, Float::NAN)) }
assert_nothing_raised { assert_infinity(-Math.log(0)) }
assert_nothing_raised { assert_infinity(-Math.log(0, 2)) }
+ check(307.95368556425274, Math.log(2**1023, 10))
end
def test_log2