1 2 /* @(#)k_standard.c 1.3 95/01/18 */ 3 /* 4 * ==================================================== 5 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 6 * 7 * Developed at SunSoft, a Sun Microsystems, Inc. business. 8 * Permission to use, copy, modify, and distribute this 9 * software is freely granted, provided that this notice 10 * is preserved. 11 * ==================================================== 12 * 13 */ 14 15 #include "fdlibm.h" 16 #include <errno.h> 17 18 #ifndef _USE_WRITE 19 #include <stdio.h> /* fputs(), stderr */ 20 #define WRITE2(u,v) fputs(u, stderr) 21 #else /* !defined(_USE_WRITE) */ 22 #include <unistd.h> /* write */ 23 #define WRITE2(u,v) write(2, u, v) 24 #undef fflush 25 #endif /* !defined(_USE_WRITE) */ 26 27 static double zero = 0.0; /* used as const */ 28 29 /* 30 * Standard conformance (non-IEEE) on exception cases. 31 * Mapping: 32 * 1 -- ieee_acos(|x|>1) 33 * 2 -- ieee_asin(|x|>1) 34 * 3 -- ieee_atan2(+-0,+-0) 35 * 4 -- hypot overflow 36 * 5 -- cosh overflow 37 * 6 -- exp overflow 38 * 7 -- exp underflow 39 * 8 -- ieee_y0(0) 40 * 9 -- ieee_y0(-ve) 41 * 10-- ieee_y1(0) 42 * 11-- ieee_y1(-ve) 43 * 12-- ieee_yn(0) 44 * 13-- ieee_yn(-ve) 45 * 14-- ieee_lgamma(finite) overflow 46 * 15-- ieee_lgamma(-integer) 47 * 16-- ieee_log(0) 48 * 17-- ieee_log(x<0) 49 * 18-- ieee_log10(0) 50 * 19-- ieee_log10(x<0) 51 * 20-- ieee_pow(0.0,0.0) 52 * 21-- ieee_pow(x,y) overflow 53 * 22-- ieee_pow(x,y) underflow 54 * 23-- ieee_pow(0,negative) 55 * 24-- ieee_pow(neg,non-integral) 56 * 25-- ieee_sinh(finite) overflow 57 * 26-- ieee_sqrt(negative) 58 * 27-- ieee_fmod(x,0) 59 * 28-- ieee_remainder(x,0) 60 * 29-- acosh(x<1) 61 * 30-- atanh(|x|>1) 62 * 31-- atanh(|x|=1) 63 * 32-- scalb overflow 64 * 33-- scalb underflow 65 * 34-- ieee_j0(|x|>X_TLOSS) 66 * 35-- ieee_y0(x>X_TLOSS) 67 * 36-- ieee_j1(|x|>X_TLOSS) 68 * 37-- ieee_y1(x>X_TLOSS) 69 * 38-- ieee_jn(|x|>X_TLOSS, n) 70 * 39-- ieee_yn(x>X_TLOSS, n) 71 * 40-- ieee_gamma(finite) overflow 72 * 41-- ieee_gamma(-integer) 73 * 42-- ieee_pow(NaN,0.0) 74 */ 75 76 77 #ifdef __STDC__ 78 double __kernel_standard(double x, double y, int type) 79 #else 80 double __kernel_standard(x,y,type) 81 double x,y; int type; 82 #endif 83 { 84 struct exception exc; 85 #ifndef HUGE_VAL /* this is the only routine that uses HUGE_VAL */ 86 #define HUGE_VAL inf 87 double inf = 0.0; 88 89 __HI(inf) = 0x7ff00000; /* set inf to infinite */ 90 #endif 91 92 #ifdef _USE_WRITE 93 (void) fflush(stdout); 94 #endif 95 exc.arg1 = x; 96 exc.arg2 = y; 97 switch(type) { 98 case 1: 99 /* ieee_acos(|x|>1) */ 100 exc.type = DOMAIN; 101 exc.name = "acos"; 102 exc.retval = zero; 103 if (_LIB_VERSION == _POSIX_) 104 errno = EDOM; 105 else if (!ieee_matherr(&exc)) { 106 if(_LIB_VERSION == _SVID_) { 107 (void) WRITE2("acos: DOMAIN error\n", 19); 108 } 109 errno = EDOM; 110 } 111 break; 112 case 2: 113 /* ieee_asin(|x|>1) */ 114 exc.type = DOMAIN; 115 exc.name = "asin"; 116 exc.retval = zero; 117 if(_LIB_VERSION == _POSIX_) 118 errno = EDOM; 119 else if (!ieee_matherr(&exc)) { 120 if(_LIB_VERSION == _SVID_) { 121 (void) WRITE2("asin: DOMAIN error\n", 19); 122 } 123 errno = EDOM; 124 } 125 break; 126 case 3: 127 /* ieee_atan2(+-0,+-0) */ 128 exc.arg1 = y; 129 exc.arg2 = x; 130 exc.type = DOMAIN; 131 exc.name = "atan2"; 132 exc.retval = zero; 133 if(_LIB_VERSION == _POSIX_) 134 errno = EDOM; 135 else if (!ieee_matherr(&exc)) { 136 if(_LIB_VERSION == _SVID_) { 137 (void) WRITE2("atan2: DOMAIN error\n", 20); 138 } 139 errno = EDOM; 140 } 141 break; 142 case 4: 143 /* ieee_hypot(finite,finite) overflow */ 144 exc.type = OVERFLOW; 145 exc.name = "hypot"; 146 if (_LIB_VERSION == _SVID_) 147 exc.retval = HUGE; 148 else 149 exc.retval = HUGE_VAL; 150 if (_LIB_VERSION == _POSIX_) 151 errno = ERANGE; 152 else if (!ieee_matherr(&exc)) { 153 errno = ERANGE; 154 } 155 break; 156 case 5: 157 /* ieee_cosh(finite) overflow */ 158 exc.type = OVERFLOW; 159 exc.name = "cosh"; 160 if (_LIB_VERSION == _SVID_) 161 exc.retval = HUGE; 162 else 163 exc.retval = HUGE_VAL; 164 if (_LIB_VERSION == _POSIX_) 165 errno = ERANGE; 166 else if (!ieee_matherr(&exc)) { 167 errno = ERANGE; 168 } 169 break; 170 case 6: 171 /* ieee_exp(finite) overflow */ 172 exc.type = OVERFLOW; 173 exc.name = "exp"; 174 if (_LIB_VERSION == _SVID_) 175 exc.retval = HUGE; 176 else 177 exc.retval = HUGE_VAL; 178 if (_LIB_VERSION == _POSIX_) 179 errno = ERANGE; 180 else if (!ieee_matherr(&exc)) { 181 errno = ERANGE; 182 } 183 break; 184 case 7: 185 /* ieee_exp(finite) underflow */ 186 exc.type = UNDERFLOW; 187 exc.name = "exp"; 188 exc.retval = zero; 189 if (_LIB_VERSION == _POSIX_) 190 errno = ERANGE; 191 else if (!ieee_matherr(&exc)) { 192 errno = ERANGE; 193 } 194 break; 195 case 8: 196 /* ieee_y0(0) = -inf */ 197 exc.type = DOMAIN; /* should be SING for IEEE */ 198 exc.name = "y0"; 199 if (_LIB_VERSION == _SVID_) 200 exc.retval = -HUGE; 201 else 202 exc.retval = -HUGE_VAL; 203 if (_LIB_VERSION == _POSIX_) 204 errno = EDOM; 205 else if (!ieee_matherr(&exc)) { 206 if (_LIB_VERSION == _SVID_) { 207 (void) WRITE2("y0: DOMAIN error\n", 17); 208 } 209 errno = EDOM; 210 } 211 break; 212 case 9: 213 /* ieee_y0(x<0) = NaN */ 214 exc.type = DOMAIN; 215 exc.name = "y0"; 216 if (_LIB_VERSION == _SVID_) 217 exc.retval = -HUGE; 218 else 219 exc.retval = -HUGE_VAL; 220 if (_LIB_VERSION == _POSIX_) 221 errno = EDOM; 222 else if (!ieee_matherr(&exc)) { 223 if (_LIB_VERSION == _SVID_) { 224 (void) WRITE2("y0: DOMAIN error\n", 17); 225 } 226 errno = EDOM; 227 } 228 break; 229 case 10: 230 /* ieee_y1(0) = -inf */ 231 exc.type = DOMAIN; /* should be SING for IEEE */ 232 exc.name = "y1"; 233 if (_LIB_VERSION == _SVID_) 234 exc.retval = -HUGE; 235 else 236 exc.retval = -HUGE_VAL; 237 if (_LIB_VERSION == _POSIX_) 238 errno = EDOM; 239 else if (!ieee_matherr(&exc)) { 240 if (_LIB_VERSION == _SVID_) { 241 (void) WRITE2("y1: DOMAIN error\n", 17); 242 } 243 errno = EDOM; 244 } 245 break; 246 case 11: 247 /* ieee_y1(x<0) = NaN */ 248 exc.type = DOMAIN; 249 exc.name = "y1"; 250 if (_LIB_VERSION == _SVID_) 251 exc.retval = -HUGE; 252 else 253 exc.retval = -HUGE_VAL; 254 if (_LIB_VERSION == _POSIX_) 255 errno = EDOM; 256 else if (!ieee_matherr(&exc)) { 257 if (_LIB_VERSION == _SVID_) { 258 (void) WRITE2("y1: DOMAIN error\n", 17); 259 } 260 errno = EDOM; 261 } 262 break; 263 case 12: 264 /* ieee_yn(n,0) = -inf */ 265 exc.type = DOMAIN; /* should be SING for IEEE */ 266 exc.name = "yn"; 267 if (_LIB_VERSION == _SVID_) 268 exc.retval = -HUGE; 269 else 270 exc.retval = -HUGE_VAL; 271 if (_LIB_VERSION == _POSIX_) 272 errno = EDOM; 273 else if (!ieee_matherr(&exc)) { 274 if (_LIB_VERSION == _SVID_) { 275 (void) WRITE2("yn: DOMAIN error\n", 17); 276 } 277 errno = EDOM; 278 } 279 break; 280 case 13: 281 /* ieee_yn(x<0) = NaN */ 282 exc.type = DOMAIN; 283 exc.name = "yn"; 284 if (_LIB_VERSION == _SVID_) 285 exc.retval = -HUGE; 286 else 287 exc.retval = -HUGE_VAL; 288 if (_LIB_VERSION == _POSIX_) 289 errno = EDOM; 290 else if (!ieee_matherr(&exc)) { 291 if (_LIB_VERSION == _SVID_) { 292 (void) WRITE2("yn: DOMAIN error\n", 17); 293 } 294 errno = EDOM; 295 } 296 break; 297 case 14: 298 /* ieee_lgamma(finite) overflow */ 299 exc.type = OVERFLOW; 300 exc.name = "lgamma"; 301 if (_LIB_VERSION == _SVID_) 302 exc.retval = HUGE; 303 else 304 exc.retval = HUGE_VAL; 305 if (_LIB_VERSION == _POSIX_) 306 errno = ERANGE; 307 else if (!ieee_matherr(&exc)) { 308 errno = ERANGE; 309 } 310 break; 311 case 15: 312 /* ieee_lgamma(-integer) or ieee_lgamma(0) */ 313 exc.type = SING; 314 exc.name = "lgamma"; 315 if (_LIB_VERSION == _SVID_) 316 exc.retval = HUGE; 317 else 318 exc.retval = HUGE_VAL; 319 if (_LIB_VERSION == _POSIX_) 320 errno = EDOM; 321 else if (!ieee_matherr(&exc)) { 322 if (_LIB_VERSION == _SVID_) { 323 (void) WRITE2("lgamma: SING error\n", 19); 324 } 325 errno = EDOM; 326 } 327 break; 328 case 16: 329 /* ieee_log(0) */ 330 exc.type = SING; 331 exc.name = "log"; 332 if (_LIB_VERSION == _SVID_) 333 exc.retval = -HUGE; 334 else 335 exc.retval = -HUGE_VAL; 336 if (_LIB_VERSION == _POSIX_) 337 errno = ERANGE; 338 else if (!ieee_matherr(&exc)) { 339 if (_LIB_VERSION == _SVID_) { 340 (void) WRITE2("log: SING error\n", 16); 341 } 342 errno = EDOM; 343 } 344 break; 345 case 17: 346 /* ieee_log(x<0) */ 347 exc.type = DOMAIN; 348 exc.name = "log"; 349 if (_LIB_VERSION == _SVID_) 350 exc.retval = -HUGE; 351 else 352 exc.retval = -HUGE_VAL; 353 if (_LIB_VERSION == _POSIX_) 354 errno = EDOM; 355 else if (!ieee_matherr(&exc)) { 356 if (_LIB_VERSION == _SVID_) { 357 (void) WRITE2("log: DOMAIN error\n", 18); 358 } 359 errno = EDOM; 360 } 361 break; 362 case 18: 363 /* ieee_log10(0) */ 364 exc.type = SING; 365 exc.name = "log10"; 366 if (_LIB_VERSION == _SVID_) 367 exc.retval = -HUGE; 368 else 369 exc.retval = -HUGE_VAL; 370 if (_LIB_VERSION == _POSIX_) 371 errno = ERANGE; 372 else if (!ieee_matherr(&exc)) { 373 if (_LIB_VERSION == _SVID_) { 374 (void) WRITE2("log10: SING error\n", 18); 375 } 376 errno = EDOM; 377 } 378 break; 379 case 19: 380 /* ieee_log10(x<0) */ 381 exc.type = DOMAIN; 382 exc.name = "log10"; 383 if (_LIB_VERSION == _SVID_) 384 exc.retval = -HUGE; 385 else 386 exc.retval = -HUGE_VAL; 387 if (_LIB_VERSION == _POSIX_) 388 errno = EDOM; 389 else if (!ieee_matherr(&exc)) { 390 if (_LIB_VERSION == _SVID_) { 391 (void) WRITE2("log10: DOMAIN error\n", 20); 392 } 393 errno = EDOM; 394 } 395 break; 396 case 20: 397 /* ieee_pow(0.0,0.0) */ 398 /* error only if _LIB_VERSION == _SVID_ */ 399 exc.type = DOMAIN; 400 exc.name = "pow"; 401 exc.retval = zero; 402 if (_LIB_VERSION != _SVID_) exc.retval = 1.0; 403 else if (!ieee_matherr(&exc)) { 404 (void) WRITE2("pow(0,0): DOMAIN error\n", 23); 405 errno = EDOM; 406 } 407 break; 408 case 21: 409 /* ieee_pow(x,y) overflow */ 410 exc.type = OVERFLOW; 411 exc.name = "pow"; 412 if (_LIB_VERSION == _SVID_) { 413 exc.retval = HUGE; 414 y *= 0.5; 415 if(x<zero&&ieee_rint(y)!=y) exc.retval = -HUGE; 416 } else { 417 exc.retval = HUGE_VAL; 418 y *= 0.5; 419 if(x<zero&&ieee_rint(y)!=y) exc.retval = -HUGE_VAL; 420 } 421 if (_LIB_VERSION == _POSIX_) 422 errno = ERANGE; 423 else if (!ieee_matherr(&exc)) { 424 errno = ERANGE; 425 } 426 break; 427 case 22: 428 /* ieee_pow(x,y) underflow */ 429 exc.type = UNDERFLOW; 430 exc.name = "pow"; 431 exc.retval = zero; 432 if (_LIB_VERSION == _POSIX_) 433 errno = ERANGE; 434 else if (!ieee_matherr(&exc)) { 435 errno = ERANGE; 436 } 437 break; 438 case 23: 439 /* 0**neg */ 440 exc.type = DOMAIN; 441 exc.name = "pow"; 442 if (_LIB_VERSION == _SVID_) 443 exc.retval = zero; 444 else 445 exc.retval = -HUGE_VAL; 446 if (_LIB_VERSION == _POSIX_) 447 errno = EDOM; 448 else if (!ieee_matherr(&exc)) { 449 if (_LIB_VERSION == _SVID_) { 450 (void) WRITE2("pow(0,neg): DOMAIN error\n", 25); 451 } 452 errno = EDOM; 453 } 454 break; 455 case 24: 456 /* neg**non-integral */ 457 exc.type = DOMAIN; 458 exc.name = "pow"; 459 if (_LIB_VERSION == _SVID_) 460 exc.retval = zero; 461 else 462 exc.retval = zero/zero; /* X/Open allow NaN */ 463 if (_LIB_VERSION == _POSIX_) 464 errno = EDOM; 465 else if (!ieee_matherr(&exc)) { 466 if (_LIB_VERSION == _SVID_) { 467 (void) WRITE2("neg**non-integral: DOMAIN error\n", 32); 468 } 469 errno = EDOM; 470 } 471 break; 472 case 25: 473 /* ieee_sinh(finite) overflow */ 474 exc.type = OVERFLOW; 475 exc.name = "sinh"; 476 if (_LIB_VERSION == _SVID_) 477 exc.retval = ( (x>zero) ? HUGE : -HUGE); 478 else 479 exc.retval = ( (x>zero) ? HUGE_VAL : -HUGE_VAL); 480 if (_LIB_VERSION == _POSIX_) 481 errno = ERANGE; 482 else if (!ieee_matherr(&exc)) { 483 errno = ERANGE; 484 } 485 break; 486 case 26: 487 /* ieee_sqrt(x<0) */ 488 exc.type = DOMAIN; 489 exc.name = "sqrt"; 490 if (_LIB_VERSION == _SVID_) 491 exc.retval = zero; 492 else 493 exc.retval = zero/zero; 494 if (_LIB_VERSION == _POSIX_) 495 errno = EDOM; 496 else if (!ieee_matherr(&exc)) { 497 if (_LIB_VERSION == _SVID_) { 498 (void) WRITE2("sqrt: DOMAIN error\n", 19); 499 } 500 errno = EDOM; 501 } 502 break; 503 case 27: 504 /* ieee_fmod(x,0) */ 505 exc.type = DOMAIN; 506 exc.name = "fmod"; 507 if (_LIB_VERSION == _SVID_) 508 exc.retval = x; 509 else 510 exc.retval = zero/zero; 511 if (_LIB_VERSION == _POSIX_) 512 errno = EDOM; 513 else if (!ieee_matherr(&exc)) { 514 if (_LIB_VERSION == _SVID_) { 515 (void) WRITE2("fmod: DOMAIN error\n", 20); 516 } 517 errno = EDOM; 518 } 519 break; 520 case 28: 521 /* ieee_remainder(x,0) */ 522 exc.type = DOMAIN; 523 exc.name = "remainder"; 524 exc.retval = zero/zero; 525 if (_LIB_VERSION == _POSIX_) 526 errno = EDOM; 527 else if (!ieee_matherr(&exc)) { 528 if (_LIB_VERSION == _SVID_) { 529 (void) WRITE2("remainder: DOMAIN error\n", 24); 530 } 531 errno = EDOM; 532 } 533 break; 534 case 29: 535 /* acosh(x<1) */ 536 exc.type = DOMAIN; 537 exc.name = "acosh"; 538 exc.retval = zero/zero; 539 if (_LIB_VERSION == _POSIX_) 540 errno = EDOM; 541 else if (!ieee_matherr(&exc)) { 542 if (_LIB_VERSION == _SVID_) { 543 (void) WRITE2("acosh: DOMAIN error\n", 20); 544 } 545 errno = EDOM; 546 } 547 break; 548 case 30: 549 /* atanh(|x|>1) */ 550 exc.type = DOMAIN; 551 exc.name = "atanh"; 552 exc.retval = zero/zero; 553 if (_LIB_VERSION == _POSIX_) 554 errno = EDOM; 555 else if (!ieee_matherr(&exc)) { 556 if (_LIB_VERSION == _SVID_) { 557 (void) WRITE2("atanh: DOMAIN error\n", 20); 558 } 559 errno = EDOM; 560 } 561 break; 562 case 31: 563 /* atanh(|x|=1) */ 564 exc.type = SING; 565 exc.name = "atanh"; 566 exc.retval = x/zero; /* sign(x)*inf */ 567 if (_LIB_VERSION == _POSIX_) 568 errno = EDOM; 569 else if (!ieee_matherr(&exc)) { 570 if (_LIB_VERSION == _SVID_) { 571 (void) WRITE2("atanh: SING error\n", 18); 572 } 573 errno = EDOM; 574 } 575 break; 576 case 32: 577 /* scalb overflow; SVID also returns +-HUGE_VAL */ 578 exc.type = OVERFLOW; 579 exc.name = "scalb"; 580 exc.retval = x > zero ? HUGE_VAL : -HUGE_VAL; 581 if (_LIB_VERSION == _POSIX_) 582 errno = ERANGE; 583 else if (!ieee_matherr(&exc)) { 584 errno = ERANGE; 585 } 586 break; 587 case 33: 588 /* scalb underflow */ 589 exc.type = UNDERFLOW; 590 exc.name = "scalb"; 591 exc.retval = ieee_copysign(zero,x); 592 if (_LIB_VERSION == _POSIX_) 593 errno = ERANGE; 594 else if (!ieee_matherr(&exc)) { 595 errno = ERANGE; 596 } 597 break; 598 case 34: 599 /* ieee_j0(|x|>X_TLOSS) */ 600 exc.type = TLOSS; 601 exc.name = "j0"; 602 exc.retval = zero; 603 if (_LIB_VERSION == _POSIX_) 604 errno = ERANGE; 605 else if (!ieee_matherr(&exc)) { 606 if (_LIB_VERSION == _SVID_) { 607 (void) WRITE2(exc.name, 2); 608 (void) WRITE2(": TLOSS error\n", 14); 609 } 610 errno = ERANGE; 611 } 612 break; 613 case 35: 614 /* ieee_y0(x>X_TLOSS) */ 615 exc.type = TLOSS; 616 exc.name = "y0"; 617 exc.retval = zero; 618 if (_LIB_VERSION == _POSIX_) 619 errno = ERANGE; 620 else if (!ieee_matherr(&exc)) { 621 if (_LIB_VERSION == _SVID_) { 622 (void) WRITE2(exc.name, 2); 623 (void) WRITE2(": TLOSS error\n", 14); 624 } 625 errno = ERANGE; 626 } 627 break; 628 case 36: 629 /* ieee_j1(|x|>X_TLOSS) */ 630 exc.type = TLOSS; 631 exc.name = "j1"; 632 exc.retval = zero; 633 if (_LIB_VERSION == _POSIX_) 634 errno = ERANGE; 635 else if (!ieee_matherr(&exc)) { 636 if (_LIB_VERSION == _SVID_) { 637 (void) WRITE2(exc.name, 2); 638 (void) WRITE2(": TLOSS error\n", 14); 639 } 640 errno = ERANGE; 641 } 642 break; 643 case 37: 644 /* ieee_y1(x>X_TLOSS) */ 645 exc.type = TLOSS; 646 exc.name = "y1"; 647 exc.retval = zero; 648 if (_LIB_VERSION == _POSIX_) 649 errno = ERANGE; 650 else if (!ieee_matherr(&exc)) { 651 if (_LIB_VERSION == _SVID_) { 652 (void) WRITE2(exc.name, 2); 653 (void) WRITE2(": TLOSS error\n", 14); 654 } 655 errno = ERANGE; 656 } 657 break; 658 case 38: 659 /* ieee_jn(|x|>X_TLOSS) */ 660 exc.type = TLOSS; 661 exc.name = "jn"; 662 exc.retval = zero; 663 if (_LIB_VERSION == _POSIX_) 664 errno = ERANGE; 665 else if (!ieee_matherr(&exc)) { 666 if (_LIB_VERSION == _SVID_) { 667 (void) WRITE2(exc.name, 2); 668 (void) WRITE2(": TLOSS error\n", 14); 669 } 670 errno = ERANGE; 671 } 672 break; 673 case 39: 674 /* ieee_yn(x>X_TLOSS) */ 675 exc.type = TLOSS; 676 exc.name = "yn"; 677 exc.retval = zero; 678 if (_LIB_VERSION == _POSIX_) 679 errno = ERANGE; 680 else if (!ieee_matherr(&exc)) { 681 if (_LIB_VERSION == _SVID_) { 682 (void) WRITE2(exc.name, 2); 683 (void) WRITE2(": TLOSS error\n", 14); 684 } 685 errno = ERANGE; 686 } 687 break; 688 case 40: 689 /* ieee_gamma(finite) overflow */ 690 exc.type = OVERFLOW; 691 exc.name = "gamma"; 692 if (_LIB_VERSION == _SVID_) 693 exc.retval = HUGE; 694 else 695 exc.retval = HUGE_VAL; 696 if (_LIB_VERSION == _POSIX_) 697 errno = ERANGE; 698 else if (!ieee_matherr(&exc)) { 699 errno = ERANGE; 700 } 701 break; 702 case 41: 703 /* ieee_gamma(-integer) or ieee_gamma(0) */ 704 exc.type = SING; 705 exc.name = "gamma"; 706 if (_LIB_VERSION == _SVID_) 707 exc.retval = HUGE; 708 else 709 exc.retval = HUGE_VAL; 710 if (_LIB_VERSION == _POSIX_) 711 errno = EDOM; 712 else if (!ieee_matherr(&exc)) { 713 if (_LIB_VERSION == _SVID_) { 714 (void) WRITE2("gamma: SING error\n", 18); 715 } 716 errno = EDOM; 717 } 718 break; 719 case 42: 720 /* ieee_pow(NaN,0.0) */ 721 /* error only if _LIB_VERSION == _SVID_ & _XOPEN_ */ 722 exc.type = DOMAIN; 723 exc.name = "pow"; 724 exc.retval = x; 725 if (_LIB_VERSION == _IEEE_ || 726 _LIB_VERSION == _POSIX_) exc.retval = 1.0; 727 else if (!ieee_matherr(&exc)) { 728 errno = EDOM; 729 } 730 break; 731 } 732 return exc.retval; 733 } 734