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.
- 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
|