1*25c28e83SPiotr Jasiukajtis /*
2*25c28e83SPiotr Jasiukajtis  * CDDL HEADER START
3*25c28e83SPiotr Jasiukajtis  *
4*25c28e83SPiotr Jasiukajtis  * The contents of this file are subject to the terms of the
5*25c28e83SPiotr Jasiukajtis  * Common Development and Distribution License (the "License").
6*25c28e83SPiotr Jasiukajtis  * You may not use this file except in compliance with the License.
7*25c28e83SPiotr Jasiukajtis  *
8*25c28e83SPiotr Jasiukajtis  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*25c28e83SPiotr Jasiukajtis  * or http://www.opensolaris.org/os/licensing.
10*25c28e83SPiotr Jasiukajtis  * See the License for the specific language governing permissions
11*25c28e83SPiotr Jasiukajtis  * and limitations under the License.
12*25c28e83SPiotr Jasiukajtis  *
13*25c28e83SPiotr Jasiukajtis  * When distributing Covered Code, include this CDDL HEADER in each
14*25c28e83SPiotr Jasiukajtis  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*25c28e83SPiotr Jasiukajtis  * If applicable, add the following below this CDDL HEADER, with the
16*25c28e83SPiotr Jasiukajtis  * fields enclosed by brackets "[]" replaced with your own identifying
17*25c28e83SPiotr Jasiukajtis  * information: Portions Copyright [yyyy] [name of copyright owner]
18*25c28e83SPiotr Jasiukajtis  *
19*25c28e83SPiotr Jasiukajtis  * CDDL HEADER END
20*25c28e83SPiotr Jasiukajtis  */
21*25c28e83SPiotr Jasiukajtis /*
22*25c28e83SPiotr Jasiukajtis  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
23*25c28e83SPiotr Jasiukajtis  */
24*25c28e83SPiotr Jasiukajtis /*
25*25c28e83SPiotr Jasiukajtis  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
26*25c28e83SPiotr Jasiukajtis  * Use is subject to license terms.
27*25c28e83SPiotr Jasiukajtis  */
28*25c28e83SPiotr Jasiukajtis 
29*25c28e83SPiotr Jasiukajtis #include "libm.h"
30*25c28e83SPiotr Jasiukajtis #include "xpg6.h"	/* __xpg6 */
31*25c28e83SPiotr Jasiukajtis #include <stdio.h>
32*25c28e83SPiotr Jasiukajtis #include <float.h>		/* DBL_MAX, DBL_MIN */
33*25c28e83SPiotr Jasiukajtis #include <unistd.h>		/* write */
34*25c28e83SPiotr Jasiukajtis #if defined(__x86)
35*25c28e83SPiotr Jasiukajtis #include <ieeefp.h>
36*25c28e83SPiotr Jasiukajtis #undef	fp_class
37*25c28e83SPiotr Jasiukajtis #define	fp_class	fpclass
38*25c28e83SPiotr Jasiukajtis #define	fp_quiet	FP_QNAN
39*25c28e83SPiotr Jasiukajtis #endif
40*25c28e83SPiotr Jasiukajtis #include <errno.h>
41*25c28e83SPiotr Jasiukajtis #undef fflush
42*25c28e83SPiotr Jasiukajtis #include <sys/isa_defs.h>
43*25c28e83SPiotr Jasiukajtis 
44*25c28e83SPiotr Jasiukajtis /* INDENT OFF */
45*25c28e83SPiotr Jasiukajtis /*
46*25c28e83SPiotr Jasiukajtis  * Report libm exception error according to System V Interface Definition
47*25c28e83SPiotr Jasiukajtis  * (SVID).
48*25c28e83SPiotr Jasiukajtis  * Error mapping:
49*25c28e83SPiotr Jasiukajtis  *	1 -- acos(|x|>1)
50*25c28e83SPiotr Jasiukajtis  *	2 -- asin(|x|>1)
51*25c28e83SPiotr Jasiukajtis  *	3 -- atan2(+-0,+-0)
52*25c28e83SPiotr Jasiukajtis  *	4 -- hypot overflow
53*25c28e83SPiotr Jasiukajtis  *	5 -- cosh overflow
54*25c28e83SPiotr Jasiukajtis  *	6 -- exp overflow
55*25c28e83SPiotr Jasiukajtis  *	7 -- exp underflow
56*25c28e83SPiotr Jasiukajtis  *	8 -- y0(0)
57*25c28e83SPiotr Jasiukajtis  *	9 -- y0(-ve)
58*25c28e83SPiotr Jasiukajtis  *	10-- y1(0)
59*25c28e83SPiotr Jasiukajtis  *	11-- y1(-ve)
60*25c28e83SPiotr Jasiukajtis  *	12-- yn(0)
61*25c28e83SPiotr Jasiukajtis  *	13-- yn(-ve)
62*25c28e83SPiotr Jasiukajtis  *	14-- lgamma(finite) overflow
63*25c28e83SPiotr Jasiukajtis  *	15-- lgamma(-integer)
64*25c28e83SPiotr Jasiukajtis  *	16-- log(0)
65*25c28e83SPiotr Jasiukajtis  *	17-- log(x<0)
66*25c28e83SPiotr Jasiukajtis  *	18-- log10(0)
67*25c28e83SPiotr Jasiukajtis  *	19-- log10(x<0)
68*25c28e83SPiotr Jasiukajtis  *	20-- pow(0.0,0.0)
69*25c28e83SPiotr Jasiukajtis  *	21-- pow(x,y) overflow
70*25c28e83SPiotr Jasiukajtis  *	22-- pow(x,y) underflow
71*25c28e83SPiotr Jasiukajtis  *	23-- pow(0,negative)
72*25c28e83SPiotr Jasiukajtis  *	24-- pow(neg,non-integral)
73*25c28e83SPiotr Jasiukajtis  *	25-- sinh(finite) overflow
74*25c28e83SPiotr Jasiukajtis  *	26-- sqrt(negative)
75*25c28e83SPiotr Jasiukajtis  *	27-- fmod(x,0)
76*25c28e83SPiotr Jasiukajtis  *	28-- remainder(x,0)
77*25c28e83SPiotr Jasiukajtis  *	29-- acosh(x<1)
78*25c28e83SPiotr Jasiukajtis  *	30-- atanh(|x|>1)
79*25c28e83SPiotr Jasiukajtis  *	31-- atanh(|x|=1)
80*25c28e83SPiotr Jasiukajtis  *	32-- scalb overflow
81*25c28e83SPiotr Jasiukajtis  *	33-- scalb underflow
82*25c28e83SPiotr Jasiukajtis  *	34-- j0(|x|>X_TLOSS)
83*25c28e83SPiotr Jasiukajtis  *	35-- y0(x>X_TLOSS)
84*25c28e83SPiotr Jasiukajtis  *	36-- j1(|x|>X_TLOSS)
85*25c28e83SPiotr Jasiukajtis  *	37-- y1(x>X_TLOSS)
86*25c28e83SPiotr Jasiukajtis  *	38-- jn(|x|>X_TLOSS, n)
87*25c28e83SPiotr Jasiukajtis  *	39-- yn(x>X_TLOSS, n)
88*25c28e83SPiotr Jasiukajtis  *	40-- gamma(finite) overflow
89*25c28e83SPiotr Jasiukajtis  *	41-- gamma(-integer)
90*25c28e83SPiotr Jasiukajtis  *	42-- pow(NaN,0.0) return NaN for SVID/XOPEN
91*25c28e83SPiotr Jasiukajtis  *	43-- log1p(-1)
92*25c28e83SPiotr Jasiukajtis  *	44-- log1p(x<-1)
93*25c28e83SPiotr Jasiukajtis  *	45-- logb(0)
94*25c28e83SPiotr Jasiukajtis  *	46-- nextafter overflow
95*25c28e83SPiotr Jasiukajtis  *	47-- scalb(x,inf)
96*25c28e83SPiotr Jasiukajtis  */
97*25c28e83SPiotr Jasiukajtis /* INDENT ON */
98*25c28e83SPiotr Jasiukajtis 
99*25c28e83SPiotr Jasiukajtis static double setexception(int, double);
100*25c28e83SPiotr Jasiukajtis 
101*25c28e83SPiotr Jasiukajtis static const union {
102*25c28e83SPiotr Jasiukajtis 	unsigned	x[2];
103*25c28e83SPiotr Jasiukajtis 	double		d;
104*25c28e83SPiotr Jasiukajtis } C[] = {
105*25c28e83SPiotr Jasiukajtis #ifdef _LITTLE_ENDIAN
106*25c28e83SPiotr Jasiukajtis 	{ 0xffffffff, 0x7fffffff },
107*25c28e83SPiotr Jasiukajtis 	{ 0x54442d18, 0x400921fb },
108*25c28e83SPiotr Jasiukajtis #else
109*25c28e83SPiotr Jasiukajtis 	{ 0x7fffffff, 0xffffffff },
110*25c28e83SPiotr Jasiukajtis 	{ 0x400921fb, 0x54442d18 },
111*25c28e83SPiotr Jasiukajtis #endif
112*25c28e83SPiotr Jasiukajtis };
113*25c28e83SPiotr Jasiukajtis 
114*25c28e83SPiotr Jasiukajtis #define	NaN	C[0].d
115*25c28e83SPiotr Jasiukajtis #define	PI_RZ	C[1].d
116*25c28e83SPiotr Jasiukajtis 
117*25c28e83SPiotr Jasiukajtis #define	__HI(x)	((unsigned *)&x)[HIWORD]
118*25c28e83SPiotr Jasiukajtis #define	__LO(x)	((unsigned *)&x)[LOWORD]
119*25c28e83SPiotr Jasiukajtis #undef	Inf
120*25c28e83SPiotr Jasiukajtis #define	Inf	HUGE_VAL
121*25c28e83SPiotr Jasiukajtis 
122*25c28e83SPiotr Jasiukajtis double
_SVID_libm_err(double x,double y,int type)123*25c28e83SPiotr Jasiukajtis _SVID_libm_err(double x, double y, int type) {
124*25c28e83SPiotr Jasiukajtis 	struct exception	exc;
125*25c28e83SPiotr Jasiukajtis 	double			t, w, ieee_retval = 0;
126*25c28e83SPiotr Jasiukajtis 	enum version		lib_version = _lib_version;
127*25c28e83SPiotr Jasiukajtis 	int			iy;
128*25c28e83SPiotr Jasiukajtis 
129*25c28e83SPiotr Jasiukajtis 	/* force libm_ieee behavior in SUSv3 mode */
130*25c28e83SPiotr Jasiukajtis 	if ((__xpg6 & _C99SUSv3_math_errexcept) != 0)
131*25c28e83SPiotr Jasiukajtis 		lib_version = libm_ieee;
132*25c28e83SPiotr Jasiukajtis 	if (lib_version == c_issue_4) {
133*25c28e83SPiotr Jasiukajtis 		(void) fflush(stdout);
134*25c28e83SPiotr Jasiukajtis 	}
135*25c28e83SPiotr Jasiukajtis 	exc.arg1 = x;
136*25c28e83SPiotr Jasiukajtis 	exc.arg2 = y;
137*25c28e83SPiotr Jasiukajtis 	switch (type) {
138*25c28e83SPiotr Jasiukajtis 	case 1:
139*25c28e83SPiotr Jasiukajtis 		/* acos(|x|>1) */
140*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
141*25c28e83SPiotr Jasiukajtis 		exc.name = "acos";
142*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(3, 1.0);
143*25c28e83SPiotr Jasiukajtis 		exc.retval = 0.0;
144*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
145*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
146*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
147*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
148*25c28e83SPiotr Jasiukajtis 				(void) write(2, "acos: DOMAIN error\n", 19);
149*25c28e83SPiotr Jasiukajtis 			}
150*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
151*25c28e83SPiotr Jasiukajtis 		}
152*25c28e83SPiotr Jasiukajtis 		break;
153*25c28e83SPiotr Jasiukajtis 	case 2:
154*25c28e83SPiotr Jasiukajtis 		/* asin(|x|>1) */
155*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
156*25c28e83SPiotr Jasiukajtis 		exc.name = "asin";
157*25c28e83SPiotr Jasiukajtis 		exc.retval = 0.0;
158*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(3, 1.0);
159*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
160*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
161*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
162*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
163*25c28e83SPiotr Jasiukajtis 				(void) write(2, "asin: DOMAIN error\n", 19);
164*25c28e83SPiotr Jasiukajtis 			}
165*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
166*25c28e83SPiotr Jasiukajtis 		}
167*25c28e83SPiotr Jasiukajtis 		break;
168*25c28e83SPiotr Jasiukajtis 	case 3:
169*25c28e83SPiotr Jasiukajtis 		/* atan2(+-0,+-0) */
170*25c28e83SPiotr Jasiukajtis 		exc.arg1 = y;
171*25c28e83SPiotr Jasiukajtis 		exc.arg2 = x;
172*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
173*25c28e83SPiotr Jasiukajtis 		exc.name = "atan2";
174*25c28e83SPiotr Jasiukajtis 		ieee_retval = copysign(1.0, x) == 1.0 ? y :
175*25c28e83SPiotr Jasiukajtis 			copysign(PI_RZ + DBL_MIN, y);
176*25c28e83SPiotr Jasiukajtis 		exc.retval = 0.0;
177*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
178*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
179*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
180*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
181*25c28e83SPiotr Jasiukajtis 				(void) write(2, "atan2: DOMAIN error\n", 20);
182*25c28e83SPiotr Jasiukajtis 			}
183*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
184*25c28e83SPiotr Jasiukajtis 		}
185*25c28e83SPiotr Jasiukajtis 		break;
186*25c28e83SPiotr Jasiukajtis 	case 4:
187*25c28e83SPiotr Jasiukajtis 		/* hypot(finite,finite) overflow */
188*25c28e83SPiotr Jasiukajtis 		exc.type = OVERFLOW;
189*25c28e83SPiotr Jasiukajtis 		exc.name = "hypot";
190*25c28e83SPiotr Jasiukajtis 		ieee_retval = Inf;
191*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
192*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE;
193*25c28e83SPiotr Jasiukajtis 		else
194*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE_VAL;
195*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi)
196*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
197*25c28e83SPiotr Jasiukajtis 		else if (!matherr(&exc))
198*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
199*25c28e83SPiotr Jasiukajtis 		break;
200*25c28e83SPiotr Jasiukajtis 	case 5:
201*25c28e83SPiotr Jasiukajtis 		/* cosh(finite) overflow */
202*25c28e83SPiotr Jasiukajtis 		exc.type = OVERFLOW;
203*25c28e83SPiotr Jasiukajtis 		exc.name = "cosh";
204*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(2, 1.0);
205*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
206*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE;
207*25c28e83SPiotr Jasiukajtis 		else
208*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE_VAL;
209*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi)
210*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
211*25c28e83SPiotr Jasiukajtis 		else if (!matherr(&exc))
212*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
213*25c28e83SPiotr Jasiukajtis 		break;
214*25c28e83SPiotr Jasiukajtis 	case 6:
215*25c28e83SPiotr Jasiukajtis 		/* exp(finite) overflow */
216*25c28e83SPiotr Jasiukajtis 		exc.type = OVERFLOW;
217*25c28e83SPiotr Jasiukajtis 		exc.name = "exp";
218*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(2, 1.0);
219*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
220*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE;
221*25c28e83SPiotr Jasiukajtis 		else
222*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE_VAL;
223*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi)
224*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
225*25c28e83SPiotr Jasiukajtis 		else if (!matherr(&exc))
226*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
227*25c28e83SPiotr Jasiukajtis 		break;
228*25c28e83SPiotr Jasiukajtis 	case 7:
229*25c28e83SPiotr Jasiukajtis 		/* exp(finite) underflow */
230*25c28e83SPiotr Jasiukajtis 		exc.type = UNDERFLOW;
231*25c28e83SPiotr Jasiukajtis 		exc.name = "exp";
232*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(1, 1.0);
233*25c28e83SPiotr Jasiukajtis 		exc.retval = 0.0;
234*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi)
235*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
236*25c28e83SPiotr Jasiukajtis 		else if (!matherr(&exc))
237*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
238*25c28e83SPiotr Jasiukajtis 		break;
239*25c28e83SPiotr Jasiukajtis 	case 8:
240*25c28e83SPiotr Jasiukajtis 		/* y0(0) = -inf */
241*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;	/* should be SING for IEEE */
242*25c28e83SPiotr Jasiukajtis 		exc.name = "y0";
243*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(0, -1.0);
244*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
245*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE;
246*25c28e83SPiotr Jasiukajtis 		else
247*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE_VAL;
248*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
249*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
250*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
251*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
252*25c28e83SPiotr Jasiukajtis 				(void) write(2, "y0: DOMAIN error\n", 17);
253*25c28e83SPiotr Jasiukajtis 			}
254*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
255*25c28e83SPiotr Jasiukajtis 		}
256*25c28e83SPiotr Jasiukajtis 		break;
257*25c28e83SPiotr Jasiukajtis 	case 9:
258*25c28e83SPiotr Jasiukajtis 		/* y0(x<0) = NaN */
259*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
260*25c28e83SPiotr Jasiukajtis 		exc.name = "y0";
261*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(3, 1.0);
262*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
263*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE;
264*25c28e83SPiotr Jasiukajtis 		else
265*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE_VAL;
266*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
267*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
268*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
269*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
270*25c28e83SPiotr Jasiukajtis 				(void) write(2, "y0: DOMAIN error\n", 17);
271*25c28e83SPiotr Jasiukajtis 			}
272*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
273*25c28e83SPiotr Jasiukajtis 		}
274*25c28e83SPiotr Jasiukajtis 		break;
275*25c28e83SPiotr Jasiukajtis 	case 10:
276*25c28e83SPiotr Jasiukajtis 		/* y1(0) = -inf */
277*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;	/* should be SING for IEEE */
278*25c28e83SPiotr Jasiukajtis 		exc.name = "y1";
279*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(0, -1.0);
280*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
281*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE;
282*25c28e83SPiotr Jasiukajtis 		else
283*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE_VAL;
284*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
285*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
286*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
287*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
288*25c28e83SPiotr Jasiukajtis 				(void) write(2, "y1: DOMAIN error\n", 17);
289*25c28e83SPiotr Jasiukajtis 			}
290*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
291*25c28e83SPiotr Jasiukajtis 		}
292*25c28e83SPiotr Jasiukajtis 		break;
293*25c28e83SPiotr Jasiukajtis 	case 11:
294*25c28e83SPiotr Jasiukajtis 		/* y1(x<0) = NaN */
295*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
296*25c28e83SPiotr Jasiukajtis 		exc.name = "y1";
297*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(3, 1.0);
298*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
299*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE;
300*25c28e83SPiotr Jasiukajtis 		else
301*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE_VAL;
302*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
303*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
304*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
305*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
306*25c28e83SPiotr Jasiukajtis 				(void) write(2, "y1: DOMAIN error\n", 17);
307*25c28e83SPiotr Jasiukajtis 			}
308*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
309*25c28e83SPiotr Jasiukajtis 		}
310*25c28e83SPiotr Jasiukajtis 		break;
311*25c28e83SPiotr Jasiukajtis 	case 12:
312*25c28e83SPiotr Jasiukajtis 		/* yn(n,0) = -inf */
313*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;	/* should be SING for IEEE */
314*25c28e83SPiotr Jasiukajtis 		exc.name = "yn";
315*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(0, -1.0);
316*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
317*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE;
318*25c28e83SPiotr Jasiukajtis 		else
319*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE_VAL;
320*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
321*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
322*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
323*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
324*25c28e83SPiotr Jasiukajtis 				(void) write(2, "yn: DOMAIN error\n", 17);
325*25c28e83SPiotr Jasiukajtis 			}
326*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
327*25c28e83SPiotr Jasiukajtis 		}
328*25c28e83SPiotr Jasiukajtis 		break;
329*25c28e83SPiotr Jasiukajtis 	case 13:
330*25c28e83SPiotr Jasiukajtis 		/* yn(x<0) = NaN */
331*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
332*25c28e83SPiotr Jasiukajtis 		exc.name = "yn";
333*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(3, 1.0);
334*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
335*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE;
336*25c28e83SPiotr Jasiukajtis 		else
337*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE_VAL;
338*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
339*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
340*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
341*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
342*25c28e83SPiotr Jasiukajtis 				(void) write(2, "yn: DOMAIN error\n", 17);
343*25c28e83SPiotr Jasiukajtis 			}
344*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
345*25c28e83SPiotr Jasiukajtis 		}
346*25c28e83SPiotr Jasiukajtis 		break;
347*25c28e83SPiotr Jasiukajtis 	case 14:
348*25c28e83SPiotr Jasiukajtis 		/* lgamma(finite) overflow */
349*25c28e83SPiotr Jasiukajtis 		exc.type = OVERFLOW;
350*25c28e83SPiotr Jasiukajtis 		exc.name = "lgamma";
351*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(2, 1.0);
352*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
353*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE;
354*25c28e83SPiotr Jasiukajtis 		else
355*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE_VAL;
356*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi)
357*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
358*25c28e83SPiotr Jasiukajtis 		else if (!matherr(&exc))
359*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
360*25c28e83SPiotr Jasiukajtis 		break;
361*25c28e83SPiotr Jasiukajtis 	case 15:
362*25c28e83SPiotr Jasiukajtis 		/* lgamma(-integer) or lgamma(0) */
363*25c28e83SPiotr Jasiukajtis 		exc.type = SING;
364*25c28e83SPiotr Jasiukajtis 		exc.name = "lgamma";
365*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(0, 1.0);
366*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
367*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE;
368*25c28e83SPiotr Jasiukajtis 		else
369*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE_VAL;
370*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
371*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
372*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
373*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
374*25c28e83SPiotr Jasiukajtis 				(void) write(2, "lgamma: SING error\n", 19);
375*25c28e83SPiotr Jasiukajtis 			}
376*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
377*25c28e83SPiotr Jasiukajtis 		}
378*25c28e83SPiotr Jasiukajtis 		break;
379*25c28e83SPiotr Jasiukajtis 	case 16:
380*25c28e83SPiotr Jasiukajtis 		/* log(0) */
381*25c28e83SPiotr Jasiukajtis 		exc.type = SING;
382*25c28e83SPiotr Jasiukajtis 		exc.name = "log";
383*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(0, -1.0);
384*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
385*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE;
386*25c28e83SPiotr Jasiukajtis 		else
387*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE_VAL;
388*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
389*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
390*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
391*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
392*25c28e83SPiotr Jasiukajtis 				(void) write(2, "log: SING error\n", 16);
393*25c28e83SPiotr Jasiukajtis 				errno = EDOM;
394*25c28e83SPiotr Jasiukajtis 			} else {
395*25c28e83SPiotr Jasiukajtis 				errno = ERANGE;
396*25c28e83SPiotr Jasiukajtis 			}
397*25c28e83SPiotr Jasiukajtis 		}
398*25c28e83SPiotr Jasiukajtis 		break;
399*25c28e83SPiotr Jasiukajtis 	case 17:
400*25c28e83SPiotr Jasiukajtis 		/* log(x<0) */
401*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
402*25c28e83SPiotr Jasiukajtis 		exc.name = "log";
403*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(3, 1.0);
404*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
405*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE;
406*25c28e83SPiotr Jasiukajtis 		else
407*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE_VAL;
408*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
409*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
410*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
411*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
412*25c28e83SPiotr Jasiukajtis 				(void) write(2, "log: DOMAIN error\n", 18);
413*25c28e83SPiotr Jasiukajtis 			}
414*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
415*25c28e83SPiotr Jasiukajtis 		}
416*25c28e83SPiotr Jasiukajtis 		break;
417*25c28e83SPiotr Jasiukajtis 	case 18:
418*25c28e83SPiotr Jasiukajtis 		/* log10(0) */
419*25c28e83SPiotr Jasiukajtis 		exc.type = SING;
420*25c28e83SPiotr Jasiukajtis 		exc.name = "log10";
421*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(0, -1.0);
422*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
423*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE;
424*25c28e83SPiotr Jasiukajtis 		else
425*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE_VAL;
426*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
427*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
428*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
429*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
430*25c28e83SPiotr Jasiukajtis 				(void) write(2, "log10: SING error\n", 18);
431*25c28e83SPiotr Jasiukajtis 				errno = EDOM;
432*25c28e83SPiotr Jasiukajtis 			} else {
433*25c28e83SPiotr Jasiukajtis 				errno = ERANGE;
434*25c28e83SPiotr Jasiukajtis 			}
435*25c28e83SPiotr Jasiukajtis 		}
436*25c28e83SPiotr Jasiukajtis 		break;
437*25c28e83SPiotr Jasiukajtis 	case 19:
438*25c28e83SPiotr Jasiukajtis 		/* log10(x<0) */
439*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
440*25c28e83SPiotr Jasiukajtis 		exc.name = "log10";
441*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(3, 1.0);
442*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
443*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE;
444*25c28e83SPiotr Jasiukajtis 		else
445*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE_VAL;
446*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
447*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
448*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
449*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
450*25c28e83SPiotr Jasiukajtis 				(void) write(2, "log10: DOMAIN error\n", 20);
451*25c28e83SPiotr Jasiukajtis 			}
452*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
453*25c28e83SPiotr Jasiukajtis 		}
454*25c28e83SPiotr Jasiukajtis 		break;
455*25c28e83SPiotr Jasiukajtis 	case 20:
456*25c28e83SPiotr Jasiukajtis 		/* pow(0.0,0.0) */
457*25c28e83SPiotr Jasiukajtis 		/* error only if lib_version == c_issue_4 */
458*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
459*25c28e83SPiotr Jasiukajtis 		exc.name = "pow";
460*25c28e83SPiotr Jasiukajtis 		exc.retval = 0.0;
461*25c28e83SPiotr Jasiukajtis 		ieee_retval = 1.0;
462*25c28e83SPiotr Jasiukajtis 		if (lib_version != c_issue_4) {
463*25c28e83SPiotr Jasiukajtis 			exc.retval = 1.0;
464*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
465*25c28e83SPiotr Jasiukajtis 			(void) write(2, "pow(0,0): DOMAIN error\n", 23);
466*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
467*25c28e83SPiotr Jasiukajtis 		}
468*25c28e83SPiotr Jasiukajtis 		break;
469*25c28e83SPiotr Jasiukajtis 	case 21:
470*25c28e83SPiotr Jasiukajtis 		/* pow(x,y) overflow */
471*25c28e83SPiotr Jasiukajtis 		exc.type = OVERFLOW;
472*25c28e83SPiotr Jasiukajtis 		exc.name = "pow";
473*25c28e83SPiotr Jasiukajtis 		exc.retval = (lib_version == c_issue_4)? HUGE : HUGE_VAL;
474*25c28e83SPiotr Jasiukajtis 		if (signbit(x)) {
475*25c28e83SPiotr Jasiukajtis 			t = rint(y);
476*25c28e83SPiotr Jasiukajtis 			if (t == y) {
477*25c28e83SPiotr Jasiukajtis 				w = rint(0.5 * y);
478*25c28e83SPiotr Jasiukajtis 				if (t != w + w)	{	/* y is odd */
479*25c28e83SPiotr Jasiukajtis 					exc.retval = -exc.retval;
480*25c28e83SPiotr Jasiukajtis 				}
481*25c28e83SPiotr Jasiukajtis 			}
482*25c28e83SPiotr Jasiukajtis 		}
483*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(2, exc.retval);
484*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi)
485*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
486*25c28e83SPiotr Jasiukajtis 		else if (!matherr(&exc))
487*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
488*25c28e83SPiotr Jasiukajtis 		break;
489*25c28e83SPiotr Jasiukajtis 	case 22:
490*25c28e83SPiotr Jasiukajtis 		/* pow(x,y) underflow */
491*25c28e83SPiotr Jasiukajtis 		exc.type = UNDERFLOW;
492*25c28e83SPiotr Jasiukajtis 		exc.name = "pow";
493*25c28e83SPiotr Jasiukajtis 		exc.retval = 0.0;
494*25c28e83SPiotr Jasiukajtis 		if (signbit(x)) {
495*25c28e83SPiotr Jasiukajtis 			t = rint(y);
496*25c28e83SPiotr Jasiukajtis 			if (t == y) {
497*25c28e83SPiotr Jasiukajtis 				w = rint(0.5 * y);
498*25c28e83SPiotr Jasiukajtis 				if (t != w + w)	/* y is odd */
499*25c28e83SPiotr Jasiukajtis 					exc.retval = -exc.retval;
500*25c28e83SPiotr Jasiukajtis 			}
501*25c28e83SPiotr Jasiukajtis 		}
502*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(1, exc.retval);
503*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi)
504*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
505*25c28e83SPiotr Jasiukajtis 		else if (!matherr(&exc))
506*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
507*25c28e83SPiotr Jasiukajtis 		break;
508*25c28e83SPiotr Jasiukajtis 	case 23:
509*25c28e83SPiotr Jasiukajtis 		/* (+-0)**neg */
510*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
511*25c28e83SPiotr Jasiukajtis 		exc.name = "pow";
512*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(0, 1.0);
513*25c28e83SPiotr Jasiukajtis 		{
514*25c28e83SPiotr Jasiukajtis 			int ahy, k, j, yisint, ly, hx;
515*25c28e83SPiotr Jasiukajtis 			/* INDENT OFF */
516*25c28e83SPiotr Jasiukajtis 			/*
517*25c28e83SPiotr Jasiukajtis 			 * determine if y is an odd int when x = -0
518*25c28e83SPiotr Jasiukajtis 			 * yisint = 0       ... y is not an integer
519*25c28e83SPiotr Jasiukajtis 			 * yisint = 1       ... y is an odd int
520*25c28e83SPiotr Jasiukajtis 			 * yisint = 2       ... y is an even int
521*25c28e83SPiotr Jasiukajtis 			 */
522*25c28e83SPiotr Jasiukajtis 			/* INDENT ON */
523*25c28e83SPiotr Jasiukajtis 			hx  = __HI(x);
524*25c28e83SPiotr Jasiukajtis 			ahy = __HI(y)&0x7fffffff;
525*25c28e83SPiotr Jasiukajtis 			ly  = __LO(y);
526*25c28e83SPiotr Jasiukajtis 
527*25c28e83SPiotr Jasiukajtis 			yisint = 0;
528*25c28e83SPiotr Jasiukajtis 			if (ahy >= 0x43400000) {
529*25c28e83SPiotr Jasiukajtis 				yisint = 2;	/* even integer y */
530*25c28e83SPiotr Jasiukajtis 			} else if (ahy >= 0x3ff00000) {
531*25c28e83SPiotr Jasiukajtis 				k = (ahy >> 20) - 0x3ff;	/* exponent */
532*25c28e83SPiotr Jasiukajtis 				if (k > 20) {
533*25c28e83SPiotr Jasiukajtis 					j = ly >> (52 - k);
534*25c28e83SPiotr Jasiukajtis 					if ((j << (52 - k)) == ly)
535*25c28e83SPiotr Jasiukajtis 						yisint = 2 - (j & 1);
536*25c28e83SPiotr Jasiukajtis 				} else if (ly == 0) {
537*25c28e83SPiotr Jasiukajtis 					j = ahy >> (20 - k);
538*25c28e83SPiotr Jasiukajtis 					if ((j << (20 - k)) == ahy)
539*25c28e83SPiotr Jasiukajtis 						yisint = 2 - (j & 1);
540*25c28e83SPiotr Jasiukajtis 				}
541*25c28e83SPiotr Jasiukajtis 			}
542*25c28e83SPiotr Jasiukajtis 			if (hx < 0 && yisint == 1)
543*25c28e83SPiotr Jasiukajtis 				ieee_retval = -ieee_retval;
544*25c28e83SPiotr Jasiukajtis 		}
545*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
546*25c28e83SPiotr Jasiukajtis 			exc.retval = 0.0;
547*25c28e83SPiotr Jasiukajtis 		else
548*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE_VAL;
549*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
550*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
551*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
552*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
553*25c28e83SPiotr Jasiukajtis 				(void) write(2, "pow(0,neg): DOMAIN error\n",
554*25c28e83SPiotr Jasiukajtis 				    25);
555*25c28e83SPiotr Jasiukajtis 			}
556*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
557*25c28e83SPiotr Jasiukajtis 		}
558*25c28e83SPiotr Jasiukajtis 		break;
559*25c28e83SPiotr Jasiukajtis 	case 24:
560*25c28e83SPiotr Jasiukajtis 		/* neg**non-integral */
561*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
562*25c28e83SPiotr Jasiukajtis 		exc.name = "pow";
563*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(3, 1.0);
564*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
565*25c28e83SPiotr Jasiukajtis 			exc.retval = 0.0;
566*25c28e83SPiotr Jasiukajtis 		else
567*25c28e83SPiotr Jasiukajtis 			exc.retval = ieee_retval;	/* X/Open allow NaN */
568*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
569*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
570*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
571*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
572*25c28e83SPiotr Jasiukajtis 				(void) write(2,
573*25c28e83SPiotr Jasiukajtis 				    "neg**non-integral: DOMAIN error\n", 32);
574*25c28e83SPiotr Jasiukajtis 			}
575*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
576*25c28e83SPiotr Jasiukajtis 		}
577*25c28e83SPiotr Jasiukajtis 		break;
578*25c28e83SPiotr Jasiukajtis 	case 25:
579*25c28e83SPiotr Jasiukajtis 		/* sinh(finite) overflow */
580*25c28e83SPiotr Jasiukajtis 		exc.type = OVERFLOW;
581*25c28e83SPiotr Jasiukajtis 		exc.name = "sinh";
582*25c28e83SPiotr Jasiukajtis 		ieee_retval = copysign(Inf, x);
583*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
584*25c28e83SPiotr Jasiukajtis 			exc.retval = x > 0.0 ? HUGE : -HUGE;
585*25c28e83SPiotr Jasiukajtis 		else
586*25c28e83SPiotr Jasiukajtis 			exc.retval = x > 0.0 ? HUGE_VAL : -HUGE_VAL;
587*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi)
588*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
589*25c28e83SPiotr Jasiukajtis 		else if (!matherr(&exc))
590*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
591*25c28e83SPiotr Jasiukajtis 		break;
592*25c28e83SPiotr Jasiukajtis 	case 26:
593*25c28e83SPiotr Jasiukajtis 		/* sqrt(x<0) */
594*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
595*25c28e83SPiotr Jasiukajtis 		exc.name = "sqrt";
596*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(3, 1.0);
597*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
598*25c28e83SPiotr Jasiukajtis 			exc.retval = 0.0;
599*25c28e83SPiotr Jasiukajtis 		else
600*25c28e83SPiotr Jasiukajtis 			exc.retval = ieee_retval;	/* quiet NaN */
601*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
602*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
603*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
604*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
605*25c28e83SPiotr Jasiukajtis 				(void) write(2, "sqrt: DOMAIN error\n", 19);
606*25c28e83SPiotr Jasiukajtis 			}
607*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
608*25c28e83SPiotr Jasiukajtis 		}
609*25c28e83SPiotr Jasiukajtis 		break;
610*25c28e83SPiotr Jasiukajtis 	case 27:
611*25c28e83SPiotr Jasiukajtis 		/* fmod(x,0) */
612*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
613*25c28e83SPiotr Jasiukajtis 		exc.name = "fmod";
614*25c28e83SPiotr Jasiukajtis 		if (fp_class(x) == fp_quiet)
615*25c28e83SPiotr Jasiukajtis 			ieee_retval = NaN;
616*25c28e83SPiotr Jasiukajtis 		else
617*25c28e83SPiotr Jasiukajtis 			ieee_retval = setexception(3, 1.0);
618*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
619*25c28e83SPiotr Jasiukajtis 			exc.retval = x;
620*25c28e83SPiotr Jasiukajtis 		else
621*25c28e83SPiotr Jasiukajtis 			exc.retval = ieee_retval;
622*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
623*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
624*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
625*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
626*25c28e83SPiotr Jasiukajtis 				(void) write(2, "fmod:  DOMAIN error\n", 20);
627*25c28e83SPiotr Jasiukajtis 			}
628*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
629*25c28e83SPiotr Jasiukajtis 		}
630*25c28e83SPiotr Jasiukajtis 		break;
631*25c28e83SPiotr Jasiukajtis 	case 28:
632*25c28e83SPiotr Jasiukajtis 		/* remainder(x,0) */
633*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
634*25c28e83SPiotr Jasiukajtis 		exc.name = "remainder";
635*25c28e83SPiotr Jasiukajtis 		if (fp_class(x) == fp_quiet)
636*25c28e83SPiotr Jasiukajtis 			ieee_retval = NaN;
637*25c28e83SPiotr Jasiukajtis 		else
638*25c28e83SPiotr Jasiukajtis 			ieee_retval = setexception(3, 1.0);
639*25c28e83SPiotr Jasiukajtis 		exc.retval = NaN;
640*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
641*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
642*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
643*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
644*25c28e83SPiotr Jasiukajtis 				(void) write(2, "remainder: DOMAIN error\n",
645*25c28e83SPiotr Jasiukajtis 				    24);
646*25c28e83SPiotr Jasiukajtis 			}
647*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
648*25c28e83SPiotr Jasiukajtis 		}
649*25c28e83SPiotr Jasiukajtis 		break;
650*25c28e83SPiotr Jasiukajtis 	case 29:
651*25c28e83SPiotr Jasiukajtis 		/* acosh(x<1) */
652*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
653*25c28e83SPiotr Jasiukajtis 		exc.name = "acosh";
654*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(3, 1.0);
655*25c28e83SPiotr Jasiukajtis 		exc.retval = NaN;
656*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
657*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
658*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
659*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
660*25c28e83SPiotr Jasiukajtis 				(void) write(2, "acosh: DOMAIN error\n", 20);
661*25c28e83SPiotr Jasiukajtis 			}
662*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
663*25c28e83SPiotr Jasiukajtis 		}
664*25c28e83SPiotr Jasiukajtis 		break;
665*25c28e83SPiotr Jasiukajtis 	case 30:
666*25c28e83SPiotr Jasiukajtis 		/* atanh(|x|>1) */
667*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
668*25c28e83SPiotr Jasiukajtis 		exc.name = "atanh";
669*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(3, 1.0);
670*25c28e83SPiotr Jasiukajtis 		exc.retval = NaN;
671*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
672*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
673*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
674*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
675*25c28e83SPiotr Jasiukajtis 				(void) write(2, "atanh: DOMAIN error\n", 20);
676*25c28e83SPiotr Jasiukajtis 			}
677*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
678*25c28e83SPiotr Jasiukajtis 		}
679*25c28e83SPiotr Jasiukajtis 		break;
680*25c28e83SPiotr Jasiukajtis 	case 31:
681*25c28e83SPiotr Jasiukajtis 		/* atanh(|x|=1) */
682*25c28e83SPiotr Jasiukajtis 		exc.type = SING;
683*25c28e83SPiotr Jasiukajtis 		exc.name = "atanh";
684*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(0, x);
685*25c28e83SPiotr Jasiukajtis 		exc.retval = ieee_retval;
686*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
687*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
688*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
689*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
690*25c28e83SPiotr Jasiukajtis 				(void) write(2, "atanh: SING error\n", 18);
691*25c28e83SPiotr Jasiukajtis 				errno = EDOM;
692*25c28e83SPiotr Jasiukajtis 			} else {
693*25c28e83SPiotr Jasiukajtis 				errno = ERANGE;
694*25c28e83SPiotr Jasiukajtis 			}
695*25c28e83SPiotr Jasiukajtis 		}
696*25c28e83SPiotr Jasiukajtis 		break;
697*25c28e83SPiotr Jasiukajtis 	case 32:
698*25c28e83SPiotr Jasiukajtis 		/* scalb overflow; SVID also returns +-HUGE_VAL */
699*25c28e83SPiotr Jasiukajtis 		exc.type = OVERFLOW;
700*25c28e83SPiotr Jasiukajtis 		exc.name = "scalb";
701*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(2, x);
702*25c28e83SPiotr Jasiukajtis 		exc.retval = x > 0.0 ? HUGE_VAL : -HUGE_VAL;
703*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi)
704*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
705*25c28e83SPiotr Jasiukajtis 		else if (!matherr(&exc))
706*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
707*25c28e83SPiotr Jasiukajtis 		break;
708*25c28e83SPiotr Jasiukajtis 	case 33:
709*25c28e83SPiotr Jasiukajtis 		/* scalb underflow */
710*25c28e83SPiotr Jasiukajtis 		exc.type = UNDERFLOW;
711*25c28e83SPiotr Jasiukajtis 		exc.name = "scalb";
712*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(1, x);
713*25c28e83SPiotr Jasiukajtis 		exc.retval = ieee_retval;	/* +-0.0 */
714*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi)
715*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
716*25c28e83SPiotr Jasiukajtis 		else if (!matherr(&exc))
717*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
718*25c28e83SPiotr Jasiukajtis 		break;
719*25c28e83SPiotr Jasiukajtis 	case 34:
720*25c28e83SPiotr Jasiukajtis 		/* j0(|x|>X_TLOSS) */
721*25c28e83SPiotr Jasiukajtis 		exc.type = TLOSS;
722*25c28e83SPiotr Jasiukajtis 		exc.name = "j0";
723*25c28e83SPiotr Jasiukajtis 		exc.retval = 0.0;
724*25c28e83SPiotr Jasiukajtis 		ieee_retval = y;
725*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
726*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
727*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
728*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
729*25c28e83SPiotr Jasiukajtis 				(void) write(2, exc.name, 2);
730*25c28e83SPiotr Jasiukajtis 				(void) write(2, ": TLOSS error\n", 14);
731*25c28e83SPiotr Jasiukajtis 			}
732*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
733*25c28e83SPiotr Jasiukajtis 		}
734*25c28e83SPiotr Jasiukajtis 		break;
735*25c28e83SPiotr Jasiukajtis 	case 35:
736*25c28e83SPiotr Jasiukajtis 		/* y0(x>X_TLOSS) */
737*25c28e83SPiotr Jasiukajtis 		exc.type = TLOSS;
738*25c28e83SPiotr Jasiukajtis 		exc.name = "y0";
739*25c28e83SPiotr Jasiukajtis 		exc.retval = 0.0;
740*25c28e83SPiotr Jasiukajtis 		ieee_retval = y;
741*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
742*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
743*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
744*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
745*25c28e83SPiotr Jasiukajtis 				(void) write(2, exc.name, 2);
746*25c28e83SPiotr Jasiukajtis 				(void) write(2, ": TLOSS error\n", 14);
747*25c28e83SPiotr Jasiukajtis 			}
748*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
749*25c28e83SPiotr Jasiukajtis 		}
750*25c28e83SPiotr Jasiukajtis 		break;
751*25c28e83SPiotr Jasiukajtis 	case 36:
752*25c28e83SPiotr Jasiukajtis 		/* j1(|x|>X_TLOSS) */
753*25c28e83SPiotr Jasiukajtis 		exc.type = TLOSS;
754*25c28e83SPiotr Jasiukajtis 		exc.name = "j1";
755*25c28e83SPiotr Jasiukajtis 		exc.retval = 0.0;
756*25c28e83SPiotr Jasiukajtis 		ieee_retval = y;
757*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
758*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
759*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
760*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
761*25c28e83SPiotr Jasiukajtis 				(void) write(2, exc.name, 2);
762*25c28e83SPiotr Jasiukajtis 				(void) write(2, ": TLOSS error\n", 14);
763*25c28e83SPiotr Jasiukajtis 			}
764*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
765*25c28e83SPiotr Jasiukajtis 		}
766*25c28e83SPiotr Jasiukajtis 		break;
767*25c28e83SPiotr Jasiukajtis 	case 37:
768*25c28e83SPiotr Jasiukajtis 		/* y1(x>X_TLOSS) */
769*25c28e83SPiotr Jasiukajtis 		exc.type = TLOSS;
770*25c28e83SPiotr Jasiukajtis 		exc.name = "y1";
771*25c28e83SPiotr Jasiukajtis 		exc.retval = 0.0;
772*25c28e83SPiotr Jasiukajtis 		ieee_retval = y;
773*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
774*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
775*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
776*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
777*25c28e83SPiotr Jasiukajtis 				(void) write(2, exc.name, 2);
778*25c28e83SPiotr Jasiukajtis 				(void) write(2, ": TLOSS error\n", 14);
779*25c28e83SPiotr Jasiukajtis 			}
780*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
781*25c28e83SPiotr Jasiukajtis 		}
782*25c28e83SPiotr Jasiukajtis 		break;
783*25c28e83SPiotr Jasiukajtis 	case 38:
784*25c28e83SPiotr Jasiukajtis 		/* jn(|x|>X_TLOSS) */
785*25c28e83SPiotr Jasiukajtis 		/* incorrect ieee value: ieee should never be here */
786*25c28e83SPiotr Jasiukajtis 		exc.type = TLOSS;
787*25c28e83SPiotr Jasiukajtis 		exc.name = "jn";
788*25c28e83SPiotr Jasiukajtis 		exc.retval = 0.0;
789*25c28e83SPiotr Jasiukajtis 		ieee_retval = 0.0;	/* shall not be used */
790*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
791*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
792*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
793*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
794*25c28e83SPiotr Jasiukajtis 				(void) write(2, exc.name, 2);
795*25c28e83SPiotr Jasiukajtis 				(void) write(2, ": TLOSS error\n", 14);
796*25c28e83SPiotr Jasiukajtis 			}
797*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
798*25c28e83SPiotr Jasiukajtis 		}
799*25c28e83SPiotr Jasiukajtis 		break;
800*25c28e83SPiotr Jasiukajtis 	case 39:
801*25c28e83SPiotr Jasiukajtis 		/* yn(x>X_TLOSS) */
802*25c28e83SPiotr Jasiukajtis 		/* incorrect ieee value: ieee should never be here */
803*25c28e83SPiotr Jasiukajtis 		exc.type = TLOSS;
804*25c28e83SPiotr Jasiukajtis 		exc.name = "yn";
805*25c28e83SPiotr Jasiukajtis 		exc.retval = 0.0;
806*25c28e83SPiotr Jasiukajtis 		ieee_retval = 0.0;	/* shall not be used */
807*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
808*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
809*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
810*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
811*25c28e83SPiotr Jasiukajtis 				(void) write(2, exc.name, 2);
812*25c28e83SPiotr Jasiukajtis 				(void) write(2, ": TLOSS error\n", 14);
813*25c28e83SPiotr Jasiukajtis 			}
814*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
815*25c28e83SPiotr Jasiukajtis 		}
816*25c28e83SPiotr Jasiukajtis 		break;
817*25c28e83SPiotr Jasiukajtis 	case 40:
818*25c28e83SPiotr Jasiukajtis 		/* gamma(finite) overflow */
819*25c28e83SPiotr Jasiukajtis 		exc.type = OVERFLOW;
820*25c28e83SPiotr Jasiukajtis 		exc.name = "gamma";
821*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(2, 1.0);
822*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
823*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE;
824*25c28e83SPiotr Jasiukajtis 		else
825*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE_VAL;
826*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi)
827*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
828*25c28e83SPiotr Jasiukajtis 		else if (!matherr(&exc))
829*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
830*25c28e83SPiotr Jasiukajtis 		break;
831*25c28e83SPiotr Jasiukajtis 	case 41:
832*25c28e83SPiotr Jasiukajtis 		/* gamma(-integer) or gamma(0) */
833*25c28e83SPiotr Jasiukajtis 		exc.type = SING;
834*25c28e83SPiotr Jasiukajtis 		exc.name = "gamma";
835*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(0, 1.0);
836*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
837*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE;
838*25c28e83SPiotr Jasiukajtis 		else
839*25c28e83SPiotr Jasiukajtis 			exc.retval = HUGE_VAL;
840*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
841*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
842*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
843*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
844*25c28e83SPiotr Jasiukajtis 				(void) write(2, "gamma: SING error\n", 18);
845*25c28e83SPiotr Jasiukajtis 			}
846*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
847*25c28e83SPiotr Jasiukajtis 		}
848*25c28e83SPiotr Jasiukajtis 		break;
849*25c28e83SPiotr Jasiukajtis 	case 42:
850*25c28e83SPiotr Jasiukajtis 		/* pow(NaN,0.0) */
851*25c28e83SPiotr Jasiukajtis 		/* error if lib_version == c_issue_4 or ansi_1 */
852*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
853*25c28e83SPiotr Jasiukajtis 		exc.name = "pow";
854*25c28e83SPiotr Jasiukajtis 		exc.retval = x;
855*25c28e83SPiotr Jasiukajtis 		ieee_retval = 1.0;
856*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
857*25c28e83SPiotr Jasiukajtis 			exc.retval = 1.0;
858*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
859*25c28e83SPiotr Jasiukajtis 			if ((lib_version == c_issue_4) || (lib_version == ansi_1))
860*25c28e83SPiotr Jasiukajtis 				errno = EDOM;
861*25c28e83SPiotr Jasiukajtis 		}
862*25c28e83SPiotr Jasiukajtis 		break;
863*25c28e83SPiotr Jasiukajtis 	case 43:
864*25c28e83SPiotr Jasiukajtis 		/* log1p(-1) */
865*25c28e83SPiotr Jasiukajtis 		exc.type = SING;
866*25c28e83SPiotr Jasiukajtis 		exc.name = "log1p";
867*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(0, -1.0);
868*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
869*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE;
870*25c28e83SPiotr Jasiukajtis 		else
871*25c28e83SPiotr Jasiukajtis 			exc.retval = -HUGE_VAL;
872*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
873*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
874*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
875*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
876*25c28e83SPiotr Jasiukajtis 				(void) write(2, "log1p: SING error\n", 18);
877*25c28e83SPiotr Jasiukajtis 				errno = EDOM;
878*25c28e83SPiotr Jasiukajtis 			} else {
879*25c28e83SPiotr Jasiukajtis 				errno = ERANGE;
880*25c28e83SPiotr Jasiukajtis 			}
881*25c28e83SPiotr Jasiukajtis 		}
882*25c28e83SPiotr Jasiukajtis 		break;
883*25c28e83SPiotr Jasiukajtis 	case 44:
884*25c28e83SPiotr Jasiukajtis 		/* log1p(x<-1) */
885*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
886*25c28e83SPiotr Jasiukajtis 		exc.name = "log1p";
887*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(3, 1.0);
888*25c28e83SPiotr Jasiukajtis 		exc.retval = ieee_retval;
889*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi) {
890*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
891*25c28e83SPiotr Jasiukajtis 		} else if (!matherr(&exc)) {
892*25c28e83SPiotr Jasiukajtis 			if (lib_version == c_issue_4) {
893*25c28e83SPiotr Jasiukajtis 				(void) write(2, "log1p: DOMAIN error\n", 20);
894*25c28e83SPiotr Jasiukajtis 			}
895*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
896*25c28e83SPiotr Jasiukajtis 		}
897*25c28e83SPiotr Jasiukajtis 		break;
898*25c28e83SPiotr Jasiukajtis 	case 45:
899*25c28e83SPiotr Jasiukajtis 		/* logb(0) */
900*25c28e83SPiotr Jasiukajtis 		exc.type = DOMAIN;
901*25c28e83SPiotr Jasiukajtis 		exc.name = "logb";
902*25c28e83SPiotr Jasiukajtis 		ieee_retval = setexception(0, -1.0);
903*25c28e83SPiotr Jasiukajtis 		exc.retval = -HUGE_VAL;
904*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi)
905*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
906*25c28e83SPiotr Jasiukajtis 		else if (!matherr(&exc))
907*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
908*25c28e83SPiotr Jasiukajtis 		break;
909*25c28e83SPiotr Jasiukajtis 	case 46:
910*25c28e83SPiotr Jasiukajtis 		/* nextafter overflow */
911*25c28e83SPiotr Jasiukajtis 		exc.type = OVERFLOW;
912*25c28e83SPiotr Jasiukajtis 		exc.name = "nextafter";
913*25c28e83SPiotr Jasiukajtis 		/*
914*25c28e83SPiotr Jasiukajtis 		 * The value as returned by setexception is +/-DBL_MAX in
915*25c28e83SPiotr Jasiukajtis 		 * round-to-{zero,-/+Inf} mode respectively, which is not
916*25c28e83SPiotr Jasiukajtis 		 * usable.
917*25c28e83SPiotr Jasiukajtis 		 */
918*25c28e83SPiotr Jasiukajtis 		(void) setexception(2, x);
919*25c28e83SPiotr Jasiukajtis 		ieee_retval = x > 0 ? Inf : -Inf;
920*25c28e83SPiotr Jasiukajtis 		exc.retval = x > 0 ? HUGE_VAL : -HUGE_VAL;
921*25c28e83SPiotr Jasiukajtis 		if (lib_version == strict_ansi)
922*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
923*25c28e83SPiotr Jasiukajtis 		else if (!matherr(&exc))
924*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
925*25c28e83SPiotr Jasiukajtis 		break;
926*25c28e83SPiotr Jasiukajtis 	case 47:
927*25c28e83SPiotr Jasiukajtis 		/* scalb(x,inf) */
928*25c28e83SPiotr Jasiukajtis 		iy = ((int *)&y)[HIWORD];
929*25c28e83SPiotr Jasiukajtis 		if (lib_version == c_issue_4)
930*25c28e83SPiotr Jasiukajtis 			/* SVID3: ERANGE in all cases */
931*25c28e83SPiotr Jasiukajtis 			errno = ERANGE;
932*25c28e83SPiotr Jasiukajtis 		else if ((x == 0.0 && iy > 0) || (!finite(x) && iy < 0))
933*25c28e83SPiotr Jasiukajtis 			/* EDOM for scalb(0,+inf) or scalb(inf,-inf) */
934*25c28e83SPiotr Jasiukajtis 			errno = EDOM;
935*25c28e83SPiotr Jasiukajtis 		exc.retval = ieee_retval = ((iy < 0)? x / -y : x * y);
936*25c28e83SPiotr Jasiukajtis 		break;
937*25c28e83SPiotr Jasiukajtis 	}
938*25c28e83SPiotr Jasiukajtis 	switch (lib_version) {
939*25c28e83SPiotr Jasiukajtis 	case c_issue_4:
940*25c28e83SPiotr Jasiukajtis 	case ansi_1:
941*25c28e83SPiotr Jasiukajtis 	case strict_ansi:
942*25c28e83SPiotr Jasiukajtis 		return (exc.retval);
943*25c28e83SPiotr Jasiukajtis 		/* NOTREACHED */
944*25c28e83SPiotr Jasiukajtis 	default:
945*25c28e83SPiotr Jasiukajtis 		return (ieee_retval);
946*25c28e83SPiotr Jasiukajtis 	}
947*25c28e83SPiotr Jasiukajtis 	/* NOTREACHED */
948*25c28e83SPiotr Jasiukajtis }
949*25c28e83SPiotr Jasiukajtis 
950*25c28e83SPiotr Jasiukajtis static double
setexception(int n,double x)951*25c28e83SPiotr Jasiukajtis setexception(int n, double x) {
952*25c28e83SPiotr Jasiukajtis 	/*
953*25c28e83SPiotr Jasiukajtis 	 * n =
954*25c28e83SPiotr Jasiukajtis 	 * 0	division by zero
955*25c28e83SPiotr Jasiukajtis 	 * 1	underflow
956*25c28e83SPiotr Jasiukajtis 	 * 2	overflow
957*25c28e83SPiotr Jasiukajtis 	 * 3	invalid
958*25c28e83SPiotr Jasiukajtis 	 */
959*25c28e83SPiotr Jasiukajtis 	volatile double one = 1.0, zero = 0.0, retv;
960*25c28e83SPiotr Jasiukajtis 
961*25c28e83SPiotr Jasiukajtis 	switch (n) {
962*25c28e83SPiotr Jasiukajtis 	case 0:		/* division by zero */
963*25c28e83SPiotr Jasiukajtis 		retv = copysign(one / zero, x);
964*25c28e83SPiotr Jasiukajtis 		break;
965*25c28e83SPiotr Jasiukajtis 	case 1:		/* underflow */
966*25c28e83SPiotr Jasiukajtis 		retv = DBL_MIN * copysign(DBL_MIN, x);
967*25c28e83SPiotr Jasiukajtis 		break;
968*25c28e83SPiotr Jasiukajtis 	case 2:		/* overflow */
969*25c28e83SPiotr Jasiukajtis 		retv = DBL_MAX * copysign(DBL_MAX, x);
970*25c28e83SPiotr Jasiukajtis 		break;
971*25c28e83SPiotr Jasiukajtis 	case 3:		/* invalid */
972*25c28e83SPiotr Jasiukajtis 		retv = zero * Inf;	/* for Cheetah */
973*25c28e83SPiotr Jasiukajtis 		break;
974*25c28e83SPiotr Jasiukajtis 	}
975*25c28e83SPiotr Jasiukajtis 	return (retv);
976*25c28e83SPiotr Jasiukajtis }
977