gnu_mpc 0.8.2 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +2 -0
- data/.yardopts +2 -0
- data/CHANGELOG +27 -5
- data/Gemfile +3 -1
- data/README.md +61 -5
- data/Rakefile +11 -3
- data/ext/extconf.rb +5 -1
- data/ext/gmprandstate.c +54 -0
- data/ext/mpc.c +358 -186
- data/ext/mpcrnd.c +3 -3
- data/ext/ruby_gmp.h +4 -4
- data/ext/ruby_mpc.h +2 -0
- data/manual.md +40 -14
- data/manual.pdf +0 -0
- data/spec/acos_spec.rb +15 -15
- data/spec/add_args_spec.rb +21 -21
- data/spec/add_fr_spec.rb +22 -22
- data/spec/add_spec.rb +12 -12
- data/spec/arg_spec.rb +14 -0
- data/spec/asin_spec.rb +12 -12
- data/spec/atan_spec.rb +26 -26
- data/spec/fma_spec.rb +20 -0
- data/spec/imag_spec.rb +23 -0
- data/spec/log10_spec.rb +21 -13
- data/spec/mpc_single_function_args_spec.rb +6 -6
- data/spec/new_spec.rb +54 -23
- data/spec/pow_spec.rb +79 -0
- data/spec/prec_arguments_spec.rb +40 -0
- data/spec/prec_spec.rb +17 -0
- data/spec/sub_spec.rb +35 -2
- data/spec/urandom_spec.rb +14 -0
- metadata +16 -5
data/spec/atan_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), 'spec_helper')
|
|
2
2
|
|
3
3
|
# All tests adapted from MPC 1.0.1's tests/atan.dat
|
4
4
|
describe MPC, '#atan' do
|
5
|
-
it '
|
5
|
+
it 'calculates the inverse tangent of a pure real argument' do
|
6
6
|
data = [
|
7
7
|
[["-0x16DCC57BB565FDp-52", 53, 16], [0], MPC.new([GMP::F(-7 ), -GMP::F(0)])],
|
8
8
|
[["-0x1F730BD281F69Bp-53", 53, 16], [0], MPC.new([GMP::F(-1.5 ), -GMP::F(0)])],
|
@@ -17,12 +17,12 @@ describe MPC, '#atan' do
|
|
17
17
|
]
|
18
18
|
data.each do |expected_real, expected_imag, input|
|
19
19
|
actual = input.atan
|
20
|
-
actual.real.
|
21
|
-
actual.imag.
|
20
|
+
expect(actual.real).to eq GMP::F.new(*expected_real)
|
21
|
+
expect(actual.imag).to eq GMP::F.new(*expected_imag)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
it '
|
25
|
+
it 'calculates the inverse tangent of a pure imaginary argument' do
|
26
26
|
data = [
|
27
27
|
[["-0x1921FB54442D18p-52", 53, 16], ["-0x1269621134DB92p-55", 53, 16], MPC.new([-GMP::F(0), GMP::F(-7 )])],
|
28
28
|
[[ "0x1921FB54442D18p-52", 53, 16], ["-0x1269621134DB92p-55", 53, 16], MPC.new([ GMP::F(0), GMP::F(-7 )])],
|
@@ -40,32 +40,32 @@ describe MPC, '#atan' do
|
|
40
40
|
]
|
41
41
|
data.each do |expected_real, expected_imag, input|
|
42
42
|
actual = input.atan
|
43
|
-
actual.real.
|
44
|
-
actual.imag.
|
43
|
+
expect(actual.real).to eq GMP::F.new(*expected_real)
|
44
|
+
expect(actual.imag).to eq GMP::F.new(*expected_imag)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
it '
|
48
|
+
it 'calculates the inverse tangent of a pure imaginary argument, 512 precision' do
|
49
49
|
input = MPC.new([
|
50
50
|
GMP::F(0, 512),
|
51
51
|
GMP::F("0x1018734E311AB77B710F9212969B3C86E8F388BB7DA5BAF74ADE078F43D96456D088C8A0B2A370159DFB8D4A4BC51BCDA91F2DCD01B2EC610C62AA33FAD1688p-504", 512, 16)
|
52
52
|
], 512)
|
53
53
|
actual = input.atan(MPC::MPC_RNDNZ, 512, 512)
|
54
|
-
actual.real.
|
55
|
-
actual.imag.
|
54
|
+
expect(actual.real).to eq GMP::F.new("0x6487ED5110B4611A62633145C06E0E68948127044533E63A0105DF531D89CD9128A5043CC71A026EF7CA8CD9E69D218D98158536F92F8A1BA7F09AB6B6A8E123p-510", 512, 16)
|
55
|
+
expect(actual.imag).to eq GMP::F.new("0x5D137113B914461DA3202D77346EE4980DA5FD0BAD68F5A7928DCA9F632750D9BFFA00654C523929F15DED554EC6BC476DB2C46FA433E569227085E0BDEA86FFp-509", 512, 16)
|
56
56
|
end
|
57
57
|
|
58
|
-
it '
|
58
|
+
it 'calculates the inverse tangent of a pure imaginary argument, 12 precision' do
|
59
59
|
input = MPC.new([
|
60
60
|
GMP::F(0, 12),
|
61
61
|
GMP::F("0x9380000000", 12, 16)
|
62
62
|
], 12)
|
63
63
|
actual = input.atan
|
64
|
-
actual.real.
|
65
|
-
actual.imag.
|
64
|
+
expect(actual.real).to eq GMP::F.new("0xC91p-11", 12, 16)
|
65
|
+
expect(actual.imag).to eq GMP::F.new("0x6F1p-50", 12, 16)
|
66
66
|
end
|
67
67
|
|
68
|
-
it '
|
68
|
+
it 'calculates the inverse tangent of a general inputs' do
|
69
69
|
data = [
|
70
70
|
[["0x91EA521228BFC46ACAp-118", 72, 16], ["-0x9E96A01DBAD6470974p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], ["-0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDUN],
|
71
71
|
[["0x91EA521228BFC46AC9p-118", 72, 16], ["-0x9E96A01DBAD6470974p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], ["-0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDDD],
|
@@ -76,34 +76,34 @@ describe MPC, '#atan' do
|
|
76
76
|
]
|
77
77
|
data.each do |expected_real, expected_imag, input_real, input_imag, rounding_mode|
|
78
78
|
actual = MPC.new([GMP::F(*input_real), GMP::F(*input_imag)], 72).atan(rounding_mode)
|
79
|
-
actual.real.
|
80
|
-
actual.imag.
|
79
|
+
expect(actual.real).to eq GMP::F.new(*expected_real)
|
80
|
+
expect(actual.imag).to eq GMP::F.new(*expected_imag)
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
-
it '
|
84
|
+
it 'calculates the inverse tangent of a general inputs, 156 precision' do
|
85
85
|
input = MPC.new([
|
86
86
|
GMP::F("-0xF0CE58073F866A53F25DB85DE8D503FBDD81051p-109", 156, 16),
|
87
87
|
GMP::F( "0xCF81D7C76BB9754A52056CB0F144B0C6700CC8Cp-128", 156, 16)
|
88
88
|
], 156)
|
89
89
|
actual = input.atan
|
90
|
-
actual.real.
|
91
|
-
actual.imag.
|
90
|
+
expect(actual.real).to eq GMP::F.new("-0xC90FDAA22167B20DB08A0C3B1FF415CABE49624p-155", 156, 16)
|
91
|
+
expect(actual.imag).to eq GMP::F.new("0xEA84E971BD52E49CCEE036E303D5ECB2D9D9B9Ap-222", 156, 16)
|
92
92
|
end
|
93
93
|
|
94
|
-
it '
|
94
|
+
it 'calculates the inverse tangent of a general inputs, 2 precision' do
|
95
95
|
actual = MPC.new([GMP::F("0x1p-7", 2, 16), GMP::F(-1, 2, 16)], 2).atan
|
96
|
-
actual.real.
|
97
|
-
actual.imag.
|
96
|
+
expect(actual.real).to eq GMP::F.new( 0.75, 2, 16)
|
97
|
+
expect(actual.imag).to eq GMP::F.new(-3, 2, 16)
|
98
98
|
|
99
99
|
actual = MPC.new([GMP::F("0x1p-7", 2, 16), GMP::F(1, 2, 16)], 2).atan
|
100
|
-
actual.real.
|
101
|
-
actual.imag.
|
100
|
+
expect(actual.real).to eq GMP::F.new( 0.75, 2, 16)
|
101
|
+
expect(actual.imag).to eq GMP::F.new( 3, 2, 16)
|
102
102
|
end
|
103
103
|
|
104
|
-
it '
|
104
|
+
it 'calculates the inverse tangent: "improve test coverage"' do
|
105
105
|
actual = MPC.new([GMP::F("-0xa.529626a89a1960@23", 57, 16), GMP::F("-0x3.9a5472b5709e74@14", 57, 16)], 57).atan
|
106
|
-
actual.real.
|
107
|
-
actual.imag.
|
106
|
+
expect(actual.real).to eq GMP::F.new("-0x1.921fb54442d184", 57, 16)
|
107
|
+
expect(actual.imag).to eq GMP::F.new("-0x8.a7e33db93ecf18@-34", 57, 16)
|
108
108
|
end
|
109
109
|
end
|
data/spec/fma_spec.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
describe MPC, "#fma" do
|
4
|
+
before do
|
5
|
+
@a = MPC.new([2, 0])
|
6
|
+
@b = MPC.new([1, 2])
|
7
|
+
@c = MPC.new([2, 2])
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns the product of an MPC and the first argument, and summed with the second argument" do
|
11
|
+
expect(@a.fma(@b, @c)).to eq(MPC.new([4, 6]))
|
12
|
+
end
|
13
|
+
|
14
|
+
it "accepts hash options" do
|
15
|
+
result = @a.fma(@b, @c, prec: 32)
|
16
|
+
expect(result).to eq(MPC.new([4, 6]))
|
17
|
+
expect(result.real.prec).to eq 32
|
18
|
+
expect(result.imag.prec).to eq 32
|
19
|
+
end
|
20
|
+
end
|
data/spec/imag_spec.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
describe MPC, "#imag" do
|
4
|
+
it "returns the imaginary part of an MPC generated with a Fixnum" do
|
5
|
+
expect(MPC.new(0).imag).to eq GMP::F(0)
|
6
|
+
expect(MPC.new(1).imag).to eq GMP::F(0)
|
7
|
+
expect(MPC.new([0, 1]).imag).to eq GMP::F(1)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns the imaginary part of an MPC generated with a GMP::Z" do
|
11
|
+
expect(MPC.new(GMP::Z(0)).imag).to eq GMP::F(0)
|
12
|
+
expect(MPC.new(GMP::Z(1)).imag).to eq GMP::F(0)
|
13
|
+
expect(MPC.new([GMP::Z(7), GMP::Z(2**64)]).imag).to eq GMP::F(2**64)
|
14
|
+
expect(MPC.new([GMP::Z(0), GMP::Z(1)]).imag).to eq GMP::F(1)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "returns the imaginary part an MPC generated with a Float" do
|
18
|
+
expect(MPC.new(0.0).imag).to eq GMP::F(0)
|
19
|
+
expect(MPC.new([0.0, 1.0]).imag).to eq GMP::F(1)
|
20
|
+
expect(MPC.new([1.0, 1.0]).imag).to eq GMP::F(1)
|
21
|
+
expect(MPC.new([2*Math::PI, Math::PI]).imag).to eq GMP::F(Math::PI)
|
22
|
+
end
|
23
|
+
end
|
data/spec/log10_spec.rb
CHANGED
@@ -1,26 +1,34 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
2
|
|
3
3
|
# All tests adapted from MPC 1.0.1's tests/log10.dat
|
4
|
-
describe MPC, '#
|
5
|
-
it '
|
4
|
+
describe MPC, '#log10' do
|
5
|
+
it 'calculates the base 10 logarithm of +1 +- i*0' do
|
6
|
+
pending("log10 introduced in MPC 1.0.0") if MPC::MPC_VERSION[0] == "0"
|
7
|
+
|
6
8
|
actual = MPC.new([1, 0], 2).log10
|
7
|
-
actual.real.
|
8
|
-
actual.imag.
|
9
|
+
expect(actual.real).to eq 0
|
10
|
+
expect(actual.imag).to eq 0
|
9
11
|
end
|
10
12
|
|
11
|
-
it '
|
13
|
+
it 'calculates the base 10 logarithm of 10 +- i*0' do
|
14
|
+
pending("log10 introduced in MPC 1.0.0") if MPC::MPC_VERSION[0] == "0"
|
15
|
+
|
12
16
|
actual = MPC.new([GMP::F(10, 4), GMP::F(0, 2)]).log10
|
13
|
-
actual.real.
|
14
|
-
actual.imag.
|
17
|
+
expect(actual.real).to eq 1
|
18
|
+
expect(actual.imag).to eq 0
|
15
19
|
end
|
16
20
|
|
17
|
-
it '
|
21
|
+
it 'calculates the base 10 logarithm of 100 +- i*0' do
|
22
|
+
pending("log10 introduced in MPC 1.0.0") if MPC::MPC_VERSION[0] == "0"
|
23
|
+
|
18
24
|
actual = MPC.new([GMP::F(100, 5), GMP::F(0, 2)]).log10
|
19
|
-
actual.real.
|
20
|
-
actual.imag.
|
25
|
+
expect(actual.real).to eq 2
|
26
|
+
expect(actual.imag).to eq 0
|
21
27
|
end
|
22
28
|
|
23
|
-
it '
|
29
|
+
it 'calculates the base 10 logarithm of x +i*y with either x or y zero and the other non-zero' do
|
30
|
+
pending("log10 introduced in MPC 1.0.0") if MPC::MPC_VERSION[0] == "0"
|
31
|
+
|
24
32
|
data = [
|
25
33
|
[["0x13afeb354b7d97p-52", 53, 16], [ 0, 2], MPC.new([GMP::F( "0x11", 5, 16), GMP::F(0, 2)]), MPC::MPC_RNDNN],
|
26
34
|
[["0x13afeb354b7d97p-52", 53, 16], [ "0x15d47c4cb2fba1p-53", 53, 16], MPC.new([GMP::F(0, 2), GMP::F( "0x11", 5, 16)]), MPC::MPC_RNDNN],
|
@@ -30,8 +38,8 @@ describe MPC, '#log' do
|
|
30
38
|
]
|
31
39
|
data.each do |expected_real, expected_imag, input, rounding_mode|
|
32
40
|
actual = input.log10(rounding_mode)
|
33
|
-
actual.real.
|
34
|
-
actual.imag.
|
41
|
+
expect(actual.real).to eq GMP::F.new(*expected_real)
|
42
|
+
expect(actual.imag).to eq GMP::F.new(*expected_imag)
|
35
43
|
end
|
36
44
|
end
|
37
45
|
|
@@ -7,35 +7,35 @@ describe "MPC_SINGLE_FUNCTION args" do
|
|
7
7
|
:sinh, :cosh, :tanh,
|
8
8
|
:asin, :acos, :atan
|
9
9
|
]
|
10
|
-
@z = MPC.new(0
|
10
|
+
@z = MPC.new(0)
|
11
11
|
end
|
12
12
|
it "should accept no arguments" do
|
13
13
|
@functions.each do |func|
|
14
|
-
expect { @z.send(func) }.to_not raise_error
|
14
|
+
expect { @z.send(func) }.to_not raise_error
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
it "should accept a single rounding mode argument, MPC_RNDNN" do
|
19
19
|
@functions.each do |func|
|
20
|
-
expect { @z.send(func, MPC::MPC_RNDNN) }.to_not raise_error
|
20
|
+
expect { @z.send(func, MPC::MPC_RNDNN) }.to_not raise_error
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should accept a single rounding mode argument, MPC_RNDZD" do
|
25
25
|
@functions.each do |func|
|
26
|
-
expect { @z.send(func, MPC::MPC_RNDZD) }.to_not raise_error
|
26
|
+
expect { @z.send(func, MPC::MPC_RNDZD) }.to_not raise_error
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
it "should accept a single rounding mode argument and a single precision" do
|
31
31
|
@functions.each do |func|
|
32
|
-
expect { @z.send(func, MPC::MPC_RNDZZ, 128) }.to_not raise_error
|
32
|
+
expect { @z.send(func, MPC::MPC_RNDZZ, 128) }.to_not raise_error
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
36
|
it "should accept a single rounding mode argument and two precisions" do
|
37
37
|
@functions.each do |func|
|
38
|
-
expect { @z.send(func, MPC::MPC_RNDZZ, 128, 256) }.to_not raise_error
|
38
|
+
expect { @z.send(func, MPC::MPC_RNDZZ, 128, 256) }.to_not raise_error
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
data/spec/new_spec.rb
CHANGED
@@ -8,81 +8,95 @@ describe MPC, '#initialize without precision or rounding args' do
|
|
8
8
|
@q2 = GMP::Q(-2,3)
|
9
9
|
@f1 = GMP::F(1.5)
|
10
10
|
@f2 = GMP::F(-2.5)
|
11
|
+
@big_2_64 = 2**64
|
12
|
+
@big_2_65 = 2**65
|
13
|
+
@z_2_64 = GMP::Z(2**64)
|
14
|
+
@z_2_65 = GMP::Z(2**65)
|
11
15
|
end
|
12
|
-
it '
|
16
|
+
it 'does not raise anything when initialized with no args' do
|
13
17
|
expect { MPC.new() }.to_not raise_error
|
14
18
|
end
|
15
19
|
|
16
|
-
it '
|
20
|
+
it 'does not raise anything when initialized with 0' do
|
17
21
|
expect { MPC.new(0) }.to_not raise_error
|
18
22
|
end
|
19
23
|
|
20
|
-
it '
|
24
|
+
it 'does not raise anything when initialized with a negative Fixnum' do
|
21
25
|
expect { MPC.new(-32) }.to_not raise_error
|
22
26
|
end
|
23
27
|
|
24
|
-
it '
|
28
|
+
it 'does not raise anything when initialized with a positive Fixnum' do
|
25
29
|
expect { MPC.new(32) }.to_not raise_error
|
26
30
|
end
|
27
31
|
|
28
|
-
it
|
32
|
+
it "can be instantiated from a Bignum" do
|
33
|
+
expect { MPC.new(@big_2_64) }.to_not raise_error
|
34
|
+
expect(MPC.new(@big_2_64)).to eq(MPC.new(@z_2_64))
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'does not raise anything when initialized with 0.0' do
|
29
38
|
expect { MPC.new(0.0) }.to_not raise_error
|
30
39
|
end
|
31
40
|
|
32
|
-
it '
|
41
|
+
it 'does not raise anything when initialized with a positive Float' do
|
33
42
|
expect { MPC.new(3.14) }.to_not raise_error
|
34
43
|
expect { MPC.new(1.618) }.to_not raise_error
|
35
44
|
end
|
36
45
|
|
37
|
-
it '
|
46
|
+
it 'does not raise anything when initialized with a positive GMP::Z' do
|
38
47
|
expect { MPC.new(@z1) }.to_not raise_error
|
39
48
|
end
|
40
49
|
|
41
|
-
it '
|
50
|
+
it 'does not raise anything when initialized with a negative GMP::Z' do
|
42
51
|
expect { MPC.new(@z2) }.to_not raise_error
|
43
52
|
end
|
44
53
|
|
45
|
-
it '
|
54
|
+
it 'does not raise anything when initialized with a positive GMP::Q' do
|
46
55
|
expect { MPC.new(@q1) }.to_not raise_error
|
47
56
|
end
|
48
57
|
|
49
|
-
it '
|
58
|
+
it 'does not raise anything when initialized with a negative GMP::Q' do
|
50
59
|
expect { MPC.new(@q2) }.to_not raise_error
|
51
60
|
end
|
52
61
|
|
53
|
-
it '
|
62
|
+
it 'does not raise anything when initialized with a positive GMP::F' do
|
54
63
|
expect { MPC.new(@f1) }.to_not raise_error
|
55
64
|
end
|
56
65
|
|
57
|
-
it '
|
66
|
+
it 'does not raise anything when initialized with a negative GMP::F' do
|
58
67
|
expect { MPC.new(@f2) }.to_not raise_error
|
59
68
|
end
|
60
69
|
|
61
|
-
it '
|
62
|
-
expect { MPC.new([0,0]) }.to_not raise_error
|
70
|
+
it 'does not raise anything when initialized with an Array of 0\'s' do
|
71
|
+
expect { MPC.new([0, 0]) }.to_not raise_error
|
63
72
|
end
|
64
73
|
|
65
|
-
it '
|
74
|
+
it 'does not raise anything when initialized with an Array of Fixnum\'s' do
|
66
75
|
expect { MPC.new([-2**10, 2**11]) }.to_not raise_error
|
67
76
|
end
|
68
77
|
|
69
|
-
it
|
78
|
+
it "can be instantiated from two Bignums" do
|
79
|
+
expect { MPC.new([@big_2_64, @big_2_65]) }.to_not raise_error
|
80
|
+
expect(MPC.new([@big_2_64, @big_2_65])).to eq(MPC.new([@z_2_64, @z_2_65]))
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'does not raise anything when initialized with an Array of Float\'s' do
|
70
84
|
expect { MPC.new([1.4142135623730951, 1.4142135623730951]) }.to_not raise_error
|
71
85
|
end
|
72
86
|
|
73
|
-
it '
|
87
|
+
it 'does not raise anything when initialized with an Array of GMP::Z\'s' do
|
74
88
|
expect { MPC.new([@z1, @z2]) }.to_not raise_error
|
75
89
|
end
|
76
90
|
|
77
|
-
it '
|
91
|
+
it 'does not raise anything when initialized with an Array of GMP::Q\'s' do
|
78
92
|
expect { MPC.new([@q1, @q2]) }.to_not raise_error
|
79
93
|
end
|
80
94
|
|
81
|
-
it '
|
95
|
+
it 'does not raise anything when initialized with an Array of GMP::F\'s' do
|
82
96
|
expect { MPC.new([@f1, @f2]) }.to_not raise_error
|
83
97
|
end
|
84
98
|
|
85
|
-
it '
|
99
|
+
it 'raises TypeError when initialized with an Array of mixed types' do
|
86
100
|
expect { MPC.new([0, 0.0]) }.to raise_error(TypeError)
|
87
101
|
expect { MPC.new([0, @z1]) }.to raise_error(TypeError)
|
88
102
|
expect { MPC.new([@f1, 0.0]) }.to raise_error(TypeError)
|
@@ -90,8 +104,25 @@ describe MPC, '#initialize without precision or rounding args' do
|
|
90
104
|
expect { MPC.new([@q1, 42]) }.to raise_error(TypeError)
|
91
105
|
end
|
92
106
|
|
93
|
-
it '
|
94
|
-
MPC.new(0).
|
95
|
-
MPC.new(0.0).
|
107
|
+
it 'initializes default values correctly' do
|
108
|
+
expect(MPC.new(0)).to eq MPC.new()
|
109
|
+
expect(MPC.new(0.0)).to eq MPC.new()
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'raises when the precision is out-of-bounds' do
|
113
|
+
expect { MPC.new(0, -1) }.to raise_error(RangeError)
|
114
|
+
expect { MPC.new(0, 0) }.to raise_error(RangeError)
|
115
|
+
expect { MPC.new(0, 1) }.to raise_error(RangeError)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe MPC, '#initialize with precision arguments' do
|
120
|
+
it "accepts a shared precision" do
|
121
|
+
expect(MPC.new(7, 32).prec).to eq(32)
|
122
|
+
end
|
123
|
+
|
124
|
+
it "accepts individual precisions" do
|
125
|
+
expect(MPC.new(7, 32, 64).prec).to eq(0)
|
126
|
+
expect(MPC.new(7, 32, 64).prec2).to eq([32, 64])
|
96
127
|
end
|
97
128
|
end
|
data/spec/pow_spec.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
describe MPC, '#pow' do
|
4
|
+
before do
|
5
|
+
@w = MPC.new([0, 1])
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'calculates the value of a complex number raised to a Fixnum power' do
|
9
|
+
w = @w.pow 2
|
10
|
+
|
11
|
+
expect(w.real).to eq -1
|
12
|
+
expect(w.imag).to eq 0
|
13
|
+
|
14
|
+
w = @w.pow 3
|
15
|
+
|
16
|
+
expect(w.real).to eq 0
|
17
|
+
expect(w.imag).to eq -1
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'calculates the value of a complex number raised to a GMP::Z power' do
|
21
|
+
w = @w.pow GMP::Z(4)
|
22
|
+
|
23
|
+
expect(w.real).to eq 1
|
24
|
+
expect(w.imag).to eq 0
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'calculates the value of a complaex number raised to a Float power' do
|
28
|
+
w = @w.pow 0.5
|
29
|
+
|
30
|
+
expect(w.real).to eq GMP::F(0.5).sqrt
|
31
|
+
expect(w.imag).to eq GMP::F(0.5).sqrt
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'calculates the value of a complaex number raised to a GMP::F power' do
|
35
|
+
w = @w.pow GMP::F(0.5)
|
36
|
+
|
37
|
+
expect(w.real).to eq GMP::F(0.5).sqrt
|
38
|
+
expect(w.imag).to eq GMP::F(0.5).sqrt
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe MPC, '#**' do
|
43
|
+
before do
|
44
|
+
@w = MPC.new([0, 1])
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'calculates the value of a complex number raised to a Fixnum power' do
|
48
|
+
w = @w ** 2
|
49
|
+
|
50
|
+
expect(w.real).to eq -1
|
51
|
+
expect(w.imag).to eq 0
|
52
|
+
|
53
|
+
w = @w ** 3
|
54
|
+
|
55
|
+
expect(w.real).to eq 0
|
56
|
+
expect(w.imag).to eq -1
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'calculates the value of a complex number raised to a GMP::Z power' do
|
60
|
+
w = @w ** GMP::Z(4)
|
61
|
+
|
62
|
+
expect(w.real).to eq 1
|
63
|
+
expect(w.imag).to eq 0
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'calculates the value of a complaex number raised to a Float power' do
|
67
|
+
w = @w ** 0.5
|
68
|
+
|
69
|
+
expect(w.real).to eq GMP::F(0.5).sqrt
|
70
|
+
expect(w.imag).to eq GMP::F(0.5).sqrt
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'calculates the value of a complaex number raised to a GMP::F power' do
|
74
|
+
w = @w ** GMP::F(0.5)
|
75
|
+
|
76
|
+
expect(w.real).to eq GMP::F(0.5).sqrt
|
77
|
+
expect(w.imag).to eq GMP::F(0.5).sqrt
|
78
|
+
end
|
79
|
+
end
|