gnu_mpc 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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