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