gnu_mpc 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,109 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/atan.dat
4
+ describe MPC, '#atan' do
5
+ it 'should calculate the inverse tangent of a pure real argument' do
6
+ data = [
7
+ [["-0x16DCC57BB565FDp-52", 53, 16], [0], MPC.new([GMP::F(-7 ), -GMP::F(0)])],
8
+ [["-0x1F730BD281F69Bp-53", 53, 16], [0], MPC.new([GMP::F(-1.5 ), -GMP::F(0)])],
9
+ [["-0x1921FB54442D18p-53", 53, 16], [0], MPC.new([GMP::F(-1 ), -GMP::F(0)])],
10
+ [["-0x1700A7C5784634p-53", 53, 16], [0], MPC.new([GMP::F(-0.875), -GMP::F(0)])],
11
+ [["-0x1FD5BA9AAC2F6Ep-56", 53, 16], [0], MPC.new([GMP::F(-0.125), -GMP::F(0)])],
12
+ [[ "0x1FD5BA9AAC2F6Ep-56", 53, 16], [0], MPC.new([GMP::F( 0.125), -GMP::F(0)])],
13
+ [[ "0x1700A7C5784634p-53", 53, 16], [0], MPC.new([GMP::F( 0.875), -GMP::F(0)])],
14
+ [[ "0x1921FB54442D18p-53", 53, 16], [0], MPC.new([GMP::F( 1 ), -GMP::F(0)])],
15
+ [[ "0x1F730BD281F69Bp-53", 53, 16], [0], MPC.new([GMP::F( 1.5 ), -GMP::F(0)])],
16
+ [[ "0x16DCC57BB565FDp-52", 53, 16], [0], MPC.new([GMP::F( 7 ), -GMP::F(0)])]
17
+ ]
18
+ data.each do |expected_real, expected_imag, input|
19
+ actual = input.atan
20
+ actual.real.should eq GMP::F.new(*expected_real)
21
+ actual.imag.should eq GMP::F.new(*expected_imag)
22
+ end
23
+ end
24
+
25
+ it 'should calculate the inverse tangent of a pure imaginary argument' do
26
+ data = [
27
+ [["-0x1921FB54442D18p-52", 53, 16], ["-0x1269621134DB92p-55", 53, 16], MPC.new([-GMP::F(0), GMP::F(-7 )])],
28
+ [[ "0x1921FB54442D18p-52", 53, 16], ["-0x1269621134DB92p-55", 53, 16], MPC.new([ GMP::F(0), GMP::F(-7 )])],
29
+ [["-0x1921FB54442D18p-52", 53, 16], ["-0x19C041F7ED8D33p-53", 53, 16], MPC.new([-GMP::F(0), GMP::F(-1.5 )])],
30
+ [[ "0x1921FB54442D18p-52", 53, 16], ["-0x19C041F7ED8D33p-53", 53, 16], MPC.new([ GMP::F(0), GMP::F(-1.5 )])],
31
+ [[0], ["-0x15AA16394D481Fp-52", 53, 16], MPC.new([-GMP::F(0), GMP::F(-0.875)])],
32
+ [[0], ["-0x1015891C9EAEF7p-55", 53, 16], MPC.new([-GMP::F(0), GMP::F(-0.125)])],
33
+ [[0], [ "0x1015891C9EAEF7p-55", 53, 16], MPC.new([-GMP::F(0), GMP::F( 0.125)])],
34
+ [[0], [ "0x15AA16394D481Fp-52", 53, 16], MPC.new([-GMP::F(0), GMP::F( 0.875)])],
35
+ [[ "0x1921FB54442D18p-52", 53, 16], [ "0x19C041F7ED8D33p-53", 53, 16], MPC.new([ GMP::F(0), GMP::F( 1.5 )])],
36
+ [["-0x1921FB54442D18p-52", 53, 16], [ "0x19C041F7ED8D33p-53", 53, 16], MPC.new([-GMP::F(0), GMP::F( 1.5 )])],
37
+ [[ "0x1921FB54442D18p-52", 53, 16], [ "0x1269621134DB92p-55", 53, 16], MPC.new([ GMP::F(0), GMP::F( 7 )])],
38
+ [["-0x1921FB54442D18p-52", 53, 16], [ "0x1269621134DB92p-55", 53, 16], MPC.new([-GMP::F(0), GMP::F( 7 )])],
39
+ [[0], [ "0x1FFFFFFFFFFF82p-52", 53, 16], MPC.new([ GMP::F(0), GMP::F("0x1ED9505E1BC3C2p-53", 53, 16)])]
40
+ ]
41
+ data.each do |expected_real, expected_imag, input|
42
+ actual = input.atan
43
+ actual.real.should eq GMP::F.new(*expected_real)
44
+ actual.imag.should eq GMP::F.new(*expected_imag)
45
+ end
46
+ end
47
+
48
+ it 'should calculate the inverse tangent of a pure imaginary argument, 512 precision' do
49
+ input = MPC.new([
50
+ GMP::F(0, 512),
51
+ GMP::F("0x1018734E311AB77B710F9212969B3C86E8F388BB7DA5BAF74ADE078F43D96456D088C8A0B2A370159DFB8D4A4BC51BCDA91F2DCD01B2EC610C62AA33FAD1688p-504", 512, 16)
52
+ ], 512)
53
+ actual = input.atan(MPC::MPC_RNDNZ, 512, 512)
54
+ actual.real.should eq GMP::F.new("0x6487ED5110B4611A62633145C06E0E68948127044533E63A0105DF531D89CD9128A5043CC71A026EF7CA8CD9E69D218D98158536F92F8A1BA7F09AB6B6A8E123p-510", 512, 16)
55
+ actual.imag.should eq GMP::F.new("0x5D137113B914461DA3202D77346EE4980DA5FD0BAD68F5A7928DCA9F632750D9BFFA00654C523929F15DED554EC6BC476DB2C46FA433E569227085E0BDEA86FFp-509", 512, 16)
56
+ end
57
+
58
+ it 'should calculate the inverse tangent of a pure imaginary argument, 12 precision' do
59
+ input = MPC.new([
60
+ GMP::F(0, 12),
61
+ GMP::F("0x9380000000", 12, 16)
62
+ ], 12)
63
+ actual = input.atan
64
+ actual.real.should eq GMP::F.new("0xC91p-11", 12, 16)
65
+ actual.imag.should eq GMP::F.new("0x6F1p-50", 12, 16)
66
+ end
67
+
68
+ it 'should calculate the inverse tangent of a general inputs' do
69
+ data = [
70
+ [["0x91EA521228BFC46ACAp-118", 72, 16], ["-0x9E96A01DBAD6470974p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], ["-0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDUN],
71
+ [["0x91EA521228BFC46AC9p-118", 72, 16], ["-0x9E96A01DBAD6470974p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], ["-0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDDD],
72
+ [["0x91EA521228BFC46AC9p-118", 72, 16], ["-0x9E96A01DBAD6470973p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], ["-0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDDU],
73
+ [["0x91EA521228BFC46ACAp-118", 72, 16], [ "0x9E96A01DBAD6470974p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], [ "0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDUN],
74
+ [["0x91EA521228BFC46AC9p-118", 72, 16], [ "0x9E96A01DBAD6470974p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], [ "0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDDU],
75
+ [["0x91EA521228BFC46AC9p-118", 72, 16], [ "0x9E96A01DBAD6470973p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], [ "0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDDD],
76
+ ]
77
+ data.each do |expected_real, expected_imag, input_real, input_imag, rounding_mode|
78
+ actual = MPC.new([GMP::F(*input_real), GMP::F(*input_imag)], 72).atan(rounding_mode)
79
+ actual.real.should eq GMP::F.new(*expected_real)
80
+ actual.imag.should eq GMP::F.new(*expected_imag)
81
+ end
82
+ end
83
+
84
+ it 'should calculate the inverse tangent of a general inputs, 156 precision' do
85
+ input = MPC.new([
86
+ GMP::F("-0xF0CE58073F866A53F25DB85DE8D503FBDD81051p-109", 156, 16),
87
+ GMP::F( "0xCF81D7C76BB9754A52056CB0F144B0C6700CC8Cp-128", 156, 16)
88
+ ], 156)
89
+ actual = input.atan
90
+ actual.real.should eq GMP::F.new("-0xC90FDAA22167B20DB08A0C3B1FF415CABE49624p-155", 156, 16)
91
+ actual.imag.should eq GMP::F.new("0xEA84E971BD52E49CCEE036E303D5ECB2D9D9B9Ap-222", 156, 16)
92
+ end
93
+
94
+ it 'should calculate the inverse tangent of a general inputs, 2 precision' do
95
+ actual = MPC.new([GMP::F("0x1p-7", 2, 16), GMP::F(-1, 2, 16)], 2).atan
96
+ actual.real.should eq GMP::F.new( 0.75, 2, 16)
97
+ actual.imag.should eq GMP::F.new(-3, 2, 16)
98
+
99
+ actual = MPC.new([GMP::F("0x1p-7", 2, 16), GMP::F(1, 2, 16)], 2).atan
100
+ actual.real.should eq GMP::F.new( 0.75, 2, 16)
101
+ actual.imag.should eq GMP::F.new( 3, 2, 16)
102
+ end
103
+
104
+ it 'should calculate the inverse tangent: "improve test coverage"' do
105
+ actual = MPC.new([GMP::F("-0xa.529626a89a1960@23", 57, 16), GMP::F("-0x3.9a5472b5709e74@14", 57, 16)], 57).atan
106
+ actual.real.should eq GMP::F.new("-0x1.921fb54442d184", 57, 16)
107
+ actual.imag.should eq GMP::F.new("-0x8.a7e33db93ecf18@-34", 57, 16)
108
+ end
109
+ end
@@ -0,0 +1,56 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/conj.dat
4
+ describe MPC, '#conj' do
5
+ it 'should calculate the conjugate of a pure real number' do
6
+ data = [
7
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 2], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 17)]), MPC::MPC_RNDNN],
8
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 3], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 16)]), MPC::MPC_RNDZN],
9
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 4], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 15)]), MPC::MPC_RNDUN],
10
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 5], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 14)]), MPC::MPC_RNDDN],
11
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 6], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 13)]), MPC::MPC_RNDZZ],
12
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 7], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 12)]), MPC::MPC_RNDUZ],
13
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 8], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 11)]), MPC::MPC_RNDDZ],
14
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 9], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 10)]), MPC::MPC_RNDNZ],
15
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 10], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 9)]), MPC::MPC_RNDUU],
16
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 11], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 8)]), MPC::MPC_RNDDU],
17
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 12], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 7)]), MPC::MPC_RNDNU],
18
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 13], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 6)]), MPC::MPC_RNDZU],
19
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 14], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 5)]), MPC::MPC_RNDDD],
20
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 15], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 4)]), MPC::MPC_RNDND],
21
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 16], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 3)]), MPC::MPC_RNDZD],
22
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 17], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 2)]), MPC::MPC_RNDUD],
23
+ ]
24
+ data.each do |expected_real, expected_imag, input, rounding_mode|
25
+ actual = input.conj(rounding_mode)
26
+ actual.real.should eq GMP::F.new(*expected_real)
27
+ actual.imag.should eq GMP::F.new(*expected_imag)
28
+ end
29
+ end
30
+
31
+ it 'should calculate the conjugate of a pure imaginary argument' do
32
+ data = [
33
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 53), GMP::F( "0x123456789abcdep+52", 53, 16)]), MPC::MPC_RNDNN],
34
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 51), GMP::F( "0x123456789abcdep+52", 54, 16)]), MPC::MPC_RNDZN],
35
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 49), GMP::F("-0x123456789abcdep+52", 55, 16)]), MPC::MPC_RNDUN],
36
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 47), GMP::F("-0x123456789abcdep+52", 56, 16)]), MPC::MPC_RNDUN],
37
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 45), GMP::F( "0x123456789abcdep+52", 57, 16)]), MPC::MPC_RNDZZ],
38
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 43), GMP::F( "0x123456789abcdep+52", 58, 16)]), MPC::MPC_RNDUZ],
39
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 41), GMP::F("-0x123456789abcdep+52", 59, 16)]), MPC::MPC_RNDDZ],
40
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 39), GMP::F("-0x123456789abcdep+52", 60, 16)]), MPC::MPC_RNDNZ],
41
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 37), GMP::F( "0x123456789abcdep+52", 61, 16)]), MPC::MPC_RNDUU],
42
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 35), GMP::F( "0x123456789abcdep+52", 62, 16)]), MPC::MPC_RNDDU],
43
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 33), GMP::F("-0x123456789abcdep+52", 63, 16)]), MPC::MPC_RNDNU],
44
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 31), GMP::F("-0x123456789abcdep+52", 64, 16)]), MPC::MPC_RNDZU],
45
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 29), GMP::F( "0x123456789abcdep+52", 65, 16)]), MPC::MPC_RNDDD],
46
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 27), GMP::F( "0x123456789abcdep+52", 66, 16)]), MPC::MPC_RNDND],
47
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 25), GMP::F("-0x123456789abcdep+52", 67, 16)]), MPC::MPC_RNDZD],
48
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 23), GMP::F("-0x123456789abcdep+52", 68, 16)]), MPC::MPC_RNDUD]
49
+ ]
50
+ data.each do |expected_real, expected_imag, input, rounding_mode|
51
+ actual = input.conj(rounding_mode)
52
+ actual.real.should eq GMP::F.new(*expected_real)
53
+ actual.imag.should eq GMP::F.new(*expected_imag)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,54 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/cos.dat
4
+ describe MPC, '#cos' do
5
+ it 'should calculate the cosine of a pure real argument' do
6
+ data = [
7
+ ["0x8a51407da8344p-52", MPC.new([GMP::F(-1, 7), GMP::F(0, 7)])],
8
+ ["0x8a51407da8344p-52", MPC.new([GMP::F( 1, 7), GMP::F(0, 7)])]
9
+ ]
10
+ data.each do |expected, input|
11
+ actual = input.cos(MPC::MPC_RNDNN, 50, 50)
12
+ actual.real.should eq GMP::F.new(expected, 50, 16)
13
+ actual.imag.should eq GMP::F(0)
14
+ end
15
+ end
16
+
17
+ it 'should calculate the cosine of a pure imaginary argument' do
18
+ data = [
19
+ ["0x18b07551d9f55p-48", MPC.new([GMP::F(0, 7), GMP::F(-1, 7)])],
20
+ ["0x18b07551d9f55p-48", MPC.new([GMP::F(0, 7), GMP::F( 1, 7)])]
21
+ ]
22
+ data.each do |expected, input|
23
+ actual = input.cos(MPC::MPC_RNDNN, 50, 50)
24
+ actual.real.should eq GMP::F.new(expected, 50, 16)
25
+ actual.imag.should eq GMP::F(0)
26
+ end
27
+ end
28
+
29
+ it 'should calculate the cosine of an argument with +1 and -1' do
30
+ data = [
31
+ ["0xd56f54b7a1accp-52", "-0xfd28666957478p-52", MPC.new([GMP::F(-1, 7), GMP::F(-1, 7)])],
32
+ ["0xd56f54b7a1accp-52", "0xfd28666957478p-52", MPC.new([GMP::F(-1, 7), GMP::F( 1, 7)])],
33
+ ["0xd56f54b7a1accp-52", "0xfd28666957478p-52", MPC.new([GMP::F( 1, 7), GMP::F(-1, 7)])],
34
+ ["0xd56f54b7a1accp-52", "-0xfd28666957478p-52", MPC.new([GMP::F( 1, 7), GMP::F( 1, 7)])]
35
+ ]
36
+ data.each do |expected_real, expected_imag, input|
37
+ actual = input.cos(MPC::MPC_RNDNN, 50, 50)
38
+ actual.real.should eq GMP::F.new(expected_real, 50, 16)
39
+ actual.imag.should eq GMP::F.new(expected_imag, 50, 16)
40
+ end
41
+ end
42
+
43
+ it 'should calculate the cosine of ieee-754 double precision numbers' do
44
+ data = [
45
+ [[514], [0], [0], ["0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDNN],
46
+ [["0x100FFFFFFFFFFFp-43", 53, 16], [0], [0], ["0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDDD],
47
+ ]
48
+ data.each do |expected_real, expected_imag, input_real, input_imag, rounding_mode|
49
+ actual = MPC.new([GMP::F.new(*input_real), GMP::F.new(*input_imag)]).cos(rounding_mode)
50
+ actual.real.should eq GMP::F.new(*expected_real)
51
+ actual.imag.should eq GMP::F.new(*expected_imag)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,26 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/cosh.dat
4
+ describe MPC, '#cosh' do
5
+ it 'should calculate the hyperbolic cosine of special values' do
6
+ data = [
7
+ [1, MPC.new([GMP::F(0, 2), GMP::F(0, 2)])]
8
+ ]
9
+ data.each do |expected, input|
10
+ actual = input.cosh(MPC::MPC_RNDNN, 2, 2)
11
+ actual.real.should eq GMP::F.new(expected, 2)
12
+ actual.imag.should eq GMP::F(0)
13
+ end
14
+ end
15
+
16
+ it 'should calculate the hyperbolic sine of ieee-754 double precision numbers' do
17
+ data = [
18
+ [["0x10000000000001p-53", 53, 16], ["0x10000000000001p-52", 53, 16], ["0x1DA2E1BD2C9EBCp-53", 53, 16], ["0x138AADEA15829Fp-52", 53, 16], MPC::MPC_RNDNN],
19
+ ]
20
+ data.each do |expected_real, expected_imag, input_real, input_imag, rounding_mode|
21
+ actual = MPC.new([GMP::F.new(*input_real), GMP::F.new(*input_imag)]).cosh(rounding_mode)
22
+ actual.real.should eq GMP::F.new(*expected_real)
23
+ actual.imag.should eq GMP::F.new(*expected_imag)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,62 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/exp.dat
4
+ describe MPC, '#exp' do
5
+ it 'should calculate the exponential of a pure real number' do
6
+ data = [
7
+ [["0x1936dc5690c08fp-44", 53, 16], [ 0, 2], MPC.new([GMP::F( 6, 53), GMP::F(0, 17)]), MPC::MPC_RNDNN],
8
+ [["0x4b0556e084f3d0p-60", 53, 16], [ 0, 3], MPC.new([GMP::F(-4, 54), GMP::F(0, 16)]), MPC::MPC_RNDZN],
9
+ [["0xec7325c6a6ed70p-53", 53, 16], [ 0, 4], MPC.new([GMP::F( 2, 55), GMP::F(0, 15)]), MPC::MPC_RNDUN],
10
+ [["0x178b56362cef37p-54", 53, 16], [ 0, 5], MPC.new([GMP::F(-1, 56), GMP::F(0, 14)]), MPC::MPC_RNDDN],
11
+ [["0x3699205c4e74b0p-48", 53, 16], [ 0, 6], MPC.new([GMP::F( 4, 57), GMP::F(0, 13)]), MPC::MPC_RNDZZ],
12
+ [["0x454aaa8efe0730p-57", 53, 16], [ 0, 7], MPC.new([GMP::F(-2, 58), GMP::F(0, 12)]), MPC::MPC_RNDUZ],
13
+ [["0x15bf0a8b145769p-51", 53, 16], [ 0, 8], MPC.new([GMP::F( 1, 59), GMP::F(0, 11)]), MPC::MPC_RNDDZ],
14
+ [["0xa2728f889ea6b0p-64", 53, 16], [ 0, 9], MPC.new([GMP::F(-6, 60), GMP::F(0, 10)]), MPC::MPC_RNDNZ],
15
+ [["0xec7325c6a6ed70p-53", 53, 16], [ 0, 10], MPC.new([GMP::F( 2, 61), GMP::F(0, 9)]), MPC::MPC_RNDUU],
16
+ [["0x178b56362cef37p-54", 53, 16], [ 0, 11], MPC.new([GMP::F(-1, 62), GMP::F(0, 8)]), MPC::MPC_RNDDU],
17
+ [["0x1936dc5690c08fp-44", 53, 16], [ 0, 12], MPC.new([GMP::F( 6, 63), GMP::F(0, 7)]), MPC::MPC_RNDNU],
18
+ [["0x4b0556e084f3d0p-60", 53, 16], [ 0, 13], MPC.new([GMP::F(-4, 64), GMP::F(0, 6)]), MPC::MPC_RNDZU],
19
+ [["0x15bf0a8b145769p-51", 53, 16], [ 0, 14], MPC.new([GMP::F( 1, 65), GMP::F(0, 5)]), MPC::MPC_RNDDD],
20
+ [["0xa2728f889ea6b0p-64", 53, 16], [ 0, 15], MPC.new([GMP::F(-6, 66), GMP::F(0, 4)]), MPC::MPC_RNDND],
21
+ [["0x3699205c4e74b0p-48", 53, 16], [ 0, 16], MPC.new([GMP::F( 4, 66), GMP::F(0, 3)]), MPC::MPC_RNDZD],
22
+ [["0x454aaa8efe0730p-57", 53, 16], [ 0, 17], MPC.new([GMP::F(-2, 66), GMP::F(0, 2)]), MPC::MPC_RNDUD]
23
+ ]
24
+ data.each do |expected_real, expected_imag, input, rounding_mode|
25
+ actual = input.exp(rounding_mode)
26
+ actual.real.should eq GMP::F.new(*expected_real)
27
+ actual.imag.should eq GMP::F.new(*expected_imag)
28
+ end
29
+ end
30
+
31
+ it 'should calculate the exponential of a pure imaginary number' do
32
+ data = [
33
+ [[ "0x1eb9b7097822f5p-53", 53, 16], ["-0x4787c62ac28b0p-52", 53, 16], MPC.new([GMP::F(0,53), GMP::F( 6, 53)]), MPC::MPC_RNDNN],
34
+ [["-0x53aa981b6c9300p-55", 53, 16], ["-0xc1bdceeee0f57p-52", 53, 16], MPC.new([GMP::F(0,51), GMP::F( 4, 54)]), MPC::MPC_RNDZN],
35
+ [["-0x6a88995d4dc810p-56", 53, 16], ["-0xe8c7b7568da23p-52", 53, 16], MPC.new([GMP::F(0,49), GMP::F(-2, 55)]), MPC::MPC_RNDUN],
36
+ [[ "0x114a280fb5068bp-53", 53, 16], ["-0xd76aa47848677p-52", 53, 16], MPC.new([GMP::F(0,47), GMP::F(-1, 56)]), MPC::MPC_RNDDN],
37
+ [["-0x53aa981b6c9300p-55", 53, 16], ["-0xc1bdceeee0f57p-52", 53, 16], MPC.new([GMP::F(0,45), GMP::F( 4, 57)]), MPC::MPC_RNDZZ],
38
+ [["-0x6a88995d4dc810p-56", 53, 16], [ "0x1d18f6ead1b445p-53", 53, 16], MPC.new([GMP::F(0,43), GMP::F( 2, 58)]), MPC::MPC_RNDUZ],
39
+ [[ "0x114a280fb5068bp-53", 53, 16], ["-0xd76aa47848677p-52", 53, 16], MPC.new([GMP::F(0,41), GMP::F(-1, 59)]), MPC::MPC_RNDDZ],
40
+ [[ "0x1eb9b7097822f5p-53", 53, 16], [ "0x4787c62ac28b0p-52", 53, 16], MPC.new([GMP::F(0,39), GMP::F(-6, 60)]), MPC::MPC_RNDNZ],
41
+ [["-0x6a88995d4dc810p-56", 53, 16], [ "0xe8c7b7568da23p-52", 53, 16], MPC.new([GMP::F(0,37), GMP::F( 2, 61)]), MPC::MPC_RNDUU],
42
+ [[ "0x114a280fb5068bp-53", 53, 16], [ "0x1aed548f090cefp-53", 53, 16], MPC.new([GMP::F(0,35), GMP::F( 1, 62)]), MPC::MPC_RNDDU],
43
+ [[ "0x1eb9b7097822f5p-53", 53, 16], [ "0x11e1f18ab0a2c1p-54", 53, 16], MPC.new([GMP::F(0,33), GMP::F(-6, 63)]), MPC::MPC_RNDNU],
44
+ [["-0x53aa981b6c9300p-55", 53, 16], [ "0x1837b9dddc1eafp-53", 53, 16], MPC.new([GMP::F(0,31), GMP::F(-4, 64)]), MPC::MPC_RNDZU],
45
+ [[ "0x114a280fb5068bp-53", 53, 16], [ "0xd76aa47848677p-52", 53, 16], MPC.new([GMP::F(0,29), GMP::F( 1, 65)]), MPC::MPC_RNDDD],
46
+ [[ "0x1eb9b7097822f5p-53", 53, 16], ["-0x11e1f18ab0a2c1p-54", 53, 16], MPC.new([GMP::F(0,27), GMP::F( 6, 66)]), MPC::MPC_RNDND],
47
+ [["-0x53aa981b6c9300p-55", 53, 16], [ "0xc1bdceeee0f57p-52", 53, 16], MPC.new([GMP::F(0,25), GMP::F(-4, 67)]), MPC::MPC_RNDZD],
48
+ [["-0x6a88995d4dc810p-56", 53, 16], ["-0xe8c7b7568da23p-52", 53, 16], MPC.new([GMP::F(0,23), GMP::F(-2, 68)]), MPC::MPC_RNDUD]
49
+ ]
50
+ data.each do |expected_real, expected_imag, input, rounding_mode|
51
+ actual = input.exp(rounding_mode)
52
+ actual.real.should eq GMP::F.new(*expected_real)
53
+ actual.imag.should eq GMP::F.new(*expected_imag)
54
+ end
55
+ end
56
+
57
+ it 'should calculate the exponential of input close to zero' do
58
+ actual = MPC.new([GMP::F("0x1E02AE0D0F6Fp-7213521", 53, 16), GMP::F("0x5D7A2148071Fp-7213522", 53, 16)]).exp(MPC::MPC_RNDNN)
59
+ actual.real.should eq GMP::F(1)
60
+ actual.imag.should eq GMP::F("0x5D7A2148071Fp-7213522", 53, 16)
61
+ end
62
+ end
@@ -0,0 +1,17 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe MPC, "methods with optional hash arguments" do
4
+ before do
5
+ #@z_sqr = MPC.new([GMP::F("0x10000000020000p+04", 53, 16), GMP::F("0x10000000effff", 53, 16)])
6
+ #@z = MPC.new([GMP::F("0x400008000180fp-22", 53, 16), GMP::F("0x7ffff0077efcbp-32", 53, 16)])
7
+ @z_sqr = MPC.new([GMP::F("-0x10000000020000p+04", 53, 16), GMP::F("0x10000000efffefp-04", 53, 16)])
8
+ @z = MPC.new([GMP::F("0x7ffff0077efcbp-32", 53, 16), GMP::F("0x400008000180fp-22", 53, 16)])
9
+ end
10
+
11
+ it "should allow #sqr to accept :rounding_mode hash argument" do
12
+ @z.sqr(:rounding_mode => MPC::MPC_RNDZZ).should eq @z_sqr
13
+ @z.sqr(:rounding => MPC::MPC_RNDZZ).should eq @z_sqr
14
+ @z.sqr(:round => MPC::MPC_RNDZZ).should eq @z_sqr
15
+ @z.sqr(:rnd => MPC::MPC_RNDZZ).should eq @z_sqr
16
+ end
17
+ end
@@ -0,0 +1,37 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/log.dat
4
+ describe MPC, '#log' do
5
+ it 'should calculate the logarithm of 1 + 0i' do
6
+ actual = MPC.new([1, 0]).log
7
+ actual.real.should eq 0
8
+ actual.imag.should eq 0
9
+ end
10
+
11
+ it 'should calculate the logarithm of -1 + 0i' do
12
+ actual = MPC.new([-1, 0]).log
13
+ actual.real.should eq 0
14
+ actual.imag.should eq GMP::F("0x3243F6A8885A3p-48", 53, 16)
15
+
16
+ actual = MPC.new([GMP::F(-1), -GMP::F(0)]).log
17
+ actual.real.should eq 0
18
+ actual.imag.should eq GMP::F("-0x3243F6A8885A3p-48", 53, 16)
19
+ end
20
+
21
+ it 'should calculate the logarithm of x +i*y with either x or y zero and the other non-zero' do
22
+ data = [
23
+ [["0xB5535E0FD3FBDp-50", 53, 16], [ 0, 2], MPC.new([GMP::F( "0x11", 5, 16), GMP::F(0, 2)]), MPC::MPC_RNDNN],
24
+ [["0xB5535E0FD3FBDp-50", 53, 16], [ "0x3243F6A8885A3p-49", 53, 16], MPC.new([GMP::F(0, 2), GMP::F( "0x11", 5, 16)]), MPC::MPC_RNDNN],
25
+ [["0x5E38D81812CCBp-49", 53, 16], [ "0x3243F6A8885A3p-48", 53, 16], MPC.new([GMP::F("-0x13", 5, 16), GMP::F(0, 2)]), MPC::MPC_RNDNN],
26
+ [["0x5E38D81812CCBp-49", 53, 16], ["-0x3243F6A8885A3p-48", 53, 16], MPC.new([GMP::F("-0x13", 5, 16), -GMP::F(0, 2)]), MPC::MPC_RNDNN],
27
+ [["0x5E38D81812CCBp-49", 53, 16], ["-0x3243F6A8885A3p-49", 53, 16], MPC.new([GMP::F(0, 2), GMP::F("-0x13", 5, 16)]), MPC::MPC_RNDNN],
28
+ ]
29
+ data.each do |expected_real, expected_imag, input, rounding_mode|
30
+ actual = input.log(rounding_mode)
31
+ actual.real.should eq GMP::F.new(*expected_real)
32
+ actual.imag.should eq GMP::F.new(*expected_imag)
33
+ end
34
+ end
35
+
36
+ ### There are still more tests in log.data, each a result of some bug or other thing
37
+ end
@@ -0,0 +1,41 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe "MPC_SINGLE_FUNCTION args" do
4
+ before do
5
+ @functions = [
6
+ :sin, :cos, :tan,
7
+ :sinh, :cosh, :tanh,
8
+ :asin, :acos, :atan
9
+ ]
10
+ @z = MPC.new(0,0)
11
+ end
12
+ it "should accept no arguments" do
13
+ @functions.each do |func|
14
+ expect { @z.send(func) }.to_not raise_error(ArgumentError)
15
+ end
16
+ end
17
+
18
+ it "should accept a single rounding mode argument, MPC_RNDNN" do
19
+ @functions.each do |func|
20
+ expect { @z.send(func, MPC::MPC_RNDNN) }.to_not raise_error(ArgumentError)
21
+ end
22
+ end
23
+
24
+ it "should accept a single rounding mode argument, MPC_RNDZD" do
25
+ @functions.each do |func|
26
+ expect { @z.send(func, MPC::MPC_RNDZD) }.to_not raise_error(ArgumentError)
27
+ end
28
+ end
29
+
30
+ it "should accept a single rounding mode argument and a single precision" do
31
+ @functions.each do |func|
32
+ expect { @z.send(func, MPC::MPC_RNDZZ, 128) }.to_not raise_error(ArgumentError)
33
+ end
34
+ end
35
+
36
+ it "should accept a single rounding mode argument and two precisions" do
37
+ @functions.each do |func|
38
+ expect { @z.send(func, MPC::MPC_RNDZZ, 128, 256) }.to_not raise_error(ArgumentError)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,30 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/neg.dat
4
+ describe MPC, '#@-' do
5
+ it 'should calculate the negation of a pure real argument' do
6
+ data = [
7
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 2], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 17)]), MPC::MPC_RNDNN],
8
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 3], MPC.new([GMP::F("-0x123456789abcdep+52", 54, 16), GMP::F(0, 16)]), MPC::MPC_RNDZN],
9
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 4], MPC.new([GMP::F( "0x123456789abcdep+52", 55, 16), GMP::F(0, 15)]), MPC::MPC_RNDUN],
10
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 5], MPC.new([GMP::F("-0x123456789abcdep+52", 56, 16), GMP::F(0, 14)]), MPC::MPC_RNDDN],
11
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 6], MPC.new([GMP::F( "0x123456789abcdep+52", 57, 16), GMP::F(0, 13)]), MPC::MPC_RNDZZ],
12
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 7], MPC.new([GMP::F("-0x123456789abcdep+52", 58, 16), GMP::F(0, 12)]), MPC::MPC_RNDUZ],
13
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 8], MPC.new([GMP::F( "0x123456789abcdep+52", 59, 16), GMP::F(0, 11)]), MPC::MPC_RNDDZ],
14
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 9], MPC.new([GMP::F("-0x123456789abcdep+52", 60, 16), GMP::F(0, 10)]), MPC::MPC_RNDNZ],
15
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 10], MPC.new([GMP::F( "0x123456789abcdep+52", 61, 16), GMP::F(0, 9)]), MPC::MPC_RNDUU],
16
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 11], MPC.new([GMP::F("-0x123456789abcdep+52", 62, 16), GMP::F(0, 8)]), MPC::MPC_RNDDU],
17
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 12], MPC.new([GMP::F( "0x123456789abcdep+52", 63, 16), GMP::F(0, 7)]), MPC::MPC_RNDNU],
18
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 13], MPC.new([GMP::F("-0x123456789abcdep+52", 64, 16), GMP::F(0, 6)]), MPC::MPC_RNDZU],
19
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 14], MPC.new([GMP::F( "0x123456789abcdep+52", 65, 16), GMP::F(0, 5)]), MPC::MPC_RNDDD],
20
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 15], MPC.new([GMP::F("-0x123456789abcdep+52", 66, 16), GMP::F(0, 4)]), MPC::MPC_RNDND],
21
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 16], MPC.new([GMP::F( "0x123456789abcdep+52", 67, 16), GMP::F(0, 3)]), MPC::MPC_RNDZD],
22
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 17], MPC.new([GMP::F("-0x123456789abcdep+52", 68, 16), GMP::F(0, 2)]), MPC::MPC_RNDUD]
23
+ ]
24
+ data.each do |expected_real, expected_imag, input, rounding_mode|
25
+ actual = input.neg(rounding_mode)
26
+ actual.real.should eq GMP::F.new(*expected_real)
27
+ actual.imag.should eq GMP::F.new(*expected_imag)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,97 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe MPC, '#initialize without precision or rounding args' do
4
+ before do
5
+ @z1 = GMP::Z(8)
6
+ @z2 = GMP::Z(-13)
7
+ @q1 = GMP::Q(1,3)
8
+ @q2 = GMP::Q(-2,3)
9
+ @f1 = GMP::F(1.5)
10
+ @f2 = GMP::F(-2.5)
11
+ end
12
+ it 'should not raise anything when initialized with no args' do
13
+ expect { MPC.new() }.to_not raise_error
14
+ end
15
+
16
+ it 'should not raise anything when initialized with 0' do
17
+ expect { MPC.new(0) }.to_not raise_error
18
+ end
19
+
20
+ it 'should not raise anything when initialized with a negative Fixnum' do
21
+ expect { MPC.new(-32) }.to_not raise_error
22
+ end
23
+
24
+ it 'should not raise anything when initialized with a positive Fixnum' do
25
+ expect { MPC.new(32) }.to_not raise_error
26
+ end
27
+
28
+ it 'should not raise anything when initialized with 0.0' do
29
+ expect { MPC.new(0.0) }.to_not raise_error
30
+ end
31
+
32
+ it 'should not raise anything when initialized with a positive Float' do
33
+ expect { MPC.new(3.14) }.to_not raise_error
34
+ expect { MPC.new(1.618) }.to_not raise_error
35
+ end
36
+
37
+ it 'should not raise anything when initialized with a positive GMP::Z' do
38
+ expect { MPC.new(@z1) }.to_not raise_error
39
+ end
40
+
41
+ it 'should not raise anything when initialized with a negative GMP::Z' do
42
+ expect { MPC.new(@z2) }.to_not raise_error
43
+ end
44
+
45
+ it 'should not raise anything when initialized with a positive GMP::Q' do
46
+ expect { MPC.new(@q1) }.to_not raise_error
47
+ end
48
+
49
+ it 'should not raise anything when initialized with a negative GMP::Q' do
50
+ expect { MPC.new(@q2) }.to_not raise_error
51
+ end
52
+
53
+ it 'should not raise anything when initialized with a positive GMP::F' do
54
+ expect { MPC.new(@f1) }.to_not raise_error
55
+ end
56
+
57
+ it 'should not raise anything when initialized with a negative GMP::F' do
58
+ expect { MPC.new(@f2) }.to_not raise_error
59
+ end
60
+
61
+ it 'should not raise anything when initialized with an Array of 0\'s' do
62
+ expect { MPC.new([0,0]) }.to_not raise_error
63
+ end
64
+
65
+ it 'should not raise anything when initialized with an Array of Fixnum\'s' do
66
+ expect { MPC.new([-2**10, 2**11]) }.to_not raise_error
67
+ end
68
+
69
+ it 'should not raise anything when initialized with an Array of Float\'s' do
70
+ expect { MPC.new([1.4142135623730951, 1.4142135623730951]) }.to_not raise_error
71
+ end
72
+
73
+ it 'should not raise anything when initialized with an Array of GMP::Z\'s' do
74
+ expect { MPC.new([@z1, @z2]) }.to_not raise_error
75
+ end
76
+
77
+ it 'should not raise anything when initialized with an Array of GMP::Q\'s' do
78
+ expect { MPC.new([@q1, @q2]) }.to_not raise_error
79
+ end
80
+
81
+ it 'should not raise anything when initialized with an Array of GMP::F\'s' do
82
+ expect { MPC.new([@f1, @f2]) }.to_not raise_error
83
+ end
84
+
85
+ it 'should raise TypeError when initialized with an Array of mixed types' do
86
+ expect { MPC.new([0, 0.0]) }.to raise_error(TypeError)
87
+ expect { MPC.new([0, @z1]) }.to raise_error(TypeError)
88
+ expect { MPC.new([@f1, 0.0]) }.to raise_error(TypeError)
89
+ expect { MPC.new([@z1, @f1]) }.to raise_error(TypeError)
90
+ expect { MPC.new([@q1, 42]) }.to raise_error(TypeError)
91
+ end
92
+
93
+ it 'should initialize default values correctly' do
94
+ MPC.new(0).should eq MPC.new()
95
+ MPC.new(0.0).should eq MPC.new()
96
+ end
97
+ end