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,20 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe MPC, "#proj" do
4
+ it "should calculate the projection correctly" do
5
+ MPC.new([GMP::F(-1), -GMP::F(0)]).proj.real.should eq -1
6
+ MPC.new([GMP::F(-1), -GMP::F(0)]).proj.imag.should eq 0
7
+
8
+ MPC.new([-GMP::F(0), GMP::F(-1)]).proj.real.should eq 0
9
+ MPC.new([-GMP::F(0), GMP::F(-1)]).proj.imag.should eq -1
10
+
11
+ MPC.new([-GMP::F(0), -GMP::F(0)]).proj.real.should eq 0
12
+ MPC.new([-GMP::F(0), -GMP::F(0)]).proj.imag.should eq 0
13
+
14
+ MPC.new([-GMP::F(0), GMP::F(1)]).proj.real.should eq 0
15
+ MPC.new([-GMP::F(0), GMP::F(1)]).proj.imag.should eq 1
16
+
17
+ MPC.new([ GMP::F(1), GMP::F(0)]).proj.real.should eq 1
18
+ MPC.new([ GMP::F(1), GMP::F(0)]).proj.imag.should eq 0
19
+ end
20
+ end
@@ -0,0 +1,23 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe MPC, "#real" do
4
+ it "should return correctly for an MPC generated with a Fixnum" do
5
+ MPC.new(0).real.should eq GMP::F(0)
6
+ MPC.new(1).real.should eq GMP::F(1)
7
+ MPC.new([1, 1]).real.should eq GMP::F(1)
8
+ end
9
+
10
+ it "should return correctly for an MPC generated with a GMP::Z" do
11
+ MPC.new(GMP::Z(0)).real.should eq GMP::F(0)
12
+ MPC.new(GMP::Z(1)).real.should eq GMP::F(1)
13
+ MPC.new(GMP::Z(2**64)).real.should eq GMP::F(2**64)
14
+ MPC.new([GMP::Z(1), GMP::Z(1)]).real.should eq GMP::F(1)
15
+ end
16
+
17
+ it "should return correctly for an MPC generated with a Float" do
18
+ MPC.new(0.0).real.should eq GMP::F(0)
19
+ MPC.new(1.0).real.should eq GMP::F(1)
20
+ MPC.new([1.0, 1.0]).real.should eq GMP::F(1)
21
+ MPC.new([2*Math::PI, Math::PI]).real.should eq GMP::F(2*Math::PI)
22
+ end
23
+ end
@@ -0,0 +1,199 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe MPC::Rnd, '#mode' do
4
+ it 'should return MPC::MPC_RNDNN.mode correctly' do
5
+ MPC::MPC_RNDNN.mode.should eq 0
6
+ end
7
+
8
+ it 'should return MPC::MPC_RNDZN.mode correctly' do
9
+ MPC::MPC_RNDZN.mode.should eq 1
10
+ end
11
+
12
+ it 'should return MPC::MPC_RNDUN.mode correctly' do
13
+ MPC::MPC_RNDUN.mode.should eq 2
14
+ end
15
+
16
+ it 'should return MPC::MPC_RNDDN.mode correctly' do
17
+ MPC::MPC_RNDDN.mode.should eq 3
18
+ end
19
+
20
+ it 'should return MPC::MPC_RNDNZ.mode correctly' do
21
+ MPC::MPC_RNDNZ.mode.should eq 16
22
+ end
23
+
24
+ it 'should return MPC::MPC_RNDZZ.mode correctly' do
25
+ MPC::MPC_RNDZZ.mode.should eq 17
26
+ end
27
+
28
+ it 'should return MPC::MPC_RNDUZ.mode correctly' do
29
+ MPC::MPC_RNDUZ.mode.should eq 18
30
+ end
31
+
32
+ it 'should return MPC::MPC_RNDDZ.mode correctly' do
33
+ MPC::MPC_RNDDZ.mode.should eq 19
34
+ end
35
+
36
+ it 'should return MPC::MPC_RNDNU.mode correctly' do
37
+ MPC::MPC_RNDNU.mode.should eq 32
38
+ end
39
+
40
+ it 'should return MPC::MPC_RNDNU.mode correctly' do
41
+ MPC::MPC_RNDZU.mode.should eq 33
42
+ end
43
+
44
+ it 'should return MPC::MPC_RNDNU.mode correctly' do
45
+ MPC::MPC_RNDUU.mode.should eq 34
46
+ end
47
+
48
+ it 'should return MPC::MPC_RNDNU.mode correctly' do
49
+ MPC::MPC_RNDDU.mode.should eq 35
50
+ end
51
+
52
+ it 'should return MPC::MPC_RNDND.mode correctly' do
53
+ MPC::MPC_RNDND.mode.should eq 48
54
+ end
55
+
56
+ it 'should return MPC::MPC_RNDND.mode correctly' do
57
+ MPC::MPC_RNDZD.mode.should eq 49
58
+ end
59
+
60
+ it 'should return MPC::MPC_RNDND.mode correctly' do
61
+ MPC::MPC_RNDUD.mode.should eq 50
62
+ end
63
+
64
+ it 'should return MPC::MPC_RNDND.mode correctly' do
65
+ MPC::MPC_RNDDD.mode.should eq 51
66
+ end
67
+ end
68
+
69
+ describe MPC::Rnd, '#name' do
70
+ it 'should return MPC::MPC_RNDNN.name correctly' do
71
+ MPC::MPC_RNDNN.name.should eq 'MPC_RNDNN'
72
+ end
73
+
74
+ it 'should return MPC::MPC_RNDZN.name correctly' do
75
+ MPC::MPC_RNDZN.name.should eq 'MPC_RNDZN'
76
+ end
77
+
78
+ it 'should return MPC::MPC_RNDUN.name correctly' do
79
+ MPC::MPC_RNDUN.name.should eq 'MPC_RNDUN'
80
+ end
81
+
82
+ it 'should return MPC::MPC_RNDDN.name correctly' do
83
+ MPC::MPC_RNDDN.name.should eq 'MPC_RNDDN'
84
+ end
85
+
86
+ it 'should return MPC::MPC_RNDNZ.name correctly' do
87
+ MPC::MPC_RNDNZ.name.should eq 'MPC_RNDNZ'
88
+ end
89
+
90
+ it 'should return MPC::MPC_RNDZZ.name correctly' do
91
+ MPC::MPC_RNDZZ.name.should eq 'MPC_RNDZZ'
92
+ end
93
+
94
+ it 'should return MPC::MPC_RNDUZ.name correctly' do
95
+ MPC::MPC_RNDUZ.name.should eq 'MPC_RNDUZ'
96
+ end
97
+
98
+ it 'should return MPC::MPC_RNDDZ.name correctly' do
99
+ MPC::MPC_RNDDZ.name.should eq 'MPC_RNDDZ'
100
+ end
101
+
102
+ it 'should return MPC::MPC_RNDNU.name correctly' do
103
+ MPC::MPC_RNDNU.name.should eq 'MPC_RNDNU'
104
+ end
105
+
106
+ it 'should return MPC::MPC_RNDZU.name correctly' do
107
+ MPC::MPC_RNDZU.name.should eq 'MPC_RNDZU'
108
+ end
109
+
110
+ it 'should return MPC::MPC_RNDUU.name correctly' do
111
+ MPC::MPC_RNDUU.name.should eq 'MPC_RNDUU'
112
+ end
113
+
114
+ it 'should return MPC::MPC_RNDDU.name correctly' do
115
+ MPC::MPC_RNDDU.name.should eq 'MPC_RNDDU'
116
+ end
117
+
118
+ it 'should return MPC::MPC_RNDND.name correctly' do
119
+ MPC::MPC_RNDND.name.should eq 'MPC_RNDND'
120
+ end
121
+
122
+ it 'should return MPC::MPC_RNDZD.name correctly' do
123
+ MPC::MPC_RNDZD.name.should eq 'MPC_RNDZD'
124
+ end
125
+
126
+ it 'should return MPC::MPC_RNDUD.name correctly' do
127
+ MPC::MPC_RNDUD.name.should eq 'MPC_RNDUD'
128
+ end
129
+
130
+ it 'should return MPC::MPC_RNDDD.name correctly' do
131
+ MPC::MPC_RNDDD.name.should eq 'MPC_RNDDD'
132
+ end
133
+ end
134
+
135
+ describe MPC::Rnd, '#ieee754' do
136
+ it 'should return MPC::MPC_RNDNN.ieee754 correctly' do
137
+ MPC::MPC_RNDNN.ieee754.should eq '(roundTiesToEven,roundTiesToEven)'
138
+ end
139
+
140
+ it 'should return MPC::MPC_RNDZN.ieee754 correctly' do
141
+ MPC::MPC_RNDZN.ieee754.should eq '(roundTowardZero,roundTiesToEven)'
142
+ end
143
+
144
+ it 'should return MPC::MPC_RNDUN.ieee754 correctly' do
145
+ MPC::MPC_RNDUN.ieee754.should eq '(roundTowardPositive,roundTiesToEven)'
146
+ end
147
+
148
+ it 'should return MPC::MPC_RNDDN.ieee754 correctly' do
149
+ MPC::MPC_RNDDN.ieee754.should eq '(roundTowardNegative,roundTiesToEven)'
150
+ end
151
+
152
+ it 'should return MPC::MPC_RNDNZ.ieee754 correctly' do
153
+ MPC::MPC_RNDNZ.ieee754.should eq '(roundTiesToEven,roundTowardZero)'
154
+ end
155
+
156
+ it 'should return MPC::MPC_RNDZZ.ieee754 correctly' do
157
+ MPC::MPC_RNDZZ.ieee754.should eq '(roundTowardZero,roundTowardZero)'
158
+ end
159
+
160
+ it 'should return MPC::MPC_RNDUZ.ieee754 correctly' do
161
+ MPC::MPC_RNDUZ.ieee754.should eq '(roundTowardPositive,roundTowardZero)'
162
+ end
163
+
164
+ it 'should return MPC::MPC_RNDDZ.ieee754 correctly' do
165
+ MPC::MPC_RNDDZ.ieee754.should eq '(roundTowardNegative,roundTowardZero)'
166
+ end
167
+
168
+ it 'should return MPC::MPC_RNDNU.ieee754 correctly' do
169
+ MPC::MPC_RNDNU.ieee754.should eq '(roundTiesToEven,roundTowardPositive)'
170
+ end
171
+
172
+ it 'should return MPC::MPC_RNDZU.ieee754 correctly' do
173
+ MPC::MPC_RNDZU.ieee754.should eq '(roundTowardZero,roundTowardPositive)'
174
+ end
175
+
176
+ it 'should return MPC::MPC_RNDUU.ieee754 correctly' do
177
+ MPC::MPC_RNDUU.ieee754.should eq '(roundTowardPositive,roundTowardPositive)'
178
+ end
179
+
180
+ it 'should return MPC::MPC_RNDDU.ieee754 correctly' do
181
+ MPC::MPC_RNDDU.ieee754.should eq '(roundTowardNegative,roundTowardPositive)'
182
+ end
183
+
184
+ it 'should return MPC::MPC_RNDND.ieee754 correctly' do
185
+ MPC::MPC_RNDND.ieee754.should eq '(roundTiesToEven,roundTowardNegative)'
186
+ end
187
+
188
+ it 'should return MPC::MPC_RNDZD.ieee754 correctly' do
189
+ MPC::MPC_RNDZD.ieee754.should eq '(roundTowardZero,roundTowardNegative)'
190
+ end
191
+
192
+ it 'should return MPC::MPC_RNDUD.ieee754 correctly' do
193
+ MPC::MPC_RNDUD.ieee754.should eq '(roundTowardPositive,roundTowardNegative)'
194
+ end
195
+
196
+ it 'should return MPC::MPC_RNDDD.ieee754 correctly' do
197
+ MPC::MPC_RNDDD.ieee754.should eq '(roundTowardNegative,roundTowardNegative)'
198
+ end
199
+ end
@@ -0,0 +1,66 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/sin.dat
4
+ describe MPC, '#sin' do
5
+ it 'should calculate the sine of a pure real argument' do
6
+ data = [
7
+ ["0x4787C62AC28Bp-48", MPC.new([GMP::F(-6), GMP::F(0)])],
8
+ ["0xC1BDCEEEE0F57p-52", MPC.new([GMP::F(-4), GMP::F(0)])],
9
+ ["-0xE8C7B7568DA23p-52", MPC.new([GMP::F(-2), GMP::F(0)])],
10
+ ["-0xD76AA47848677p-52", MPC.new([GMP::F(-1), GMP::F(0)])],
11
+ ["0xD76AA47848677p-52", MPC.new([GMP::F( 1), GMP::F(0)])],
12
+ ["0xE8C7B7568DA23p-52", MPC.new([GMP::F( 2), GMP::F(0)])],
13
+ ["-0xC1BDCEEEE0F57p-52", MPC.new([GMP::F( 4), GMP::F(0)])],
14
+ ["-0x4787C62AC28Bp-48", MPC.new([GMP::F( 6), GMP::F(0)])]
15
+ ]
16
+ data.each do |expected, input|
17
+ actual = input.sin
18
+ actual.real.should eq GMP::F.new(expected, 53, 16)
19
+ actual.imag.should eq GMP::F(0)
20
+ end
21
+ end
22
+
23
+ it 'should calculate the sine of a pure imaginary argument' do
24
+ data = [
25
+ ["-0x1936D22F67C805p-45", MPC.new([GMP::F(0), GMP::F(-6)])],
26
+ ["-0x1B4A3803703631p-48", MPC.new([GMP::F(0), GMP::F(-4)])],
27
+ ["-0x1D03CF63B6E19Fp-51", MPC.new([GMP::F(0), GMP::F(-2)])],
28
+ ["-0x966CFE2275CC1p-51", MPC.new([GMP::F(0), GMP::F(-1)])],
29
+ ["0x966CFE2275CC1p-51", MPC.new([GMP::F(0), GMP::F( 1)])],
30
+ ["0x1D03CF63B6E19Fp-51", MPC.new([GMP::F(0), GMP::F( 2)])],
31
+ ["0x1B4A3803703631p-48", MPC.new([GMP::F(0), GMP::F( 4)])],
32
+ ["0x1936D22F67C805p-45", MPC.new([GMP::F(0), GMP::F( 6)])]
33
+ ]
34
+ data.each do |expected, input|
35
+ actual = input.sin
36
+ actual.imag.should eq GMP::F.new(expected, 53, 16)
37
+ actual.real.should eq GMP::F(0)
38
+ end
39
+ end
40
+
41
+ it 'should calculate the sine of ieee-754 double precision numbers' do
42
+ data = [
43
+ [[514], ["-0x11B7CA26B51951p-97", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDNN],
44
+ [[514], ["-0x11B7CA26B51951p-97", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDNZ],
45
+ [[514], ["-0x11B7CA26B51951p-97", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDNU],
46
+ [[514], ["-0x8DBE5135A8CA9p-96", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDND],
47
+ [["0x100FFFFFFFFFFFp-43", 53, 16], ["-0x11B7CA26B51951p-97", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDZN],
48
+ [["0x100FFFFFFFFFFFp-43", 53, 16], ["-0x11B7CA26B51951p-97", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDZZ],
49
+ [["0x100FFFFFFFFFFFp-43", 53, 16], ["-0x11B7CA26B51951p-97", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDZU],
50
+ [["0x100FFFFFFFFFFFp-43", 53, 16], ["-0x8DBE5135A8CA9p-96", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDZD],
51
+ [[514], ["-0x11B7CA26B51951p-97", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDUN],
52
+ [[514], ["-0x11B7CA26B51951p-97", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDUZ],
53
+ [[514], ["-0x11B7CA26B51951p-97", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDUU],
54
+ [[514], ["-0x8DBE5135A8CA9p-96", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDUD],
55
+ [["0x100FFFFFFFFFFFp-43", 53, 16], ["-0x11B7CA26B51951p-97", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDDN],
56
+ [["0x100FFFFFFFFFFFp-43", 53, 16], ["-0x11B7CA26B51951p-97", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDDZ],
57
+ [["0x100FFFFFFFFFFFp-43", 53, 16], ["-0x11B7CA26B51951p-97", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDDU],
58
+ [["0x100FFFFFFFFFFFp-43", 53, 16], ["-0x8DBE5135A8CA9p-96", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], ["-0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDDD]
59
+ ]
60
+ data.each do |expected_real, expected_imag, input_real, input_imag, rounding_mode|
61
+ actual = MPC.new([GMP::F.new(*input_real), GMP::F.new(*input_imag)]).sin(rounding_mode)
62
+ actual.real.should eq GMP::F.new(*expected_real)
63
+ actual.imag.should eq GMP::F.new(*expected_imag)
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,65 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/sinh.dat
4
+ describe MPC, '#sinh' do
5
+ it 'should calculate the hyperbolic sine of a pure real argument' do
6
+ data = [
7
+ ["-0x12cd9fc44eb98p-48", MPC.new([GMP::F(-1, 7), GMP::F(0, 7)])],
8
+ [ "0x12cd9fc44eb98p-48", MPC.new([GMP::F( 1, 7), GMP::F(0, 7)])]
9
+ ]
10
+ data.each do |expected, input|
11
+ actual = input.sinh(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 hyperbolic sine of a pure real argument, using hash arguments' do
18
+ data = [
19
+ ["-0x12cd9fc44eb98p-48", MPC.new([GMP::F(-1, 7), GMP::F(0, 7)])],
20
+ [ "0x12cd9fc44eb98p-48", MPC.new([GMP::F( 1, 7), GMP::F(0, 7)])]
21
+ ]
22
+ data.each do |expected, input|
23
+ actual = input.sinh(:rounding_mode => MPC::MPC_RNDNN, :precision => 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 hyperbolic sine of a pure imaginary argument' do
30
+ data = [
31
+ ["-0xd76aa47848678p-52", MPC.new([GMP::F(0, 7), GMP::F(-1, 7)])],
32
+ [ "0xd76aa47848678p-52", MPC.new([GMP::F(0, 7), GMP::F( 1, 7)])]
33
+ ]
34
+ data.each do |expected, input|
35
+ actual = input.sinh(MPC::MPC_RNDNN, 50, 50)
36
+ actual.real.should eq GMP::F(0)
37
+ actual.imag.should eq GMP::F.new(expected, 50, 16)
38
+ end
39
+ end
40
+
41
+ it 'should calculate the hyperbolic sine of an argument with +1 and -1' do
42
+ data = [
43
+ ["-0xa28cfec023fc8p-52", "-0x14c67b74f6cc5p-48", MPC.new([GMP::F(-1, 7), GMP::F(-1, 7)])],
44
+ ["-0xa28cfec023fc8p-52", "0x14c67b74f6cc5p-48", MPC.new([GMP::F(-1, 7), GMP::F( 1, 7)])],
45
+ [ "0xa28cfec023fc8p-52", "-0x14c67b74f6cc5p-48", MPC.new([GMP::F( 1, 7), GMP::F(-1, 7)])],
46
+ [ "0xa28cfec023fc8p-52", "0x14c67b74f6cc5p-48", MPC.new([GMP::F( 1, 7), GMP::F( 1, 7)])],
47
+ ]
48
+ data.each do |expected_real, expected_imag, input|
49
+ actual = input.sinh(MPC::MPC_RNDNN, 50, 50)
50
+ actual.real.should eq GMP::F.new(expected_real, 50, 16)
51
+ actual.imag.should eq GMP::F.new(expected_imag, 50, 16)
52
+ end
53
+ end
54
+
55
+ it 'should calculate the hyperbolic sine of ieee-754 double precision numbers' do
56
+ data = [
57
+ [["0xF48D4FDF29C53p-105", 53, 16], [2], ["0x15124271980435p-52", 53, 16], ["0x3243F6A8885A3p-49", 53, 16], MPC::MPC_RNDNN],
58
+ ]
59
+ data.each do |expected_real, expected_imag, input_real, input_imag, rounding_mode|
60
+ actual = MPC.new([GMP::F.new(*input_real), GMP::F.new(*input_imag)]).sinh(rounding_mode)
61
+ actual.real.should eq GMP::F.new(*expected_real)
62
+ actual.imag.should eq GMP::F.new(*expected_imag)
63
+ end
64
+ end
65
+ end
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'mpc')
@@ -0,0 +1,96 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/sqr.dat
4
+ describe MPC, '#sqr' do
5
+ it 'should calculate the square of a pure real argument' do
6
+ data = [
7
+ [["0x12345676543230p+52", 53, 16], [ 0, 2], MPC.new([GMP::F( "0x1111111000000f", 53, 16), GMP::F(0, 17)]), MPC::MPC_RNDNN],
8
+ [["0x1234567654322fp+52", 53, 16], [ 0, 3], MPC.new([GMP::F("-0x1111111000000f", 54, 16), GMP::F(0, 16)]), MPC::MPC_RNDZN],
9
+ [["0x12345676543230p+52", 53, 16], [ 0, 4], MPC.new([GMP::F( "0x1111111000000f", 55, 16), GMP::F(0, 15)]), MPC::MPC_RNDUN],
10
+ [["0x1234567654322fp+52", 53, 16], [ 0, 5], MPC.new([GMP::F("-0x1111111000000f", 56, 16), GMP::F(0, 14)]), MPC::MPC_RNDDN],
11
+ [["0x1234567654322fp+52", 53, 16], [ 0, 6], MPC.new([GMP::F( "0x1111111000000f", 57, 16), GMP::F(0, 13)]), MPC::MPC_RNDZZ],
12
+ [["0x12345676543230p+52", 53, 16], [ 0, 7], MPC.new([GMP::F("-0x1111111000000f", 58, 16), GMP::F(0, 12)]), MPC::MPC_RNDUZ],
13
+ [["0x1234567654322fp+52", 53, 16], [ 0, 8], MPC.new([GMP::F( "0x1111111000000f", 59, 16), GMP::F(0, 11)]), MPC::MPC_RNDDZ],
14
+ [["0x12345676543230p+52", 53, 16], [ 0, 9], MPC.new([GMP::F("-0x1111111000000f", 60, 16), GMP::F(0, 10)]), MPC::MPC_RNDNZ],
15
+ [["0x12345676543230p+52", 53, 16], [ 0, 10], MPC.new([GMP::F( "0x1111111000000f", 61, 16), GMP::F(0, 9)]), MPC::MPC_RNDUU],
16
+ [["0x1234567654322fp+52", 53, 16], [ 0, 11], MPC.new([GMP::F("-0x1111111000000f", 62, 16), GMP::F(0, 8)]), MPC::MPC_RNDDU],
17
+ [["0x12345676543230p+52", 53, 16], [ 0, 12], MPC.new([GMP::F( "0x1111111000000f", 63, 16), GMP::F(0, 7)]), MPC::MPC_RNDNU],
18
+ [["0x1234567654322fp+52", 53, 16], [ 0, 13], MPC.new([GMP::F("-0x1111111000000f", 64, 16), GMP::F(0, 6)]), MPC::MPC_RNDZU],
19
+ [["0x1234567654322fp+52", 53, 16], [ 0, 14], MPC.new([GMP::F( "0x1111111000000f", 65, 16), GMP::F(0, 5)]), MPC::MPC_RNDDD],
20
+ [["0x12345676543230p+52", 53, 16], [ 0, 15], MPC.new([GMP::F("-0x1111111000000f", 66, 16), GMP::F(0, 4)]), MPC::MPC_RNDND],
21
+ [["0x1234567654322fp+52", 53, 16], [ 0, 16], MPC.new([GMP::F( "0x1111111000000f", 67, 16), GMP::F(0, 3)]), MPC::MPC_RNDZD],
22
+ [["0x12345676543230p+52", 53, 16], [ 0, 17], MPC.new([GMP::F("-0x1111111000000f", 68, 16), GMP::F(0, 2)]), MPC::MPC_RNDUD],
23
+ ]
24
+ data.each do |expected_real, expected_imag, input, rounding_mode|
25
+ actual = input.sqr(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 square of a pure imaginary argument' do
32
+ data = [
33
+ [["-0xE1000002000000p+56", 53, 16], [ 0, 53], MPC.new([GMP::F(0, 53), GMP::F( "0xf0000001111111", 53, 16)]), MPC::MPC_RNDNN],
34
+ [["-0xe1000001fffff8p+56", 53, 16], [ 0, 52], MPC.new([GMP::F(0, 51), GMP::F( "0xf0000001111111", 54, 16)]), MPC::MPC_RNDZN],
35
+ [["-0xe1000001fffff8p+56", 53, 16], [ 0, 51], MPC.new([GMP::F(0, 49), GMP::F("-0xf0000001111111", 55, 16)]), MPC::MPC_RNDUN],
36
+ [["-0xE1000002000000p+56", 53, 16], [ 0, 50], MPC.new([GMP::F(0, 47), GMP::F("-0xf0000001111111", 56, 16)]), MPC::MPC_RNDDN],
37
+ [["-0xe1000001fffff8p+56", 53, 16], [ 0, 49], MPC.new([GMP::F(0, 45), GMP::F( "0xf0000001111111", 57, 16)]), MPC::MPC_RNDZZ],
38
+ [["-0xe1000001fffff8p+56", 53, 16], [ 0, 48], MPC.new([GMP::F(0, 43), GMP::F( "0xf0000001111111", 58, 16)]), MPC::MPC_RNDUZ],
39
+ [["-0xE1000002000000p+56", 53, 16], [ 0, 47], MPC.new([GMP::F(0, 41), GMP::F("-0xf0000001111111", 59, 16)]), MPC::MPC_RNDDZ],
40
+ [["-0xE1000002000000p+56", 53, 16], [ 0, 46], MPC.new([GMP::F(0, 39), GMP::F("-0xf0000001111111", 60, 16)]), MPC::MPC_RNDNZ],
41
+ [["-0xe1000001fffff8p+56", 53, 16], [ 0, 45], MPC.new([GMP::F(0, 37), GMP::F( "0xf0000001111111", 61, 16)]), MPC::MPC_RNDUU],
42
+ [["-0xE1000002000000p+56", 53, 16], [ 0, 44], MPC.new([GMP::F(0, 35), GMP::F( "0xf0000001111111", 62, 16)]), MPC::MPC_RNDDU],
43
+ [["-0xE1000002000000p+56", 53, 16], [ 0, 43], MPC.new([GMP::F(0, 33), GMP::F("-0xf0000001111111", 63, 16)]), MPC::MPC_RNDNU],
44
+ [["-0xe1000001fffff8p+56", 53, 16], [ 0, 42], MPC.new([GMP::F(0, 31), GMP::F("-0xf0000001111111", 64, 16)]), MPC::MPC_RNDZU],
45
+ [["-0xE1000002000000p+56", 53, 16], [ 0, 41], MPC.new([GMP::F(0, 29), GMP::F("-0xf0000001111111", 65, 16)]), MPC::MPC_RNDDD],
46
+ [["-0xE1000002000000p+56", 53, 16], [ 0, 40], MPC.new([GMP::F(0, 27), GMP::F("-0xf0000001111111", 66, 16)]), MPC::MPC_RNDND],
47
+ [["-0xe1000001fffff8p+56", 53, 16], [ 0, 39], MPC.new([GMP::F(0, 25), GMP::F("-0xf0000001111111", 67, 16)]), MPC::MPC_RNDZD],
48
+ [["-0xe1000001fffff8p+56", 53, 16], [ 0, 38], MPC.new([GMP::F(0, 23), GMP::F("-0xf0000001111111", 68, 16)]), MPC::MPC_RNDUD],
49
+ ]
50
+ data.each do |expected_real, expected_imag, input, rounding_mode|
51
+ actual = input.sqr(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 square of a double precision number' do
58
+ data = [
59
+ [[ "0x10000000020000p+04", 53, 16], [ "0x10000000effff", 53, 16], [ "0x400008000180fp-22", 53, 16], [ "0x7ffff0077efcbp-32", 53, 16], MPC::MPC_RNDNN],
60
+ [[ "0x3ffffffffffffd", 53, 16], [ "0x7ffffffffffff4p+52", 53, 16], [ "0x1fffffffffffff", 53, 16], [ "0x1ffffffffffffe", 53, 16], MPC::MPC_RNDZN],
61
+ [[ "0x1c16e5d4c4d5e7p-45", 53, 16], ["-0x7ffffff800007p-47", 53, 16], [ "0xf", 53, 16], ["-0x1111111000000fp-53", 53, 16], MPC::MPC_RNDUN],
62
+ [[ "0xfdbac097c8dc50p+2096", 53, 16], [ "0x7f6e5d4c3b2a2p+1036", 53, 16], [ "0xfedcba9876543p+1024", 53, 16], [ "0x10000000000001p-42", 53, 16], MPC::MPC_RNDDN],
63
+ [["-0x10000000020000p+04", 53, 16], [ "0x10000000efffefp-04", 53, 16], [ "0x7ffff0077efcbp-32", 53, 16], [ "0x400008000180fp-22", 53, 16], MPC::MPC_RNDZZ],
64
+ [[ "0x3ffffffffffffe", 53, 16], ["-0x7ffffffffffff4p+52", 53, 16], [ "0x1fffffffffffff", 53, 16], ["-0x1ffffffffffffe", 53, 16], MPC::MPC_RNDUZ],
65
+ [[ "0xe0b72ea626af3p-44", 53, 16], [ "0x7ffffff800007p-47", 53, 16], [ "0xf", 53, 16], [ "0x1111111000000fp-53", 53, 16], MPC::MPC_RNDDZ],
66
+ [["-0xfdbac097c8dc58p+2096", 53, 16], [ "0x7f6e5d4c3b2a1cp+1032", 53, 16], ["-0x10000000000001p-42", 53, 16], ["-0xfedcba9876543p+1024", 53, 16], MPC::MPC_RNDNZ],
67
+ [[ "0x10000000020001p+04", 53, 16], ["-0x10000000efffefp-04", 53, 16], [ "0x400008000180fp-22", 53, 16], ["-0x7ffff0077efcbp-32", 53, 16], MPC::MPC_RNDUU],
68
+ [["-0x3ffffffffffffe", 53, 16], ["-0x7ffffffffffff4p+52", 53, 16], ["-0x1ffffffffffffe", 53, 16], [ "0x1fffffffffffff", 53, 16], MPC::MPC_RNDDU],
69
+ [["-0x1C16E5D4C4D5E7p-45", 53, 16], [ "0x1ffffffe00001dp-49", 53, 16], ["-0x1111111000000fp-53", 53, 16], ["-0xf", 53, 16], MPC::MPC_RNDNU],
70
+ [["-0xfdbac097c8dc50p+2096", 53, 16], ["-0x7f6e5d4c3b2a1cp+1032", 53, 16], [ "0x10000000000001p-42", 53, 16], ["-0xfedcba9876543p+1024", 53, 16], MPC::MPC_RNDZU],
71
+ [["-0x10000000020001p+04", 53, 16], ["-0x10000000effff", 53, 16], ["-0x7ffff0077efcbp-32", 53, 16], [ "0x400008000180fp-22", 53, 16], MPC::MPC_RNDDD],
72
+ [[ "0x3ffffffffffffd", 53, 16], ["-0x7ffffffffffff8p+52", 53, 16], ["-0x1fffffffffffff", 53, 16], [ "0x1ffffffffffffe", 53, 16], MPC::MPC_RNDND],
73
+ [["-0xE0B72EA626AF3p-44", 53, 16], ["-0x1FFFFFFE00001Dp-49", 53, 16], [ "0x1111111000000fp-53", 53, 16], ["-0xf", 53, 16], MPC::MPC_RNDZD],
74
+ [[ "0xfdbac097c8dc58p+2096", 53, 16], ["-0x7f6e5d4c3b2a2p+1036", 53, 16], ["-0xfedcba9876543p+1024", 53, 16], ["0x10000000000001p-42", 53, 16], MPC::MPC_RNDUD]
75
+ ]
76
+ data.each do |expected_real, expected_imag, input_real, input_imag, rounding_mode|
77
+ actual = MPC.new([GMP::F.new(*input_real), GMP::F(*input_imag)]).sqr(rounding_mode)
78
+ actual.real.should eq GMP::F.new(*expected_real)
79
+ actual.imag.should eq GMP::F.new(*expected_imag)
80
+ end
81
+ end
82
+
83
+ it 'should calculate the square: "improve test coverage"' do
84
+ actual = MPC.new([GMP::F(17592186044416, 30), GMP::F(536870913, 30)], 30).sqr
85
+ actual.real.should eq GMP::F.new(309485009533114692573069312, 30)
86
+ actual.imag.should eq GMP::F.new(18889465966662952943616, 30)
87
+ end
88
+
89
+ it 'should calculate the square: "improve test coverage"; a case where x+y or x-y are 0' do
90
+ actual = MPC.new([GMP::F(1, 4), GMP::F(1, 4)], 4).sqr
91
+ actual.real.should eq GMP::F.new(0, 4)
92
+ actual.imag.should eq GMP::F.new(2, 4)
93
+ end
94
+
95
+ ### There are still more tests in sqr.data, each a result of some bug or other thing
96
+ end