1#!./parrot 2# Copyright (C) 2001-2011, Parrot Foundation. 3 4=head1 NAME 5 6t/op/trans.t - Trancendental Mathematical Ops 7 8=head1 SYNOPSIS 9 10 % prove t/op/trans.t 11 12=head1 DESCRIPTION 13 14Tests various transcendental operations 15 16=cut 17 18.loadlib 'trans_ops' 19 20.sub main :main 21 .include 'test_more.pir' 22 .local num epsilon 23 epsilon = _epsilon() 24 25 plan(111) 26 27 test_sin_n(epsilon) 28 test_sin_i(epsilon) 29 test_cos_n(epsilon) 30 test_cos_i(epsilon) 31 test_tan_n(epsilon) 32 test_tan_i(epsilon) 33 test_cot_n(epsilon) 34 test_cot_i(epsilon) 35 test_sec_n(epsilon) 36 test_sec_i(epsilon) 37 test_csc_n(epsilon) 38 test_csc_i(epsilon) 39 test_atan_n(epsilon) 40 test_atan_i(epsilon) 41 test_asin_n(epsilon) 42 test_asin_i(epsilon) 43 test_acos_n(epsilon) 44 test_acos_i(epsilon) 45 test_asec_n(epsilon) 46 test_asec_i(epsilon) 47 test_sinh_n(epsilon) 48 test_sinh_i(epsilon) 49 test_cosh_n(epsilon) 50 test_cosh_i(epsilon) 51 test_sech_n(epsilon) 52 test_sech_i(epsilon) 53 test_tanh_n(epsilon) 54 test_tanh_i(epsilon) 55 test_exp_n(epsilon) 56 test_ln_n(epsilon) 57 test_log2_n(epsilon) 58 test_log10_n(epsilon) 59 test_pow_p_p_p() 60 test_pow_p_p_i() 61 test_pow_p_p_n() 62 test_pow_n_nc_i(epsilon) 63 integer_overflow_with_pow() 64 e_raised_pi_time_i__plus_1_equal_0() 65.end 66 67.sub _pi 68 .return (3.1415926535897) 69.end 70 71.sub _e 72 .return (2.7182818459045) 73.end 74 75.sub _epsilon 76 .return (0.0001) 77.end 78 79.sub test_sin_n 80 .param num epsilon 81 82 $N0 = sin 0.0 83 is($N0, 0.0, "sin(0.0)", epsilon) 84 85 $N0 = sin 1.0 86 is($N0, 0.841471, "sin(1.0)", epsilon) 87 88 $N1 = _pi() 89 $N0 = sin $N1 90 is($N0, 0.0, "sin(pi)", epsilon) 91 92 $N1 = _pi() 93 $N1 = $N1 / 2 94 $N0 = sin $N1 95 is($N0, 1.0, "sin(pi/2)", epsilon) 96.end 97 98.sub test_sin_i 99 .param num epsilon 100 101 $N0 = sin 0 102 is($N0, 0.0, "sin(0)", epsilon) 103 104 $N0 = sin 1 105 is($N0, 0.841471, "sin(1)", epsilon) 106.end 107 108.sub test_cos_n 109 .param num epsilon 110 111 $N0 = cos 0.0 112 is($N0, 1.0, "cos(0.0)", epsilon) 113 114 $N0 = cos 1.0 115 is($N0, 0.540302, "cos(1.0)", epsilon) 116 117 $N1 = _pi() 118 $N0 = cos $N1 119 is($N0, -1.0, "cos(pi)", epsilon) 120 121 $N1 = _pi() 122 $N1 = $N1 / 2 123 $N0 = cos $N1 124 is($N0, 0.0, "cos(pi/2)", epsilon) 125.end 126 127.sub test_cos_i 128 .param num epsilon 129 130 $N0 = cos 0 131 is($N0, 1.0, "cos(0)", epsilon) 132 133 $N0 = cos 1 134 is($N0, 0.540302, "cos(1)", epsilon) 135.end 136 137.sub test_tan_n 138 .param num epsilon 139 140 $N0 = tan 0.0 141 is($N0, 0.0, "tan(0.0)", epsilon) 142 143 $N0 = tan 1.0 144 is($N0, 1.557408, "tan(1.0)", epsilon) 145.end 146 147.sub test_tan_i 148 .param num epsilon 149 150 $N0 = tan 0 151 is($N0, 0.0, "tan(0)", epsilon) 152 153 $N0 = tan 1 154 is($N0, 1.557408, "tan(1)", epsilon) 155.end 156 157.sub test_cot_n 158 .param num epsilon 159 160 $N0 = cot 0.5 161 is($N0, 1.8305, "cot(0.5)", epsilon) 162 163 $N0 = cot 1.0 164 is($N0, 0.64209, "cot(1.0)", epsilon) 165.end 166 167.sub test_cot_i 168 .param num epsilon 169 170 $N0 = cot 1 171 is($N0, 0.64209, "cot(1)", epsilon) 172 173 $N0 = cot 2 174 is($N0, -0.45766, "cot(2)", epsilon) 175.end 176 177.sub test_sec_n 178 .param num epsilon 179 180 $N1 = 1.0 181 $N2 = sec $N1 182 is($N2, 1.850816, "sec(1.0)", epsilon) 183 184 $N2 = sec 1.0 185 is($N2, 1.850816, "sec(1.0)", epsilon) 186.end 187 188.sub test_sec_i 189 .param num epsilon 190 191 $I1 = 1 192 $N1 = sec $I1 193 is($N1, 1.850816, "sec(1)", epsilon) 194.end 195 196.sub test_csc_n 197 .param num epsilon 198 199 $N0 = csc 0.5 200 is($N0, 2.0858, "csc(0.5)", epsilon) 201 202 $N0 = csc 1.0 203 is($N0, 1.1884, "csc(1.0)", epsilon) 204.end 205 206.sub test_csc_i 207 .param num epsilon 208 209 $N0 = csc 1 210 is($N0, 1.1884, "csc(1)", epsilon) 211 212 $N0 = csc 2 213 is($N0, 1.0998, "csc(2)", epsilon) 214.end 215 216.sub test_atan_n 217 .param num epsilon 218 219 $N1 = 1.0 220 $N2 = atan $N1 221 is($N2, 0.785398, "atan(1.0)", epsilon) 222.end 223 224.sub test_atan_i 225 .param num epsilon 226 227 $I1 = 1 228 $N1 = atan $I1 229 is($N1, 0.785398, "atan(1)", epsilon) 230.end 231 232.sub test_asin_n 233 .param num epsilon 234 .local num pi2 235 pi2 = _pi() 236 pi2 /= 2 237 238 $N1 = 1.0 239 $N2 = asin $N1 240 is($N2, pi2, "asin(1.0)", epsilon) 241 242 $N2 = asin 1.0 243 is($N2, pi2, "asin(1.0)", epsilon) 244.end 245 246.sub test_asin_i 247 .param num epsilon 248 .local num pi2 249 pi2 = _pi() 250 pi2 /= 2 251 252 $I1 = 1 253 $N1 = asin $I1 254 is($N1, pi2, "asin(1)", epsilon) 255.end 256 257.sub test_acos_n 258 .param num epsilon 259 260 $N1 = 1.0 261 $N2 = acos $N1 262 is($N2, 0.0, "acos(1.0)", epsilon) 263 264 $N2 = acos 1.0 265 is($N2, 0.0, "acos(1.0)", epsilon) 266.end 267 268.sub test_acos_i 269 .param num epsilon 270 271 $I1 = 1 272 $N1 = acos $I1 273 is($N1, 0.0, "acos(1)", epsilon) 274.end 275 276.sub test_asec_n 277 .param num epsilon 278 279 $N1 = 1.0 280 $N2 = asec $N1 281 is($N2, 0.0, "asec(1.0)", epsilon) 282 283 $N2 = asec 1.0 284 is($N2, 0.0, "asec(1.0)", epsilon) 285.end 286 287.sub test_asec_i 288 .param num epsilon 289 290 $I1 = 1 291 $N1 = asec $I1 292 is($N1, 0.0, "asec(1)", epsilon) 293.end 294 295.sub test_sinh_n 296 .param num epsilon 297 .local num result 298 299 $N1 = 1.0 300 $N2 = sinh $N1 301 is($N2, 1.175201, "sinh(1.0)", epsilon) 302 303 $N2 = sinh 1.0 304 is($N2, 1.175201, "sinh(1.0)", epsilon) 305.end 306 307.sub test_sinh_i 308 .param num epsilon 309 310 $I1 = 1 311 $N1 = sinh $I1 312 is($N1, 1.175201, "sinh(1)", epsilon) 313.end 314 315.sub test_cosh_n 316 .param num epsilon 317 .local num result 318 319 $N1 = 1.0 320 $N2 = cosh $N1 321 is($N2, 1.543081, "cosh(1.0)", epsilon) 322 323 $N2 = cosh 1.0 324 is($N2, 1.543081, "cosh(1.0)", epsilon) 325.end 326 327.sub test_cosh_i 328 .param num epsilon 329 330 $I1 = 1 331 $N1 = cosh $I1 332 is($N1, 1.543081, "cosh(1)", epsilon) 333.end 334 335.sub test_sech_n 336 .param num epsilon 337 .local num result 338 339 $N1 = 1.0 340 $N2 = sech $N1 341 is($N2, 0.648054, "sech(1.0)", epsilon) 342 343 $N2 = sech 1.0 344 is($N2, 0.648054, "sech(1.0)", epsilon) 345.end 346 347.sub test_sech_i 348 .param num epsilon 349 350 $I1 = 1 351 $N1 = sech $I1 352 is($N1, 0.648054, "sech(1)", epsilon) 353.end 354 355.sub test_tanh_n 356 .param num epsilon 357 .local num result 358 359 $N1 = 1.0 360 $N2 = tanh $N1 361 is($N2, 0.761594, "tanh(1.0)", epsilon) 362 363 $N2 = tanh 1.0 364 is($N2, 0.761594, "tanh(1.0)", epsilon) 365.end 366 367.sub test_tanh_i 368 .param num epsilon 369 370 $I1 = 1 371 $N1 = tanh $I1 372 is($N1, 0.761594, "tanh(1)", epsilon) 373.end 374 375.sub test_exp_n 376 .param num epsilon 377 .local num result 378 379 $N1 = 2.0 380 $N2 = exp $N1 381 is($N2, 7.389056, "exp(2.0)", epsilon) 382 383 $N2 = exp 2.0 384 is($N2, 7.389056, "exp(2.0)", epsilon) 385.end 386 387.sub test_ln_n 388 .param num epsilon 389 .local num result 390 391 $N1 = 2.0 392 $N2 = ln $N1 393 is($N2, 0.693147, "ln(2.0)", epsilon) 394 395 $N2 = ln 2.0 396 is($N2, 0.693147, "ln(2.0)", epsilon) 397.end 398 399.sub test_log2_n 400 .param num epsilon 401 .local num result 402 403 $N1 = 16.0 404 $N2 = log2 $N1 405 is($N2, 4.0, "ln(2.0)", epsilon) 406 407 $N2 = log2 16.0 408 is($N2, 4.0, "ln(2.0)", epsilon) 409.end 410 411.sub test_log10_n 412 .param num epsilon 413 .local num result 414 415 $N1 = 100.0 416 $N2 = log10 $N1 417 is($N2, 2.0, "log10(100.0)", epsilon) 418 419 $N2 = log10 100.0 420 is($N2, 2.0, "log10(100.0)", epsilon) 421.end 422 423.sub test_pow_p_p_p 424 $P1 = new ['Integer'] 425 $P1 = 2 426 $P2 = new ['Integer'] 427 $P2 = 2 428 null $P3 429 $P3 = pow $P1, $P2 430 is($P3, 4, "pow(2, 2) with null register") 431 432 $P3 = pow $P1, $P2 433 is($P3, 4, "pow(2, 2)") 434.end 435 436.sub test_pow_p_p_i 437 $P1 = new ['Integer'] 438 $P1 = 2 439 null $P2 440 $P2 = pow $P1, 2 441 is($P2, 4, "pow(2, const 2) with null register") 442 443 $P2 = pow $P1, 2 444 is($P2, 4, "pow(2, const 2)") 445 446 $I1 = 2 447 null $P2 448 $P2 = pow $P1, $I1 449 is($P2, 4, "pow(2, 2) with null register") 450 451 $P2 = pow $P1, $I1 452 is($P2, 4, "pow(2, 2)") 453.end 454 455.sub test_pow_p_p_n 456 $P1 = new ['Integer'] 457 $P1 = 2 458 null $P2 459 $P2 = pow $P1, 2.0 460 is($P2, 4, "pow(2, const 2.0) with null register") 461 462 $P2 = pow $P1, 2.0 463 is($P2, 4, "pow(2, const 2.0)") 464 465 $N1 = 2.0 466 null $P2 467 $P2 = pow $P1, $N1 468 is($P2, 4, "pow(2, 2.0) with null register") 469 470 $P2 = pow $P1, $N1 471 is($P2, 4, "pow(2, 2.0)") 472.end 473 474.sub test_pow_n_nc_i 475 .param num epsilon 476 477 $I1 = 2 478 $N0 = pow 2.0, $I1 479 is($N0, 4, "pow(2, 2)") 480 481 $I1 = -2 482 $N0 = pow 2.0, $I1 483 is($N0, 0.25, "pow(2, -2)", epsilon) 484.end 485 486.sub integer_overflow_with_pow 487 .include "iglobals.pasm" 488 489 # Check that we aren't 32-bit INTVALs without GMP 490 .local pmc interp # a handle to our interpreter object. 491 interp = getinterp 492 .local pmc config 493 config = interp[.IGLOBALS_CONFIG_HASH] 494 .local int intvalsize 495 intvalsize = config['intvalsize'] 496 .local string gmp 497 gmp = config['gmp'] 498 499 if intvalsize == 4 goto skipthem 500 501 if gmp == 'define' goto can_test 502 503 goto skipthem 504 505 can_test: 506 507 .local pmc i1, i2, r 508 i1 = new 'Integer' 509 i2 = new 'Integer' 510 i1 = 2 511 i2 = 1 512 $I1 = 1 513 next: 514 null r 515 r = pow i1, i2 516 $S0 = r 517 518 $I1 = $I1 * 2 519 is( $S0, $I1, 'integer_overflow_with_pow' ) 520 521 inc i2 522# XXX: this must be extended to at least 64 bit range 523# when sure that the result is not floating point. 524# In the meantime, make sure it overflows nicely 525# on 32 bit. 526 unless i2 > 40 goto next 527 goto end 528 529 skipthem: 530 skip(40,'No integer overflow tests for 32-bit INTVALs') 531 end: 532.end 533 534.macro sprintf_is(fmt, number, message) 535 c = .number 536 $S0 = sprintf .fmt, c 537 $S1 = .message 538 is( $S0, $S1, $S1 ) 539.endm 540 541.sub e_raised_pi_time_i__plus_1_equal_0 542 .local pmc c, c2, c3 543 c = new ['Complex'] 544 c2 = new ['Complex'] 545 c3 = new ['Complex'] 546 # e^(pi * i) + 1 = 0 547 $N0 = atan 1 548 $N0 *= 4 549 c[0] = 0.0 550 c[1] = $N0 551 c2 = c.'exp'() 552 c2 += 1.0 553 .sprintf_is( "%.3f%+.3fi", c2, "0.000+0.000i" ) 554.end 555 556# Local Variables: 557# mode: pir 558# fill-column: 100 559# End: 560# vim: expandtab shiftwidth=4 ft=pir: 561 562