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