1require_relative "testbase"
2require "bigdecimal/math"
3
4class TestBigMath < Test::Unit::TestCase
5  include TestBigDecimalBase
6  include BigMath
7  N = 20
8  PINF = BigDecimal("+Infinity")
9  MINF = BigDecimal("-Infinity")
10  NAN = BigDecimal("NaN")
11
12  def test_const
13    assert_in_delta(Math::PI, PI(N))
14    assert_in_delta(Math::E, E(N))
15  end
16
17  def test_sqrt
18    assert_in_delta(2**0.5, sqrt(BigDecimal("2"), N))
19    assert_equal(10, sqrt(BigDecimal("100"), N))
20    assert_equal(0.0, sqrt(BigDecimal("0"), N))
21    assert_equal(0.0, sqrt(BigDecimal("-0"), N))
22    assert_raise(FloatDomainError) {sqrt(BigDecimal("-1.0"), N)}
23    assert_raise(FloatDomainError) {sqrt(NAN, N)}
24    assert_raise(FloatDomainError) {sqrt(PINF, N)}
25  end
26
27  def test_sin
28    assert_in_delta(0.0, sin(BigDecimal("0.0"), N))
29    assert_in_delta(Math.sqrt(2.0) / 2, sin(PI(N) / 4, N))
30    assert_in_delta(1.0, sin(PI(N) / 2, N))
31    assert_in_delta(0.0, sin(PI(N) * 2, N))
32    assert_in_delta(0.0, sin(PI(N), N))
33    assert_in_delta(-1.0, sin(PI(N) / -2, N))
34    assert_in_delta(0.0, sin(PI(N) * -2, N))
35    assert_in_delta(0.0, sin(-PI(N), N))
36    assert_in_delta(0.0, sin(PI(N) * 21, N))
37    assert_in_delta(0.0, sin(PI(N) * 30, N))
38    assert_in_delta(-1.0, sin(PI(N) * BigDecimal("301.5"), N))
39  end
40
41  def test_cos
42    assert_in_delta(1.0, cos(BigDecimal("0.0"), N))
43    assert_in_delta(Math.sqrt(2.0) / 2, cos(PI(N) / 4, N))
44    assert_in_delta(0.0, cos(PI(N) / 2, N))
45    assert_in_delta(1.0, cos(PI(N) * 2, N))
46    assert_in_delta(-1.0, cos(PI(N), N))
47    assert_in_delta(0.0, cos(PI(N) / -2, N))
48    assert_in_delta(1.0, cos(PI(N) * -2, N))
49    assert_in_delta(-1.0, cos(-PI(N), N))
50    assert_in_delta(-1.0, cos(PI(N) * 21, N))
51    assert_in_delta(1.0, cos(PI(N) * 30, N))
52    assert_in_delta(0.0, cos(PI(N) * BigDecimal("301.5"), N))
53  end
54
55  def test_atan
56    assert_equal(0.0, atan(BigDecimal("0.0"), N))
57    assert_in_delta(Math::PI/4, atan(BigDecimal("1.0"), N))
58    assert_in_delta(Math::PI/6, atan(sqrt(BigDecimal("3.0"), N) / 3, N))
59    assert_in_delta(Math::PI/2, atan(PINF, N))
60    assert_equal(BigDecimal("0.823840753418636291769355073102514088959345624027952954058347023122539489"),
61                 atan(BigDecimal("1.08"), 72).round(72), '[ruby-dev:41257]')
62  end
63end
64