1# Some adhoc tests to check that signed zeroes are being dealt with correctly.
2# By no means exhaustive tests - they just deal with a known issue with
3# 64-bit builds and overloaded mul and div operations (which  should now be fixed).
4
5use warnings;
6use strict;
7use Math::MPC qw(:mpc);
8use Math::MPFR qw(:mpfr);
9
10print "1..15\n";
11
12my $ok;
13my $z = Math::MPC->new(0, 0);
14my $mul = -1;
15
16my $x = $z * $mul;
17if(Math::MPC::overload_string($x) eq '(-0 -0)') {$ok .= 'a'}
18else {warn "\n1a: got '",Math::MPC::overload_string($x), "'\nexpected '(-0 -0)'\n"}
19
20my $y = $z / $mul;
21if(Math::MPC::overload_string($y) eq '(-0 -0)') {$ok .= 'b'}
22else {warn "\n1b: got '",Math::MPC::overload_string($y), "'\nexpected '(-0 -0)'\n"}
23
24$z *= $mul;
25if(Math::MPC::overload_string($z) eq '(-0 -0)') {$ok .= 'c'}
26else {warn "\n1c: got '",Math::MPC::overload_string($z), "'\nexpected '(-0 -0)'\n"}
27
28$z *= $mul;
29if(Math::MPC::overload_string($z) eq '(0 0)') {$ok .= 'd'}
30else {warn "\n1d: got '",Math::MPC::overload_string($z), "'\nexpected '(0 0)'\n"}
31
32$z /= $mul;
33if(Math::MPC::overload_string($z) eq '(-0 -0)') {$ok .= 'e'}
34else {warn "\n1e: got '",Math::MPC::overload_string($z), "'\nexpected '(-0 -0)'\n"}
35
36if($ok eq 'abcde') {print "ok 1\n"}
37else {
38  warn "\$ok: $ok\n";
39  print "not ok 1\n";
40}
41
42$ok = '';
43Rmpc_set_ui_ui($z, 0, 0, MPC_RNDNN);
44$mul = -10.625;
45
46$x = $z * $mul;
47if(Math::MPC::overload_string($x) eq '(-0 -0)') {$ok .= 'a'}
48else {warn "\n2a: got '",Math::MPC::overload_string($x), "'\nexpected '(-0 -0)'\n"}
49
50$y = $z / $mul;
51if(Math::MPC::overload_string($y) eq '(-0 -0)') {$ok .= 'b'}
52else {warn "\n2b: got '",Math::MPC::overload_string($y), "'\nexpected '(-0 -0)'\n"}
53
54$z *= $mul;
55if(Math::MPC::overload_string($z) eq '(-0 -0)') {$ok .= 'c'}
56else {warn "\n2c: got '",Math::MPC::overload_string($z), "'\nexpected '(-0 -0)'\n"}
57
58$z *= $mul;
59if(Math::MPC::overload_string($z) eq '(0 0)') {$ok .= 'd'}
60else {warn "\n2d: got '",Math::MPC::overload_string($z), "'\nexpected '(0 0)'\n"}
61
62$z /= $mul;
63if(Math::MPC::overload_string($z) eq '(-0 -0)') {$ok .= 'e'}
64else {warn "\n2e: got '",Math::MPC::overload_string($z), "'\nexpected '(-0 -0)'\n"}
65
66if($ok eq 'abcde') {print "ok 2\n"}
67else {
68  warn "\$ok: $ok\n";
69  print "not ok 2\n";
70}
71
72$ok = '';
73my $_64i = Math::MPC::_has_longlong();
74my $_64d = Math::MPC::_has_longdouble();
75
76my $long = -15;
77my $double = -2.5;
78Rmpc_set_ui_ui($z, 10, 8, MPC_RNDNN);
79my $rop = Math::MPC->new();
80my $check = Math::MPFR->new();
81
82Rmpc_mul_d($rop, $z, $double, MPC_RNDNN);
83RMPC_RE($check, $rop);
84$ok .= 'a' if $check == -25;
85RMPC_IM($check, $rop);
86$ok .= 'b' if $check == -20;
87
88Rmpc_div_d($rop, $rop, $double, MPC_RNDNN);
89RMPC_RE($check, $rop);
90$ok .= 'c' if $check == 10;
91RMPC_IM($check, $rop);
92$ok .= 'd' if $check == 8;
93
94Rmpc_d_div($rop, $double, $z, MPC_RNDNN);
95RMPC_RE($check, $rop);
96$ok .= 'e' if ($check > -1.524390244e-1  && $check < -1.5243902439e-1) ;
97RMPC_IM($check, $rop);
98$ok .= 'f' if ($check < 0.12195122 && $check > 0.1219512195);
99
100if($ok eq 'abcdef') {print "ok 3\n"}
101else {
102  warn "\$ok: $ok\n";
103  print "not ok 3 \n";
104}
105
106$ok = '';
107
108if($_64i) {
109Rmpc_mul_sj($rop, $z, $long, MPC_RNDNN);
110RMPC_RE($check, $rop);
111$ok .= 'a' if $check == -150;
112RMPC_IM($check, $rop);
113$ok .= 'b' if $check == -120;
114
115Rmpc_div_sj($rop, $rop, $long, MPC_RNDNN);
116RMPC_RE($check, $rop);
117$ok .= 'c' if $check == 10;
118RMPC_IM($check, $rop);
119$ok .= 'd' if $check == 8;
120
121Rmpc_sj_div($rop, $long, $z, MPC_RNDNN);
122# (-9.1463414634146345e-1 7.3170731707317072e-1)
123RMPC_RE($check, $rop);
124$ok .= 'e' if ($check < -9.14634e-1 && $check > -9.1463415e-1) ;
125RMPC_IM($check, $rop);
126$ok .= 'f' if ($check < 7.3170732e-1 && $check > 7.3170731e-1);
127
128if($ok eq 'abcdef') {print "ok 4\n"}
129else {
130  warn "\$ok: $ok\n";
131  print "not ok 4 \n";
132}
133}
134else {
135  warn "Skipping test 4 - not built with intmax_t\n";
136  print "ok 4\n";
137}
138
139$ok = '';
140
141if($_64d) {
142Rmpc_mul_ld($rop, $z, $double, MPC_RNDNN);
143RMPC_RE($check, $rop);
144$ok .= 'a' if $check == -25;
145RMPC_IM($check, $rop);
146$ok .= 'b' if $check == -20;
147
148Rmpc_div_ld($rop, $rop, $double, MPC_RNDNN);
149RMPC_RE($check, $rop);
150$ok .= 'c' if $check == 10;
151RMPC_IM($check, $rop);
152$ok .= 'd' if $check == 8;
153
154Rmpc_ld_div($rop, $double, $z, MPC_RNDNN);
155RMPC_RE($check, $rop);
156$ok .= 'e' if ($check > -1.524390244e-1  && $check < -1.5243902439e-1) ;
157RMPC_IM($check, $rop);
158$ok .= 'f' if ($check < 0.12195122 && $check > 0.1219512195);
159
160if($ok eq 'abcdef') {print "ok 5\n"}
161else {
162  warn "\$ok: $ok\n";
163  print "not ok 5 \n";
164}
165}
166else {
167  warn "Skipping test 5 - no long double support\n";
168  print "ok 5\n";
169}
170
171my($p1, $p2) = (Math::MPC->new(1.1, 0.0), Math::MPC->new(1.1, '-0.0'));
172my($n1, $n2) = ($p1 * -1.0, $p2 * -1.0);
173
174################################
175
176Rmpc_acos($rop, $p1, MPC_RNDNN);
177
178RMPC_RE($check, $rop);
179
180if($check == 0) {print "ok 6\n"}
181else {
182  warn "\ntest 6: expected 0, got $check\n";
183  print "not ok 6\n";
184}
185
186RMPC_IM($check, $rop);
187
188if($check < -0.443568254 && $check > -0.4435682544) {print "ok 7\n"}
189else {
190  warn "\ntest 7: expected approx -0.443568254385, got $check\n";
191  print "not ok 7\n";
192}
193
194#################################
195
196Rmpc_acos($rop, $p2, MPC_RNDNN);
197
198RMPC_RE($check, $rop);
199
200if($check == 0) {print "ok 8\n"}
201else {
202  warn "\ntest 8: expected 0, got $check\n";
203  print "not ok 8\n";
204}
205
206RMPC_IM($check, $rop);
207
208if($check > 0.443568254 && $check < 0.4435682544) {print "ok 9\n"}
209else {
210  warn "\ntest 9: expected approx 0.443568254385, got $check\n";
211  print "not ok 9\n";
212}
213
214################################
215
216Rmpc_acos($rop, $n1, MPC_RNDNN);
217
218RMPC_RE($check, $rop);
219
220if($check > 3.141592653 && $check < 3.1415926536) {print "ok 10\n"}
221else {
222  warn "\ntest 10: expected approx 3.1415926535897931, got $check\n";
223  print "not ok 10\n";
224}
225
226RMPC_IM($check, $rop);
227
228if($check > 0.443568254 && $check < 0.4435682544) {print "ok 11\n"}
229else {
230  warn "\ntest 11: expected approx 0.443568254385, got $check\n";
231  print "not ok 11\n";
232}
233
234#################################
235
236Rmpc_acos($rop, $n2, MPC_RNDNN);
237
238RMPC_RE($check, $rop);
239
240if($check > 3.141592653 && $check < 3.1415926536) {print "ok 12\n"}
241else {
242  warn "\ntest 12: expected approx 3.1415926535897931, got $check\n";
243  print "not ok 12\n";
244}
245
246RMPC_IM($check, $rop);
247
248if($check < -0.443568254 && $check > -0.4435682544) {print "ok 13\n"}
249else {
250  warn "\ntest 13: expected approx -0.443568254385, got $check\n";
251  print "not ok 13\n";
252}
253
254#################################
255
256my $neg_one = Math::MPC->new(-1.0, 0.0);
257
258my $n3 = $p1 * $neg_one;
259
260################################
261
262Rmpc_acos($rop, $n3, MPC_RNDNN);
263
264RMPC_RE($check, $rop);
265
266if($check > 3.141592653 && $check < 3.1415926536) {print "ok 14\n"}
267else {
268  warn "\ntest 14: expected approx 3.1415926535897931, got $check\n";
269  print "not ok 14\n";
270}
271
272RMPC_IM($check, $rop);
273
274if($check < -0.443568254 && $check > -0.4435682544) {print "ok 15\n"}
275else {
276  warn "\ntest 15: expected approx -0.443568254385, got $check\n";
277  print "not ok 15\n";
278}
279
280#################################
281
282