xref: /minix3/lib/libm/src/k_standard.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
12fe8fb19SBen Gras /* @(#)k_standard.c 5.1 93/09/24 */
22fe8fb19SBen Gras /*
32fe8fb19SBen Gras  * ====================================================
42fe8fb19SBen Gras  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
52fe8fb19SBen Gras  *
62fe8fb19SBen Gras  * Developed at SunPro, a Sun Microsystems, Inc. business.
72fe8fb19SBen Gras  * Permission to use, copy, modify, and distribute this
82fe8fb19SBen Gras  * software is freely granted, provided that this notice
92fe8fb19SBen Gras  * is preserved.
102fe8fb19SBen Gras  * ====================================================
112fe8fb19SBen Gras  */
122fe8fb19SBen Gras 
132fe8fb19SBen Gras #include <sys/cdefs.h>
142fe8fb19SBen Gras #if defined(LIBM_SCCS) && !defined(lint)
15*0a6a1f1dSLionel Sambuc __RCSID("$NetBSD: k_standard.c,v 1.20 2015/09/08 05:23:31 dholland Exp $");
162fe8fb19SBen Gras #endif
172fe8fb19SBen Gras 
182fe8fb19SBen Gras #include "math.h"
192fe8fb19SBen Gras #include "math_private.h"
202fe8fb19SBen Gras #include <errno.h>
212fe8fb19SBen Gras 
222fe8fb19SBen Gras #ifndef _USE_WRITE
232fe8fb19SBen Gras #include <stdio.h>			/* fputs(), stderr */
242fe8fb19SBen Gras #define	WRITE2(u,v)	fputs(u, stderr)
252fe8fb19SBen Gras #else	/* !defined(_USE_WRITE) */
262fe8fb19SBen Gras #include <unistd.h>			/* write */
272fe8fb19SBen Gras #define	WRITE2(u,v)	write(2, u, v)
282fe8fb19SBen Gras #undef fflush
292fe8fb19SBen Gras #endif	/* !defined(_USE_WRITE) */
302fe8fb19SBen Gras 
312fe8fb19SBen Gras static const double zero = 0.0;	/* used as const */
322fe8fb19SBen Gras 
332fe8fb19SBen Gras /*
342fe8fb19SBen Gras  * Standard conformance (non-IEEE) on exception cases.
352fe8fb19SBen Gras  * Mapping:
362fe8fb19SBen Gras  *	1 -- acos(|x|>1)
372fe8fb19SBen Gras  *	2 -- asin(|x|>1)
382fe8fb19SBen Gras  *	3 -- atan2(+-0,+-0)
392fe8fb19SBen Gras  *	4 -- hypot overflow
402fe8fb19SBen Gras  *	5 -- cosh overflow
412fe8fb19SBen Gras  *	6 -- exp overflow
422fe8fb19SBen Gras  *	7 -- exp underflow
432fe8fb19SBen Gras  *	8 -- y0(0)
442fe8fb19SBen Gras  *	9 -- y0(-ve)
452fe8fb19SBen Gras  *	10-- y1(0)
462fe8fb19SBen Gras  *	11-- y1(-ve)
472fe8fb19SBen Gras  *	12-- yn(0)
482fe8fb19SBen Gras  *	13-- yn(-ve)
492fe8fb19SBen Gras  *	14-- lgamma(finite) overflow
502fe8fb19SBen Gras  *	15-- lgamma(-integer)
512fe8fb19SBen Gras  *	16-- log(0)
522fe8fb19SBen Gras  *	17-- log(x<0)
532fe8fb19SBen Gras  *	18-- log10(0)
542fe8fb19SBen Gras  *	19-- log10(x<0)
552fe8fb19SBen Gras  *	20-- pow(0.0,0.0)
562fe8fb19SBen Gras  *	21-- pow(x,y) overflow
572fe8fb19SBen Gras  *	22-- pow(x,y) underflow
582fe8fb19SBen Gras  *	23-- pow(0,negative)
592fe8fb19SBen Gras  *	24-- pow(neg,non-integral)
602fe8fb19SBen Gras  *	25-- sinh(finite) overflow
612fe8fb19SBen Gras  *	26-- sqrt(negative)
622fe8fb19SBen Gras  *      27-- fmod(x,0)
632fe8fb19SBen Gras  *      28-- remainder(x,0)
642fe8fb19SBen Gras  *	29-- acosh(x<1)
652fe8fb19SBen Gras  *	30-- atanh(|x|>1)
662fe8fb19SBen Gras  *	31-- atanh(|x|=1)
672fe8fb19SBen Gras  *	32-- scalb overflow
682fe8fb19SBen Gras  *	33-- scalb underflow
692fe8fb19SBen Gras  *	34-- j0(|x|>X_TLOSS)
702fe8fb19SBen Gras  *	35-- y0(x>X_TLOSS)
712fe8fb19SBen Gras  *	36-- j1(|x|>X_TLOSS)
722fe8fb19SBen Gras  *	37-- y1(x>X_TLOSS)
732fe8fb19SBen Gras  *	38-- jn(|x|>X_TLOSS, n)
742fe8fb19SBen Gras  *	39-- yn(x>X_TLOSS, n)
752fe8fb19SBen Gras  *	40-- gamma(finite) overflow
762fe8fb19SBen Gras  *	41-- gamma(-integer)
772fe8fb19SBen Gras  *	42-- pow(NaN,0.0)
782fe8fb19SBen Gras  *	48-- log2(0)
792fe8fb19SBen Gras  *	49-- log2(x<0)
802fe8fb19SBen Gras  */
812fe8fb19SBen Gras 
822fe8fb19SBen Gras 
832fe8fb19SBen Gras double
__kernel_standard(double x,double y,int type)842fe8fb19SBen Gras __kernel_standard(double x, double y, int type)
852fe8fb19SBen Gras {
862fe8fb19SBen Gras 	struct exception exc;
872fe8fb19SBen Gras #ifndef HUGE_VAL	/* this is the only routine that uses HUGE_VAL */
882fe8fb19SBen Gras #define HUGE_VAL inf
892fe8fb19SBen Gras 	double inf = 0.0;
902fe8fb19SBen Gras 
912fe8fb19SBen Gras 	SET_HIGH_WORD(inf,0x7ff00000);	/* set inf to infinite */
922fe8fb19SBen Gras #endif
932fe8fb19SBen Gras 
942fe8fb19SBen Gras #ifdef _USE_WRITE
952fe8fb19SBen Gras 	(void) fflush(stdout);
962fe8fb19SBen Gras #endif
972fe8fb19SBen Gras 	exc.arg1 = x;
982fe8fb19SBen Gras 	exc.arg2 = y;
992fe8fb19SBen Gras 	switch(type) {
1002fe8fb19SBen Gras 	    case 1:
1012fe8fb19SBen Gras 	    case 101:
1022fe8fb19SBen Gras 		/* acos(|x|>1) */
1032fe8fb19SBen Gras 		exc.type = DOMAIN;
1042fe8fb19SBen Gras 		exc.name = type < 100 ? "acos" : "acosf";
1052fe8fb19SBen Gras 		exc.retval = zero;
1062fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_) {
1072fe8fb19SBen Gras 		  exc.retval = zero/zero;
1082fe8fb19SBen Gras 		  errno = EDOM;
1092fe8fb19SBen Gras 		} else if (!matherr(&exc)) {
1102fe8fb19SBen Gras 		  if(_LIB_VERSION == _SVID_) {
1112fe8fb19SBen Gras 		    (void) WRITE2("acos: DOMAIN error\n", 19);
1122fe8fb19SBen Gras 		  }
1132fe8fb19SBen Gras 		  errno = EDOM;
1142fe8fb19SBen Gras 		}
1152fe8fb19SBen Gras 		break;
1162fe8fb19SBen Gras 	    case 2:
1172fe8fb19SBen Gras 	    case 102:
1182fe8fb19SBen Gras 		/* asin(|x|>1) */
1192fe8fb19SBen Gras 		exc.type = DOMAIN;
1202fe8fb19SBen Gras 		exc.name = type < 100 ? "asin" : "asinf";
1212fe8fb19SBen Gras 		exc.retval = zero;
1222fe8fb19SBen Gras 		if(_LIB_VERSION == _POSIX_) {
1232fe8fb19SBen Gras 		  exc.retval = zero/zero;
1242fe8fb19SBen Gras 		  errno = EDOM;
1252fe8fb19SBen Gras 		} else if (!matherr(&exc)) {
1262fe8fb19SBen Gras 		  if(_LIB_VERSION == _SVID_) {
1272fe8fb19SBen Gras 		    	(void) WRITE2("asin: DOMAIN error\n", 19);
1282fe8fb19SBen Gras 		  }
1292fe8fb19SBen Gras 		  errno = EDOM;
1302fe8fb19SBen Gras 		}
1312fe8fb19SBen Gras 		break;
1322fe8fb19SBen Gras 	    case 3:
1332fe8fb19SBen Gras 	    case 103:
1342fe8fb19SBen Gras 		/* atan2(+-0,+-0) */
1352fe8fb19SBen Gras 		exc.arg1 = y;
1362fe8fb19SBen Gras 		exc.arg2 = x;
1372fe8fb19SBen Gras 		exc.type = DOMAIN;
1382fe8fb19SBen Gras 		exc.name = type < 100 ? "atan2" : "atan2f";
1392fe8fb19SBen Gras 		exc.retval = zero;
1402fe8fb19SBen Gras 		if(_LIB_VERSION == _POSIX_) {
1412fe8fb19SBen Gras 		  exc.retval = copysign(signbit(y) ? M_PI : zero, x);
1422fe8fb19SBen Gras 		} else if (!matherr(&exc)) {
1432fe8fb19SBen Gras 		  if(_LIB_VERSION == _SVID_) {
1442fe8fb19SBen Gras 			(void) WRITE2("atan2: DOMAIN error\n", 20);
1452fe8fb19SBen Gras 		      }
1462fe8fb19SBen Gras 		  errno = EDOM;
1472fe8fb19SBen Gras 		}
1482fe8fb19SBen Gras 		break;
1492fe8fb19SBen Gras 	    case 4:
1502fe8fb19SBen Gras 	    case 104:
1512fe8fb19SBen Gras 		/* hypot(finite,finite) overflow */
1522fe8fb19SBen Gras 		exc.type = OVERFLOW;
1532fe8fb19SBen Gras 		exc.name = type < 100 ? "hypot" : "hypotf";
1542fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
1552fe8fb19SBen Gras 		  exc.retval = HUGE;
1562fe8fb19SBen Gras 		else
1572fe8fb19SBen Gras 		  exc.retval = HUGE_VAL;
1582fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
1592fe8fb19SBen Gras 		  errno = ERANGE;
1602fe8fb19SBen Gras 		else if (!matherr(&exc)) {
1612fe8fb19SBen Gras 			errno = ERANGE;
1622fe8fb19SBen Gras 		}
1632fe8fb19SBen Gras 		break;
1642fe8fb19SBen Gras 	    case 5:
1652fe8fb19SBen Gras 	    case 105:
1662fe8fb19SBen Gras 		/* cosh(finite) overflow */
1672fe8fb19SBen Gras 		exc.type = OVERFLOW;
1682fe8fb19SBen Gras 		exc.name = type < 100 ? "cosh" : "coshf";
1692fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
1702fe8fb19SBen Gras 		  exc.retval = HUGE;
1712fe8fb19SBen Gras 		else
1722fe8fb19SBen Gras 		  exc.retval = HUGE_VAL;
1732fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
1742fe8fb19SBen Gras 		  errno = ERANGE;
1752fe8fb19SBen Gras 		else if (!matherr(&exc)) {
1762fe8fb19SBen Gras 			errno = ERANGE;
1772fe8fb19SBen Gras 		}
1782fe8fb19SBen Gras 		break;
1792fe8fb19SBen Gras 	    case 6:
1802fe8fb19SBen Gras 	    case 106:
1812fe8fb19SBen Gras 		/* exp(finite) overflow */
1822fe8fb19SBen Gras 		exc.type = OVERFLOW;
1832fe8fb19SBen Gras 		exc.name = type < 100 ? "exp" : "expf";
1842fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
1852fe8fb19SBen Gras 		  exc.retval = HUGE;
1862fe8fb19SBen Gras 		else
1872fe8fb19SBen Gras 		  exc.retval = HUGE_VAL;
1882fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
1892fe8fb19SBen Gras 		  errno = ERANGE;
1902fe8fb19SBen Gras 		else if (!matherr(&exc)) {
1912fe8fb19SBen Gras 			errno = ERANGE;
1922fe8fb19SBen Gras 		}
1932fe8fb19SBen Gras 		break;
1942fe8fb19SBen Gras 	    case 7:
1952fe8fb19SBen Gras 	    case 107:
1962fe8fb19SBen Gras 		/* exp(finite) underflow */
1972fe8fb19SBen Gras 		exc.type = UNDERFLOW;
1982fe8fb19SBen Gras 		exc.name = type < 100 ? "exp" : "expf";
1992fe8fb19SBen Gras 		exc.retval = zero;
2002fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
2012fe8fb19SBen Gras 		  errno = ERANGE;
2022fe8fb19SBen Gras 		else if (!matherr(&exc)) {
2032fe8fb19SBen Gras 			errno = ERANGE;
2042fe8fb19SBen Gras 		}
2052fe8fb19SBen Gras 		break;
2062fe8fb19SBen Gras 	    case 8:
2072fe8fb19SBen Gras 	    case 108:
2082fe8fb19SBen Gras 		/* y0(0) = -inf */
2092fe8fb19SBen Gras 		exc.type = DOMAIN;	/* should be SING for IEEE */
2102fe8fb19SBen Gras 		exc.name = type < 100 ? "y0" : "y0f";
2112fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
2122fe8fb19SBen Gras 		  exc.retval = -HUGE;
2132fe8fb19SBen Gras 		else
2142fe8fb19SBen Gras 		  exc.retval = -HUGE_VAL;
2152fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
2162fe8fb19SBen Gras 		  errno = EDOM;
2172fe8fb19SBen Gras 		else if (!matherr(&exc)) {
2182fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
2192fe8fb19SBen Gras 			(void) WRITE2("y0: DOMAIN error\n", 17);
2202fe8fb19SBen Gras 		      }
2212fe8fb19SBen Gras 		  errno = EDOM;
2222fe8fb19SBen Gras 		}
2232fe8fb19SBen Gras 		break;
2242fe8fb19SBen Gras 	    case 9:
2252fe8fb19SBen Gras 	    case 109:
2262fe8fb19SBen Gras 		/* y0(x<0) = NaN */
2272fe8fb19SBen Gras 		exc.type = DOMAIN;
2282fe8fb19SBen Gras 		exc.name = type < 100 ? "y0" : "y0f";
2292fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
2302fe8fb19SBen Gras 		  exc.retval = -HUGE;
2312fe8fb19SBen Gras 		else
2322fe8fb19SBen Gras 		  exc.retval = -HUGE_VAL;
2332fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
2342fe8fb19SBen Gras 		  errno = EDOM;
2352fe8fb19SBen Gras 		else if (!matherr(&exc)) {
2362fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
2372fe8fb19SBen Gras 			(void) WRITE2("y0: DOMAIN error\n", 17);
2382fe8fb19SBen Gras 		      }
2392fe8fb19SBen Gras 		  errno = EDOM;
2402fe8fb19SBen Gras 		}
2412fe8fb19SBen Gras 		break;
2422fe8fb19SBen Gras 	    case 10:
2432fe8fb19SBen Gras 	    case 110:
2442fe8fb19SBen Gras 		/* y1(0) = -inf */
2452fe8fb19SBen Gras 		exc.type = DOMAIN;	/* should be SING for IEEE */
2462fe8fb19SBen Gras 		exc.name = type < 100 ? "y1" : "y1f";
2472fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
2482fe8fb19SBen Gras 		  exc.retval = -HUGE;
2492fe8fb19SBen Gras 		else
2502fe8fb19SBen Gras 		  exc.retval = -HUGE_VAL;
2512fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
2522fe8fb19SBen Gras 		  errno = EDOM;
2532fe8fb19SBen Gras 		else if (!matherr(&exc)) {
2542fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
2552fe8fb19SBen Gras 			(void) WRITE2("y1: DOMAIN error\n", 17);
2562fe8fb19SBen Gras 		      }
2572fe8fb19SBen Gras 		  errno = EDOM;
2582fe8fb19SBen Gras 		}
2592fe8fb19SBen Gras 		break;
2602fe8fb19SBen Gras 	    case 11:
2612fe8fb19SBen Gras 	    case 111:
2622fe8fb19SBen Gras 		/* y1(x<0) = NaN */
2632fe8fb19SBen Gras 		exc.type = DOMAIN;
2642fe8fb19SBen Gras 		exc.name = type < 100 ? "y1" : "y1f";
2652fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
2662fe8fb19SBen Gras 		  exc.retval = -HUGE;
2672fe8fb19SBen Gras 		else
2682fe8fb19SBen Gras 		  exc.retval = -HUGE_VAL;
2692fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
2702fe8fb19SBen Gras 		  errno = EDOM;
2712fe8fb19SBen Gras 		else if (!matherr(&exc)) {
2722fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
2732fe8fb19SBen Gras 			(void) WRITE2("y1: DOMAIN error\n", 17);
2742fe8fb19SBen Gras 		      }
2752fe8fb19SBen Gras 		  errno = EDOM;
2762fe8fb19SBen Gras 		}
2772fe8fb19SBen Gras 		break;
2782fe8fb19SBen Gras 	    case 12:
2792fe8fb19SBen Gras 	    case 112:
2802fe8fb19SBen Gras 		/* yn(n,0) = -inf */
2812fe8fb19SBen Gras 		exc.type = DOMAIN;	/* should be SING for IEEE */
2822fe8fb19SBen Gras 		exc.name = type < 100 ? "yn" : "ynf";
2832fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
2842fe8fb19SBen Gras 		  exc.retval = -HUGE;
2852fe8fb19SBen Gras 		else
2862fe8fb19SBen Gras 		  exc.retval = -HUGE_VAL;
2872fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
2882fe8fb19SBen Gras 		  errno = EDOM;
2892fe8fb19SBen Gras 		else if (!matherr(&exc)) {
2902fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
2912fe8fb19SBen Gras 			(void) WRITE2("yn: DOMAIN error\n", 17);
2922fe8fb19SBen Gras 		      }
2932fe8fb19SBen Gras 		  errno = EDOM;
2942fe8fb19SBen Gras 		}
2952fe8fb19SBen Gras 		break;
2962fe8fb19SBen Gras 	    case 13:
2972fe8fb19SBen Gras 	    case 113:
2982fe8fb19SBen Gras 		/* yn(x<0) = NaN */
2992fe8fb19SBen Gras 		exc.type = DOMAIN;
3002fe8fb19SBen Gras 		exc.name = type < 100 ? "yn" : "ynf";
3012fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
3022fe8fb19SBen Gras 		  exc.retval = -HUGE;
3032fe8fb19SBen Gras 		else
3042fe8fb19SBen Gras 		  exc.retval = -HUGE_VAL;
3052fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
3062fe8fb19SBen Gras 		  errno = EDOM;
3072fe8fb19SBen Gras 		else if (!matherr(&exc)) {
3082fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
3092fe8fb19SBen Gras 			(void) WRITE2("yn: DOMAIN error\n", 17);
3102fe8fb19SBen Gras 		      }
3112fe8fb19SBen Gras 		  errno = EDOM;
3122fe8fb19SBen Gras 		}
3132fe8fb19SBen Gras 		break;
3142fe8fb19SBen Gras 	    case 14:
3152fe8fb19SBen Gras 	    case 114:
3162fe8fb19SBen Gras 		/* lgamma(finite) overflow */
3172fe8fb19SBen Gras 		exc.type = OVERFLOW;
3182fe8fb19SBen Gras 		exc.name = type < 100 ? "lgamma" : "lgammaf";
3192fe8fb19SBen Gras                 if (_LIB_VERSION == _SVID_)
3202fe8fb19SBen Gras                   exc.retval = HUGE;
3212fe8fb19SBen Gras                 else
3222fe8fb19SBen Gras                   exc.retval = HUGE_VAL;
3232fe8fb19SBen Gras                 if (_LIB_VERSION == _POSIX_)
3242fe8fb19SBen Gras 			errno = ERANGE;
3252fe8fb19SBen Gras                 else if (!matherr(&exc)) {
3262fe8fb19SBen Gras                         errno = ERANGE;
3272fe8fb19SBen Gras 		}
3282fe8fb19SBen Gras 		break;
3292fe8fb19SBen Gras 	    case 15:
3302fe8fb19SBen Gras 	    case 115:
3312fe8fb19SBen Gras 		/* lgamma(-integer) or lgamma(0) */
3322fe8fb19SBen Gras 		exc.type = SING;
3332fe8fb19SBen Gras 		exc.name = type < 100 ? "lgamma" : "lgammaf";
3342fe8fb19SBen Gras                 if (_LIB_VERSION == _SVID_)
3352fe8fb19SBen Gras                   exc.retval = HUGE;
3362fe8fb19SBen Gras                 else
3372fe8fb19SBen Gras                   exc.retval = HUGE_VAL;
3382fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
3392fe8fb19SBen Gras 		  errno = EDOM;
3402fe8fb19SBen Gras 		else if (!matherr(&exc)) {
3412fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
3422fe8fb19SBen Gras 			(void) WRITE2("lgamma: SING error\n", 19);
3432fe8fb19SBen Gras 		      }
3442fe8fb19SBen Gras 		  errno = EDOM;
3452fe8fb19SBen Gras 		}
3462fe8fb19SBen Gras 		break;
3472fe8fb19SBen Gras 	    case 16:
3482fe8fb19SBen Gras 	    case 116:
3492fe8fb19SBen Gras 		/* log(0) */
3502fe8fb19SBen Gras 		exc.type = SING;
3512fe8fb19SBen Gras 		exc.name = type < 100 ? "log" : "logf";
3522fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
3532fe8fb19SBen Gras 		  exc.retval = -HUGE;
3542fe8fb19SBen Gras 		else
3552fe8fb19SBen Gras 		  exc.retval = -HUGE_VAL;
3562fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
3572fe8fb19SBen Gras 		  errno = ERANGE;
3582fe8fb19SBen Gras 		else if (!matherr(&exc)) {
3592fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
3602fe8fb19SBen Gras 			(void) WRITE2("log: SING error\n", 16);
3612fe8fb19SBen Gras 		      }
3622fe8fb19SBen Gras 		  errno = EDOM;
3632fe8fb19SBen Gras 		}
3642fe8fb19SBen Gras 		break;
3652fe8fb19SBen Gras 	    case 17:
3662fe8fb19SBen Gras 	    case 117:
3672fe8fb19SBen Gras 		/* log(x<0) */
3682fe8fb19SBen Gras 		exc.type = DOMAIN;
3692fe8fb19SBen Gras 		exc.name = type < 100 ? "log" : "logf";
3702fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
3712fe8fb19SBen Gras 		  exc.retval = -HUGE;
3722fe8fb19SBen Gras 		else
37384d9c625SLionel Sambuc 		  exc.retval = zero/zero;
3742fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
3752fe8fb19SBen Gras 		  errno = EDOM;
3762fe8fb19SBen Gras 		else if (!matherr(&exc)) {
3772fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
3782fe8fb19SBen Gras 			(void) WRITE2("log: DOMAIN error\n", 18);
3792fe8fb19SBen Gras 		      }
3802fe8fb19SBen Gras 		  errno = EDOM;
3812fe8fb19SBen Gras 		}
3822fe8fb19SBen Gras 		break;
3832fe8fb19SBen Gras 	    case 18:
3842fe8fb19SBen Gras 	    case 118:
3852fe8fb19SBen Gras 		/* log10(0) */
3862fe8fb19SBen Gras 		exc.type = SING;
3872fe8fb19SBen Gras 		exc.name = type < 100 ? "log10" : "log10f";
3882fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
3892fe8fb19SBen Gras 		  exc.retval = -HUGE;
3902fe8fb19SBen Gras 		else
3912fe8fb19SBen Gras 		  exc.retval = -HUGE_VAL;
3922fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
3932fe8fb19SBen Gras 		  errno = ERANGE;
3942fe8fb19SBen Gras 		else if (!matherr(&exc)) {
3952fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
3962fe8fb19SBen Gras 			(void) WRITE2("log10: SING error\n", 18);
3972fe8fb19SBen Gras 		      }
3982fe8fb19SBen Gras 		  errno = EDOM;
3992fe8fb19SBen Gras 		}
4002fe8fb19SBen Gras 		break;
4012fe8fb19SBen Gras 	    case 19:
4022fe8fb19SBen Gras 	    case 119:
4032fe8fb19SBen Gras 		/* log10(x<0) */
4042fe8fb19SBen Gras 		exc.type = DOMAIN;
4052fe8fb19SBen Gras 		exc.name = type < 100 ? "log10" : "log10f";
4062fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
4072fe8fb19SBen Gras 		  exc.retval = -HUGE;
4082fe8fb19SBen Gras 		else
40984d9c625SLionel Sambuc 		  exc.retval = zero/zero;
4102fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
4112fe8fb19SBen Gras 		  errno = EDOM;
4122fe8fb19SBen Gras 		else if (!matherr(&exc)) {
4132fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
4142fe8fb19SBen Gras 			(void) WRITE2("log10: DOMAIN error\n", 20);
4152fe8fb19SBen Gras 		      }
4162fe8fb19SBen Gras 		  errno = EDOM;
4172fe8fb19SBen Gras 		}
4182fe8fb19SBen Gras 		break;
4192fe8fb19SBen Gras 	    case 20:
4202fe8fb19SBen Gras 	    case 120:
4212fe8fb19SBen Gras 		/* pow(0.0,0.0) */
4222fe8fb19SBen Gras 		/* error only if _LIB_VERSION == _SVID_ */
4232fe8fb19SBen Gras 		exc.type = DOMAIN;
4242fe8fb19SBen Gras 		exc.name = type < 100 ? "pow" : "powf";
4252fe8fb19SBen Gras 		exc.retval = zero;
4262fe8fb19SBen Gras 		if (_LIB_VERSION != _SVID_) exc.retval = 1.0;
4272fe8fb19SBen Gras 		else if (!matherr(&exc)) {
4282fe8fb19SBen Gras 			(void) WRITE2("pow(0,0): DOMAIN error\n", 23);
4292fe8fb19SBen Gras 			errno = EDOM;
4302fe8fb19SBen Gras 		}
4312fe8fb19SBen Gras 		break;
4322fe8fb19SBen Gras 	    case 21:
4332fe8fb19SBen Gras 	    case 121:
4342fe8fb19SBen Gras 		/* pow(x,y) overflow */
4352fe8fb19SBen Gras 		exc.type = OVERFLOW;
4362fe8fb19SBen Gras 		exc.name = type < 100 ? "pow" : "powf";
4372fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_) {
4382fe8fb19SBen Gras 		  exc.retval = HUGE;
4392fe8fb19SBen Gras 		  y *= 0.5;
4402fe8fb19SBen Gras 		  if(x<zero&&rint(y)!=y) exc.retval = -HUGE;
4412fe8fb19SBen Gras 		} else {
4422fe8fb19SBen Gras 		  exc.retval = HUGE_VAL;
4432fe8fb19SBen Gras 		  y *= 0.5;
4442fe8fb19SBen Gras 		  if(x<zero&&rint(y)!=y) exc.retval = -HUGE_VAL;
4452fe8fb19SBen Gras 		}
4462fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
4472fe8fb19SBen Gras 		  errno = ERANGE;
4482fe8fb19SBen Gras 		else if (!matherr(&exc)) {
4492fe8fb19SBen Gras 			errno = ERANGE;
4502fe8fb19SBen Gras 		}
4512fe8fb19SBen Gras 		break;
4522fe8fb19SBen Gras 	    case 22:
4532fe8fb19SBen Gras 	    case 122:
4542fe8fb19SBen Gras 		/* pow(x,y) underflow */
4552fe8fb19SBen Gras 		exc.type = UNDERFLOW;
4562fe8fb19SBen Gras 		exc.name = type < 100 ? "pow" : "powf";
4572fe8fb19SBen Gras 		exc.retval =  zero;
4582fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
4592fe8fb19SBen Gras 		  errno = ERANGE;
4602fe8fb19SBen Gras 		else if (!matherr(&exc)) {
4612fe8fb19SBen Gras 			errno = ERANGE;
4622fe8fb19SBen Gras 		}
4632fe8fb19SBen Gras 		break;
4642fe8fb19SBen Gras 	    case 23:
4652fe8fb19SBen Gras 	    case 123:
4662fe8fb19SBen Gras 		/* 0**neg */
4672fe8fb19SBen Gras 		exc.type = DOMAIN;
4682fe8fb19SBen Gras 		exc.name = type < 100 ? "pow" : "powf";
4692fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
4702fe8fb19SBen Gras 		  exc.retval = zero;
4712fe8fb19SBen Gras 		else
472*0a6a1f1dSLionel Sambuc 		  exc.retval = HUGE_VAL;
4732fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
4742fe8fb19SBen Gras 		  errno = EDOM;
4752fe8fb19SBen Gras 		else if (!matherr(&exc)) {
4762fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
4772fe8fb19SBen Gras 			(void) WRITE2("pow(0,neg): DOMAIN error\n", 25);
4782fe8fb19SBen Gras 		      }
4792fe8fb19SBen Gras 		  errno = EDOM;
4802fe8fb19SBen Gras 		}
4812fe8fb19SBen Gras 		break;
4822fe8fb19SBen Gras 	    case 24:
4832fe8fb19SBen Gras 	    case 124:
4842fe8fb19SBen Gras 		/* neg**non-integral */
4852fe8fb19SBen Gras 		exc.type = DOMAIN;
4862fe8fb19SBen Gras 		exc.name = type < 100 ? "pow" : "powf";
4872fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
4882fe8fb19SBen Gras 		    exc.retval = zero;
4892fe8fb19SBen Gras 		else
4902fe8fb19SBen Gras 		    exc.retval = zero/zero;	/* X/Open allow NaN */
4912fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
4922fe8fb19SBen Gras 		   errno = EDOM;
4932fe8fb19SBen Gras 		else if (!matherr(&exc)) {
4942fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
4952fe8fb19SBen Gras 			(void) WRITE2("neg**non-integral: DOMAIN error\n", 32);
4962fe8fb19SBen Gras 		      }
4972fe8fb19SBen Gras 		  errno = EDOM;
4982fe8fb19SBen Gras 		}
4992fe8fb19SBen Gras 		break;
5002fe8fb19SBen Gras 	    case 25:
5012fe8fb19SBen Gras 	    case 125:
5022fe8fb19SBen Gras 		/* sinh(finite) overflow */
5032fe8fb19SBen Gras 		exc.type = OVERFLOW;
5042fe8fb19SBen Gras 		exc.name = type < 100 ? "sinh" : "sinhf";
5052fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
5062fe8fb19SBen Gras 		  exc.retval = ( (x>zero) ? HUGE : -HUGE);
5072fe8fb19SBen Gras 		else
5082fe8fb19SBen Gras 		  exc.retval = ( (x>zero) ? HUGE_VAL : -HUGE_VAL);
5092fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
5102fe8fb19SBen Gras 		  errno = ERANGE;
5112fe8fb19SBen Gras 		else if (!matherr(&exc)) {
5122fe8fb19SBen Gras 			errno = ERANGE;
5132fe8fb19SBen Gras 		}
5142fe8fb19SBen Gras 		break;
5152fe8fb19SBen Gras 	    case 26:
5162fe8fb19SBen Gras 	    case 126:
51784d9c625SLionel Sambuc 	    case 226:
5182fe8fb19SBen Gras 		/* sqrt(x<0) */
5192fe8fb19SBen Gras 		exc.type = DOMAIN;
52084d9c625SLionel Sambuc 		if (type == 26)
52184d9c625SLionel Sambuc 			exc.name = "sqrt";
52284d9c625SLionel Sambuc 		else if (type == 126)
52384d9c625SLionel Sambuc 			exc.name = "sqrtf";
52484d9c625SLionel Sambuc 		else
52584d9c625SLionel Sambuc 			exc.name = "sqrtl";
5262fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
5272fe8fb19SBen Gras 		  exc.retval = zero;
5282fe8fb19SBen Gras 		else
5292fe8fb19SBen Gras 		  exc.retval = zero/zero;
5302fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
5312fe8fb19SBen Gras 		  errno = EDOM;
5322fe8fb19SBen Gras 		else if (!matherr(&exc)) {
5332fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
5342fe8fb19SBen Gras 			(void) WRITE2("sqrt: DOMAIN error\n", 19);
5352fe8fb19SBen Gras 		      }
5362fe8fb19SBen Gras 		  errno = EDOM;
5372fe8fb19SBen Gras 		}
5382fe8fb19SBen Gras 		break;
5392fe8fb19SBen Gras             case 27:
5402fe8fb19SBen Gras 	    case 127:
54184d9c625SLionel Sambuc 	    case 227:
5422fe8fb19SBen Gras                 /* fmod(x,0) */
5432fe8fb19SBen Gras                 exc.type = DOMAIN;
54484d9c625SLionel Sambuc 		if (type == 27)
54584d9c625SLionel Sambuc 			exc.name = "fmod";
54684d9c625SLionel Sambuc 		else if (type == 127)
54784d9c625SLionel Sambuc 			exc.name = "fmodf";
54884d9c625SLionel Sambuc 		else
54984d9c625SLionel Sambuc 			exc.name = "fmodl";
5502fe8fb19SBen Gras                 if (_LIB_VERSION == _SVID_)
5512fe8fb19SBen Gras                     exc.retval = x;
5522fe8fb19SBen Gras 		else
5532fe8fb19SBen Gras 		    exc.retval = zero/zero;
5542fe8fb19SBen Gras                 if (_LIB_VERSION == _POSIX_)
5552fe8fb19SBen Gras                   errno = EDOM;
5562fe8fb19SBen Gras                 else if (!matherr(&exc)) {
5572fe8fb19SBen Gras                   if (_LIB_VERSION == _SVID_) {
5582fe8fb19SBen Gras                     (void) WRITE2("fmod:  DOMAIN error\n", 20);
5592fe8fb19SBen Gras                   }
5602fe8fb19SBen Gras                   errno = EDOM;
5612fe8fb19SBen Gras                 }
5622fe8fb19SBen Gras                 break;
5632fe8fb19SBen Gras             case 28:
5642fe8fb19SBen Gras 	    case 128:
5652fe8fb19SBen Gras                 /* remainder(x,0) */
5662fe8fb19SBen Gras                 exc.type = DOMAIN;
5672fe8fb19SBen Gras                 exc.name = type < 100 ? "remainder" : "remainderf";
5682fe8fb19SBen Gras                 exc.retval = zero/zero;
5692fe8fb19SBen Gras                 if (_LIB_VERSION == _POSIX_)
5702fe8fb19SBen Gras                   errno = EDOM;
5712fe8fb19SBen Gras                 else if (!matherr(&exc)) {
5722fe8fb19SBen Gras                   if (_LIB_VERSION == _SVID_) {
5732fe8fb19SBen Gras                     (void) WRITE2("remainder: DOMAIN error\n", 24);
5742fe8fb19SBen Gras                   }
5752fe8fb19SBen Gras                   errno = EDOM;
5762fe8fb19SBen Gras                 }
5772fe8fb19SBen Gras                 break;
5782fe8fb19SBen Gras             case 29:
5792fe8fb19SBen Gras 	    case 129:
5802fe8fb19SBen Gras                 /* acosh(x<1) */
5812fe8fb19SBen Gras                 exc.type = DOMAIN;
5822fe8fb19SBen Gras                 exc.name = type < 100 ? "acosh" : "acoshf";
5832fe8fb19SBen Gras                 exc.retval = zero/zero;
5842fe8fb19SBen Gras                 if (_LIB_VERSION == _POSIX_)
5852fe8fb19SBen Gras                   errno = EDOM;
5862fe8fb19SBen Gras                 else if (!matherr(&exc)) {
5872fe8fb19SBen Gras                   if (_LIB_VERSION == _SVID_) {
5882fe8fb19SBen Gras                     (void) WRITE2("acosh: DOMAIN error\n", 20);
5892fe8fb19SBen Gras                   }
5902fe8fb19SBen Gras                   errno = EDOM;
5912fe8fb19SBen Gras                 }
5922fe8fb19SBen Gras                 break;
5932fe8fb19SBen Gras             case 30:
5942fe8fb19SBen Gras 	    case 130:
5952fe8fb19SBen Gras                 /* atanh(|x|>1) */
5962fe8fb19SBen Gras                 exc.type = DOMAIN;
5972fe8fb19SBen Gras                 exc.name = type < 100 ? "atanh" : "atanhf";
5982fe8fb19SBen Gras                 exc.retval = zero/zero;
5992fe8fb19SBen Gras                 if (_LIB_VERSION == _POSIX_)
6002fe8fb19SBen Gras                   errno = EDOM;
6012fe8fb19SBen Gras                 else if (!matherr(&exc)) {
6022fe8fb19SBen Gras                   if (_LIB_VERSION == _SVID_) {
6032fe8fb19SBen Gras                     (void) WRITE2("atanh: DOMAIN error\n", 20);
6042fe8fb19SBen Gras                   }
6052fe8fb19SBen Gras                   errno = EDOM;
6062fe8fb19SBen Gras                 }
6072fe8fb19SBen Gras                 break;
6082fe8fb19SBen Gras             case 31:
6092fe8fb19SBen Gras 	    case 131:
6102fe8fb19SBen Gras                 /* atanh(|x|=1) */
6112fe8fb19SBen Gras                 exc.type = SING;
6122fe8fb19SBen Gras                 exc.name = type < 100 ? "atanh" : "atanhf";
6132fe8fb19SBen Gras 		exc.retval = x/zero;	/* sign(x)*inf */
6142fe8fb19SBen Gras                 if (_LIB_VERSION == _POSIX_)
6152fe8fb19SBen Gras                   errno = EDOM;
6162fe8fb19SBen Gras                 else if (!matherr(&exc)) {
6172fe8fb19SBen Gras                   if (_LIB_VERSION == _SVID_) {
6182fe8fb19SBen Gras                     (void) WRITE2("atanh: SING error\n", 18);
6192fe8fb19SBen Gras                   }
6202fe8fb19SBen Gras                   errno = EDOM;
6212fe8fb19SBen Gras                 }
6222fe8fb19SBen Gras                 break;
6232fe8fb19SBen Gras 	    case 32:
6242fe8fb19SBen Gras 	    case 132:
6252fe8fb19SBen Gras 		/* scalb overflow; SVID also returns +-HUGE_VAL */
6262fe8fb19SBen Gras 		exc.type = OVERFLOW;
6272fe8fb19SBen Gras 		exc.name = type < 100 ? "scalb" : "scalbf";
6282fe8fb19SBen Gras 		exc.retval = x > zero ? HUGE_VAL : -HUGE_VAL;
6292fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
6302fe8fb19SBen Gras 		  errno = ERANGE;
6312fe8fb19SBen Gras 		else if (!matherr(&exc)) {
6322fe8fb19SBen Gras 			errno = ERANGE;
6332fe8fb19SBen Gras 		}
6342fe8fb19SBen Gras 		break;
6352fe8fb19SBen Gras 	    case 33:
6362fe8fb19SBen Gras 	    case 133:
6372fe8fb19SBen Gras 		/* scalb underflow */
6382fe8fb19SBen Gras 		exc.type = UNDERFLOW;
6392fe8fb19SBen Gras 		exc.name = type < 100 ? "scalb" : "scalbf";
6402fe8fb19SBen Gras 		exc.retval = copysign(zero,x);
6412fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
6422fe8fb19SBen Gras 		  errno = ERANGE;
6432fe8fb19SBen Gras 		else if (!matherr(&exc)) {
6442fe8fb19SBen Gras 			errno = ERANGE;
6452fe8fb19SBen Gras 		}
6462fe8fb19SBen Gras 		break;
6472fe8fb19SBen Gras 	    case 34:
6482fe8fb19SBen Gras 	    case 134:
6492fe8fb19SBen Gras 		/* j0(|x|>X_TLOSS) */
6502fe8fb19SBen Gras                 exc.type = TLOSS;
6512fe8fb19SBen Gras                 exc.name = type < 100 ? "j0" : "j0f";
6522fe8fb19SBen Gras                 exc.retval = zero;
6532fe8fb19SBen Gras                 if (_LIB_VERSION == _POSIX_)
6542fe8fb19SBen Gras                         errno = ERANGE;
6552fe8fb19SBen Gras                 else if (!matherr(&exc)) {
6562fe8fb19SBen Gras                         if (_LIB_VERSION == _SVID_) {
6572fe8fb19SBen Gras                                 (void) WRITE2(exc.name, 2);
6582fe8fb19SBen Gras                                 (void) WRITE2(": TLOSS error\n", 14);
6592fe8fb19SBen Gras                         }
6602fe8fb19SBen Gras                         errno = ERANGE;
6612fe8fb19SBen Gras                 }
6622fe8fb19SBen Gras 		break;
6632fe8fb19SBen Gras 	    case 35:
6642fe8fb19SBen Gras 	    case 135:
6652fe8fb19SBen Gras 		/* y0(x>X_TLOSS) */
6662fe8fb19SBen Gras                 exc.type = TLOSS;
6672fe8fb19SBen Gras                 exc.name = type < 100 ? "y0" : "y0f";
6682fe8fb19SBen Gras                 exc.retval = zero;
6692fe8fb19SBen Gras                 if (_LIB_VERSION == _POSIX_)
6702fe8fb19SBen Gras                         errno = ERANGE;
6712fe8fb19SBen Gras                 else if (!matherr(&exc)) {
6722fe8fb19SBen Gras                         if (_LIB_VERSION == _SVID_) {
6732fe8fb19SBen Gras                                 (void) WRITE2(exc.name, 2);
6742fe8fb19SBen Gras                                 (void) WRITE2(": TLOSS error\n", 14);
6752fe8fb19SBen Gras                         }
6762fe8fb19SBen Gras                         errno = ERANGE;
6772fe8fb19SBen Gras                 }
6782fe8fb19SBen Gras 		break;
6792fe8fb19SBen Gras 	    case 36:
6802fe8fb19SBen Gras 	    case 136:
6812fe8fb19SBen Gras 		/* j1(|x|>X_TLOSS) */
6822fe8fb19SBen Gras                 exc.type = TLOSS;
6832fe8fb19SBen Gras                 exc.name = type < 100 ? "j1" : "j1f";
6842fe8fb19SBen Gras                 exc.retval = zero;
6852fe8fb19SBen Gras                 if (_LIB_VERSION == _POSIX_)
6862fe8fb19SBen Gras                         errno = ERANGE;
6872fe8fb19SBen Gras                 else if (!matherr(&exc)) {
6882fe8fb19SBen Gras                         if (_LIB_VERSION == _SVID_) {
6892fe8fb19SBen Gras                                 (void) WRITE2(exc.name, 2);
6902fe8fb19SBen Gras                                 (void) WRITE2(": TLOSS error\n", 14);
6912fe8fb19SBen Gras                         }
6922fe8fb19SBen Gras                         errno = ERANGE;
6932fe8fb19SBen Gras                 }
6942fe8fb19SBen Gras 		break;
6952fe8fb19SBen Gras 	    case 37:
6962fe8fb19SBen Gras 	    case 137:
6972fe8fb19SBen Gras 		/* y1(x>X_TLOSS) */
6982fe8fb19SBen Gras                 exc.type = TLOSS;
6992fe8fb19SBen Gras                 exc.name = type < 100 ? "y1" : "y1f";
7002fe8fb19SBen Gras                 exc.retval = zero;
7012fe8fb19SBen Gras                 if (_LIB_VERSION == _POSIX_)
7022fe8fb19SBen Gras                         errno = ERANGE;
7032fe8fb19SBen Gras                 else if (!matherr(&exc)) {
7042fe8fb19SBen Gras                         if (_LIB_VERSION == _SVID_) {
7052fe8fb19SBen Gras                                 (void) WRITE2(exc.name, 2);
7062fe8fb19SBen Gras                                 (void) WRITE2(": TLOSS error\n", 14);
7072fe8fb19SBen Gras                         }
7082fe8fb19SBen Gras                         errno = ERANGE;
7092fe8fb19SBen Gras                 }
7102fe8fb19SBen Gras 		break;
7112fe8fb19SBen Gras 	    case 38:
7122fe8fb19SBen Gras 	    case 138:
7132fe8fb19SBen Gras 		/* jn(|x|>X_TLOSS) */
7142fe8fb19SBen Gras                 exc.type = TLOSS;
7152fe8fb19SBen Gras                 exc.name = type < 100 ? "jn" : "jnf";
7162fe8fb19SBen Gras                 exc.retval = zero;
7172fe8fb19SBen Gras                 if (_LIB_VERSION == _POSIX_)
7182fe8fb19SBen Gras                         errno = ERANGE;
7192fe8fb19SBen Gras                 else if (!matherr(&exc)) {
7202fe8fb19SBen Gras                         if (_LIB_VERSION == _SVID_) {
7212fe8fb19SBen Gras                                 (void) WRITE2(exc.name, 2);
7222fe8fb19SBen Gras                                 (void) WRITE2(": TLOSS error\n", 14);
7232fe8fb19SBen Gras                         }
7242fe8fb19SBen Gras                         errno = ERANGE;
7252fe8fb19SBen Gras                 }
7262fe8fb19SBen Gras 		break;
7272fe8fb19SBen Gras 	    case 39:
7282fe8fb19SBen Gras 	    case 139:
7292fe8fb19SBen Gras 		/* yn(x>X_TLOSS) */
7302fe8fb19SBen Gras                 exc.type = TLOSS;
7312fe8fb19SBen Gras                 exc.name = type < 100 ? "yn" : "ynf";
7322fe8fb19SBen Gras                 exc.retval = zero;
7332fe8fb19SBen Gras                 if (_LIB_VERSION == _POSIX_)
7342fe8fb19SBen Gras                         errno = ERANGE;
7352fe8fb19SBen Gras                 else if (!matherr(&exc)) {
7362fe8fb19SBen Gras                         if (_LIB_VERSION == _SVID_) {
7372fe8fb19SBen Gras                                 (void) WRITE2(exc.name, 2);
7382fe8fb19SBen Gras                                 (void) WRITE2(": TLOSS error\n", 14);
7392fe8fb19SBen Gras                         }
7402fe8fb19SBen Gras                         errno = ERANGE;
7412fe8fb19SBen Gras                 }
7422fe8fb19SBen Gras 		break;
7432fe8fb19SBen Gras 	    case 40:
7442fe8fb19SBen Gras 	    case 140:
7452fe8fb19SBen Gras 		/* gamma(finite) overflow */
7462fe8fb19SBen Gras 		exc.type = OVERFLOW;
7472fe8fb19SBen Gras 		exc.name = type < 100 ? "gamma" : "gammaf";
7482fe8fb19SBen Gras                 if (_LIB_VERSION == _SVID_)
7492fe8fb19SBen Gras                   exc.retval = HUGE;
7502fe8fb19SBen Gras                 else
7512fe8fb19SBen Gras                   exc.retval = HUGE_VAL;
7522fe8fb19SBen Gras                 if (_LIB_VERSION == _POSIX_)
7532fe8fb19SBen Gras 		  errno = ERANGE;
7542fe8fb19SBen Gras                 else if (!matherr(&exc)) {
7552fe8fb19SBen Gras                   errno = ERANGE;
7562fe8fb19SBen Gras                 }
7572fe8fb19SBen Gras 		break;
7582fe8fb19SBen Gras 	    case 41:
7592fe8fb19SBen Gras 	    case 141:
7602fe8fb19SBen Gras 		/* gamma(-integer) or gamma(0) */
7612fe8fb19SBen Gras 		exc.type = SING;
7622fe8fb19SBen Gras 		exc.name = type < 100 ? "gamma" : "gammaf";
7632fe8fb19SBen Gras                 if (_LIB_VERSION == _SVID_)
7642fe8fb19SBen Gras                   exc.retval = HUGE;
7652fe8fb19SBen Gras                 else
7662fe8fb19SBen Gras                   exc.retval = HUGE_VAL;
7672fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
7682fe8fb19SBen Gras 		  errno = EDOM;
7692fe8fb19SBen Gras 		else if (!matherr(&exc)) {
7702fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
7712fe8fb19SBen Gras 			(void) WRITE2("gamma: SING error\n", 18);
7722fe8fb19SBen Gras 		      }
7732fe8fb19SBen Gras 		  errno = EDOM;
7742fe8fb19SBen Gras 		}
7752fe8fb19SBen Gras 		break;
7762fe8fb19SBen Gras 	    case 42:
7772fe8fb19SBen Gras 	    case 142:
7782fe8fb19SBen Gras 		/* pow(NaN,0.0) */
7792fe8fb19SBen Gras 		/* error only if _LIB_VERSION == _SVID_ & _XOPEN_ */
7802fe8fb19SBen Gras 		exc.type = DOMAIN;
7812fe8fb19SBen Gras 		exc.name = type < 100 ? "pow" : "powf";
7822fe8fb19SBen Gras 		exc.retval = x;
7832fe8fb19SBen Gras 		if (_LIB_VERSION == _IEEE_ ||
7842fe8fb19SBen Gras 		    _LIB_VERSION == _POSIX_) exc.retval = 1.0;
7852fe8fb19SBen Gras 		else if (!matherr(&exc)) {
7862fe8fb19SBen Gras 			errno = EDOM;
7872fe8fb19SBen Gras 		}
7882fe8fb19SBen Gras 		break;
7892fe8fb19SBen Gras 	    case 48:
7902fe8fb19SBen Gras 	    case 148:
7912fe8fb19SBen Gras 		/* log2(0) */
7922fe8fb19SBen Gras 		exc.type = SING;
7932fe8fb19SBen Gras 		exc.name = type < 100 ? "log2" : "log2f";
7942fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
7952fe8fb19SBen Gras 		  exc.retval = -HUGE;
7962fe8fb19SBen Gras 		else
7972fe8fb19SBen Gras 		  exc.retval = -HUGE_VAL;
7982fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
7992fe8fb19SBen Gras 		  errno = ERANGE;
8002fe8fb19SBen Gras 		else if (!matherr(&exc)) {
8012fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
8022fe8fb19SBen Gras 			(void) WRITE2("log2: SING error\n", 18);
8032fe8fb19SBen Gras 		      }
8042fe8fb19SBen Gras 		  errno = EDOM;
8052fe8fb19SBen Gras 		}
8062fe8fb19SBen Gras 		break;
8072fe8fb19SBen Gras 	    case 49:
8082fe8fb19SBen Gras 	    case 149:
8092fe8fb19SBen Gras 		/* log2(x<0) */
8102fe8fb19SBen Gras 		exc.type = DOMAIN;
8112fe8fb19SBen Gras 		exc.name = type < 100 ? "log2" : "log2f";
8122fe8fb19SBen Gras 		if (_LIB_VERSION == _SVID_)
8132fe8fb19SBen Gras 		  exc.retval = -HUGE;
8142fe8fb19SBen Gras 		else
81584d9c625SLionel Sambuc 		  exc.retval = zero/zero;
8162fe8fb19SBen Gras 		if (_LIB_VERSION == _POSIX_)
8172fe8fb19SBen Gras 		  errno = EDOM;
8182fe8fb19SBen Gras 		else if (!matherr(&exc)) {
8192fe8fb19SBen Gras 		  if (_LIB_VERSION == _SVID_) {
8202fe8fb19SBen Gras 			(void) WRITE2("log2: DOMAIN error\n", 20);
8212fe8fb19SBen Gras 		      }
8222fe8fb19SBen Gras 		  errno = EDOM;
8232fe8fb19SBen Gras 		}
8242fe8fb19SBen Gras 		break;
8252fe8fb19SBen Gras 	}
8262fe8fb19SBen Gras 	return exc.retval;
8272fe8fb19SBen Gras }
828