gnu_mpc 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING.md +13 -0
- data/Gemfile +17 -0
- data/Guardfile +18 -0
- data/Makefile +12 -0
- data/README.md +47 -0
- data/Rakefile +54 -0
- data/ext/extconf.rb +46 -0
- data/ext/mpc.c +1010 -0
- data/ext/mpcrnd.c +194 -0
- data/ext/ruby_gmp.h +343 -0
- data/ext/ruby_mpc.h +63 -0
- data/lib/mpc.rb +30 -0
- data/manual.md +933 -0
- data/manual.pdf +0 -0
- data/manual_template.latex +177 -0
- data/spec/acos_spec.rb +66 -0
- data/spec/add_args_spec.rb +51 -0
- data/spec/add_fr_spec.rb +54 -0
- data/spec/add_spec.rb +32 -0
- data/spec/asin_spec.rb +66 -0
- data/spec/atan_spec.rb +109 -0
- data/spec/conj_spec.rb +56 -0
- data/spec/cos_spec.rb +54 -0
- data/spec/cosh_spec.rb +26 -0
- data/spec/exp_spec.rb +62 -0
- data/spec/hash_arguments_spec.rb +17 -0
- data/spec/log_spec.rb +37 -0
- data/spec/mpc_single_function_args_spec.rb +41 -0
- data/spec/neg_spec.rb +30 -0
- data/spec/new_spec.rb +97 -0
- data/spec/proj_spec.rb +20 -0
- data/spec/real_spec.rb +23 -0
- data/spec/rounding_spec.rb +199 -0
- data/spec/sin_spec.rb +66 -0
- data/spec/sinh_spec.rb +65 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/sqr_spec.rb +96 -0
- data/spec/sqrt_spec.rb +72 -0
- data/spec/sub_spec.rb +50 -0
- data/spec/tan_spec.rb +55 -0
- data/spec/tanh_spec.rb +53 -0
- data/spec/to_s_spec.rb +77 -0
- data/spec/version_spec.rb +7 -0
- metadata +91 -0
data/spec/proj_spec.rb
ADDED
@@ -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
|
data/spec/real_spec.rb
ADDED
@@ -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
|
data/spec/sin_spec.rb
ADDED
@@ -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
|
data/spec/sinh_spec.rb
ADDED
@@ -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
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'mpc')
|
data/spec/sqr_spec.rb
ADDED
@@ -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
|