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