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