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