зеркало из https://github.com/github/ruby.git
Fix logarithm of 0 with base
This commit is contained in:
Родитель
d70484f0eb
Коммит
105bdba899
5
math.c
5
math.c
|
@ -554,9 +554,8 @@ rb_math_log(int argc, const VALUE *argv)
|
|||
double b = math_log_split(base, &numbits_2);
|
||||
/* check for pole error */
|
||||
if (d == 0.0) {
|
||||
if (b > 0.0) return DBL2NUM(HUGE_VAL);
|
||||
if (b < 0.0) return DBL2NUM(-HUGE_VAL);
|
||||
return DBL2NUM(nan(""));
|
||||
// Already DomainError if b < 0.0
|
||||
return b ? DBL2NUM(-HUGE_VAL) : DBL2NUM(NAN);
|
||||
}
|
||||
else if (b == 0.0) {
|
||||
return DBL2NUM(-0.0);
|
||||
|
|
|
@ -5,6 +5,7 @@ class TestMath < Test::Unit::TestCase
|
|||
def assert_infinity(a, *rest)
|
||||
rest = ["not infinity: #{a.inspect}"] if rest.empty?
|
||||
assert_predicate(a, :infinite?, *rest)
|
||||
assert_predicate(a, :positive?, *rest)
|
||||
end
|
||||
|
||||
def assert_nan(a, *rest)
|
||||
|
@ -165,6 +166,8 @@ class TestMath < Test::Unit::TestCase
|
|||
assert_nothing_raised { assert_nan(Math.log(0.0, 0.0)) }
|
||||
assert_nothing_raised { assert_nan(Math.log(Float::NAN)) }
|
||||
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)) }
|
||||
end
|
||||
|
||||
def test_log2
|
||||
|
@ -179,6 +182,7 @@ class TestMath < Test::Unit::TestCase
|
|||
assert_raise_with_message(Math::DomainError, /\blog2\b/) { Math.log2(-1.0) }
|
||||
assert_raise_with_message(Math::DomainError, /\blog2\b/) { Math.log2(-Float::EPSILON) }
|
||||
assert_nothing_raised { assert_nan(Math.log2(Float::NAN)) }
|
||||
assert_nothing_raised { assert_infinity(-Math.log2(0)) }
|
||||
end
|
||||
|
||||
def test_log10
|
||||
|
@ -193,6 +197,7 @@ class TestMath < Test::Unit::TestCase
|
|||
assert_raise_with_message(Math::DomainError, /\blog10\b/) { Math.log10(-1.0) }
|
||||
assert_raise_with_message(Math::DomainError, /\blog10\b/) { Math.log10(-Float::EPSILON) }
|
||||
assert_nothing_raised { assert_nan(Math.log10(Float::NAN)) }
|
||||
assert_nothing_raised { assert_infinity(-Math.log10(0)) }
|
||||
end
|
||||
|
||||
def test_sqrt
|
||||
|
@ -277,8 +282,7 @@ class TestMath < Test::Unit::TestCase
|
|||
assert_raise_with_message(Math::DomainError, /\bgamma\b/) { Math.gamma(-1.0) }
|
||||
x = Math.gamma(-0.0)
|
||||
mesg = "Math.gamma(-0.0) should be -INF"
|
||||
assert_infinity(x, mesg)
|
||||
assert_predicate(x, :negative?, mesg)
|
||||
assert_infinity(-x, mesg)
|
||||
assert_nan(Math.gamma(Float::NAN))
|
||||
end
|
||||
|
||||
|
@ -299,7 +303,6 @@ class TestMath < Test::Unit::TestCase
|
|||
x, sign = Math.lgamma(-0.0)
|
||||
mesg = "Math.lgamma(-0.0) should be [INF, -1]"
|
||||
assert_infinity(x, mesg)
|
||||
assert_predicate(x, :positive?, mesg)
|
||||
assert_equal(-1, sign, mesg)
|
||||
x, sign = Math.lgamma(Float::NAN)
|
||||
assert_nan(x)
|
||||
|
|
Загрузка…
Ссылка в новой задаче