1 /* @(#)k_standard.c 5.1 93/09/24 */
2 /*
3 * ====================================================
4 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
5 *
6 * Developed at SunPro, a Sun Microsystems, Inc. business.
7 * Permission to use, copy, modify, and distribute this
8 * software is freely granted, provided that this notice
9 * is preserved.
10 * ====================================================
11 */
12
13 #if defined(LIBM_SCCS) && !defined(lint)
14 static char rcsid[] = "$NetBSD: k_standard.c,v 1.6 1995/05/10 20:46:35 jtc Exp $";
15 #endif
16
17 #include <math.h>
18 #include <math_private.h>
19 #include <math-svid-compat.h>
20 #include <errno.h>
21
22 #include <assert.h>
23
24 #if LIBM_SVID_COMPAT
25
26 # ifndef _USE_WRITE
27 # include <stdio.h> /* fputs(), stderr */
28 # define WRITE2(u,v) fputs(u, stderr)
29 # else /* !defined(_USE_WRITE) */
30 # include <unistd.h> /* write */
31 # define WRITE2(u,v) write(2, u, v)
32 # undef fflush
33 # endif /* !defined(_USE_WRITE) */
34
35 /* XXX gcc versions until now don't delay the 0.0/0.0 division until
36 runtime but produce NaN at compile time. This is wrong since the
37 exceptions are not set correctly. */
38 # if 0
39 static const double zero = 0.0; /* used as const */
40 # else
41 static double zero = 0.0; /* used as const */
42 # endif
43
44 /*
45 * Standard conformance (non-IEEE) on exception cases.
46 * Mapping:
47 * 1 -- acos(|x|>1)
48 * 2 -- asin(|x|>1)
49 * 3 -- atan2(+-0,+-0)
50 * 4 -- hypot overflow
51 * 5 -- cosh overflow
52 * 6 -- exp overflow
53 * 7 -- exp underflow
54 * 8 -- y0(0)
55 * 9 -- y0(-ve)
56 * 10-- y1(0)
57 * 11-- y1(-ve)
58 * 12-- yn(0)
59 * 13-- yn(-ve)
60 * 14-- lgamma(finite) overflow
61 * 15-- lgamma(-integer)
62 * 16-- log(0)
63 * 17-- log(x<0)
64 * 18-- log10(0)
65 * 19-- log10(x<0)
66 * 21-- pow(x,y) overflow
67 * 22-- pow(x,y) underflow
68 * 23-- pow(0,negative)
69 * 24-- pow(neg,non-integral)
70 * 25-- sinh(finite) overflow
71 * 26-- sqrt(negative)
72 * 27-- fmod(x,0)
73 * 28-- remainder(x,0)
74 * 29-- acosh(x<1)
75 * 30-- atanh(|x|>1)
76 * 31-- atanh(|x|=1)
77 * 32-- scalb overflow
78 * 33-- scalb underflow
79 * 34-- j0(|x|>X_TLOSS)
80 * 35-- y0(x>X_TLOSS)
81 * 36-- j1(|x|>X_TLOSS)
82 * 37-- y1(x>X_TLOSS)
83 * 38-- jn(|x|>X_TLOSS, n)
84 * 39-- yn(x>X_TLOSS, n)
85 * 40-- tgamma(finite) overflow
86 * 41-- tgamma(-integer)
87 * 43-- +0**neg
88 * 44-- exp2 overflow
89 * 45-- exp2 underflow
90 * 46-- exp10 overflow
91 * 47-- exp10 underflow
92 * 48-- log2(0)
93 * 49-- log2(x<0)
94 * 50-- tgamma(+-0)
95 */
96
97
98 double
__kernel_standard(double x,double y,int type)99 __kernel_standard(double x, double y, int type)
100 {
101 struct exception exc;
102 # ifndef HUGE_VAL /* this is the only routine that uses HUGE_VAL */
103 # define HUGE_VAL inf
104 double inf = 0.0;
105
106 SET_HIGH_WORD(inf,0x7ff00000); /* set inf to infinite */
107 # endif
108
109 /* The SVID struct exception uses a field "char *name;". */
110 # define CSTR(func) ((char *) (type < 100 \
111 ? func \
112 : (type < 200 ? func "f" : func "l")))
113
114 # ifdef _USE_WRITE
115 (void) fflush(stdout);
116 # endif
117 exc.arg1 = x;
118 exc.arg2 = y;
119 switch(type) {
120 case 1:
121 case 101:
122 case 201:
123 /* acos(|x|>1) */
124 exc.type = DOMAIN;
125 exc.name = CSTR ("acos");
126 if (_LIB_VERSION == _SVID_)
127 exc.retval = HUGE;
128 else
129 exc.retval = NAN;
130 if (_LIB_VERSION == _POSIX_)
131 __set_errno (EDOM);
132 else if (!matherr(&exc)) {
133 if(_LIB_VERSION == _SVID_) {
134 (void) WRITE2("acos: DOMAIN error\n", 19);
135 }
136 __set_errno (EDOM);
137 }
138 break;
139 case 2:
140 case 102:
141 case 202:
142 /* asin(|x|>1) */
143 exc.type = DOMAIN;
144 exc.name = CSTR ("asin");
145 if (_LIB_VERSION == _SVID_)
146 exc.retval = HUGE;
147 else
148 exc.retval = NAN;
149 if(_LIB_VERSION == _POSIX_)
150 __set_errno (EDOM);
151 else if (!matherr(&exc)) {
152 if(_LIB_VERSION == _SVID_) {
153 (void) WRITE2("asin: DOMAIN error\n", 19);
154 }
155 __set_errno (EDOM);
156 }
157 break;
158 case 3:
159 case 103:
160 case 203:
161 /* atan2(+-0,+-0) */
162 exc.arg1 = y;
163 exc.arg2 = x;
164 exc.type = DOMAIN;
165 exc.name = CSTR ("atan2");
166 assert (_LIB_VERSION == _SVID_);
167 exc.retval = HUGE;
168 if(_LIB_VERSION == _POSIX_)
169 __set_errno (EDOM);
170 else if (!matherr(&exc)) {
171 if(_LIB_VERSION == _SVID_) {
172 (void) WRITE2("atan2: DOMAIN error\n", 20);
173 }
174 __set_errno (EDOM);
175 }
176 break;
177 case 4:
178 case 104:
179 case 204:
180 /* hypot(finite,finite) overflow */
181 exc.type = OVERFLOW;
182 exc.name = CSTR ("hypot");
183 if (_LIB_VERSION == _SVID_)
184 exc.retval = HUGE;
185 else
186 exc.retval = HUGE_VAL;
187 if (_LIB_VERSION == _POSIX_)
188 __set_errno (ERANGE);
189 else if (!matherr(&exc)) {
190 __set_errno (ERANGE);
191 }
192 break;
193 case 5:
194 case 105:
195 case 205:
196 /* cosh(finite) overflow */
197 exc.type = OVERFLOW;
198 exc.name = CSTR ("cosh");
199 if (_LIB_VERSION == _SVID_)
200 exc.retval = HUGE;
201 else
202 exc.retval = HUGE_VAL;
203 if (_LIB_VERSION == _POSIX_)
204 __set_errno (ERANGE);
205 else if (!matherr(&exc)) {
206 __set_errno (ERANGE);
207 }
208 break;
209 case 6:
210 case 106:
211 case 206:
212 /* exp(finite) overflow */
213 exc.type = OVERFLOW;
214 exc.name = CSTR ("exp");
215 if (_LIB_VERSION == _SVID_)
216 exc.retval = HUGE;
217 else
218 exc.retval = HUGE_VAL;
219 if (_LIB_VERSION == _POSIX_)
220 __set_errno (ERANGE);
221 else if (!matherr(&exc)) {
222 __set_errno (ERANGE);
223 }
224 break;
225 case 7:
226 case 107:
227 case 207:
228 /* exp(finite) underflow */
229 exc.type = UNDERFLOW;
230 exc.name = CSTR ("exp");
231 exc.retval = zero;
232 if (_LIB_VERSION == _POSIX_)
233 __set_errno (ERANGE);
234 else if (!matherr(&exc)) {
235 __set_errno (ERANGE);
236 }
237 break;
238 case 8:
239 case 108:
240 case 208:
241 /* y0(0) = -inf */
242 exc.type = DOMAIN; /* should be SING for IEEE */
243 exc.name = CSTR ("y0");
244 if (_LIB_VERSION == _SVID_)
245 exc.retval = -HUGE;
246 else
247 exc.retval = -HUGE_VAL;
248 if (_LIB_VERSION == _POSIX_)
249 __set_errno (ERANGE);
250 else if (!matherr(&exc)) {
251 if (_LIB_VERSION == _SVID_) {
252 (void) WRITE2("y0: DOMAIN error\n", 17);
253 }
254 __set_errno (EDOM);
255 }
256 break;
257 case 9:
258 case 109:
259 case 209:
260 /* y0(x<0) = NaN */
261 exc.type = DOMAIN;
262 exc.name = CSTR ("y0");
263 if (_LIB_VERSION == _SVID_)
264 exc.retval = -HUGE;
265 else
266 exc.retval = NAN;
267 if (_LIB_VERSION == _POSIX_)
268 __set_errno (EDOM);
269 else if (!matherr(&exc)) {
270 if (_LIB_VERSION == _SVID_) {
271 (void) WRITE2("y0: DOMAIN error\n", 17);
272 }
273 __set_errno (EDOM);
274 }
275 break;
276 case 10:
277 case 110:
278 case 210:
279 /* y1(0) = -inf */
280 exc.type = DOMAIN; /* should be SING for IEEE */
281 exc.name = CSTR ("y1");
282 if (_LIB_VERSION == _SVID_)
283 exc.retval = -HUGE;
284 else
285 exc.retval = -HUGE_VAL;
286 if (_LIB_VERSION == _POSIX_)
287 __set_errno (ERANGE);
288 else if (!matherr(&exc)) {
289 if (_LIB_VERSION == _SVID_) {
290 (void) WRITE2("y1: DOMAIN error\n", 17);
291 }
292 __set_errno (EDOM);
293 }
294 break;
295 case 11:
296 case 111:
297 case 211:
298 /* y1(x<0) = NaN */
299 exc.type = DOMAIN;
300 exc.name = CSTR ("y1");
301 if (_LIB_VERSION == _SVID_)
302 exc.retval = -HUGE;
303 else
304 exc.retval = NAN;
305 if (_LIB_VERSION == _POSIX_)
306 __set_errno (EDOM);
307 else if (!matherr(&exc)) {
308 if (_LIB_VERSION == _SVID_) {
309 (void) WRITE2("y1: DOMAIN error\n", 17);
310 }
311 __set_errno (EDOM);
312 }
313 break;
314 case 12:
315 case 112:
316 case 212:
317 /* yn(n,0) = -inf */
318 exc.type = DOMAIN; /* should be SING for IEEE */
319 exc.name = CSTR ("yn");
320 if (_LIB_VERSION == _SVID_)
321 exc.retval = -HUGE;
322 else
323 exc.retval = ((x < 0 && ((int) x & 1) != 0)
324 ? HUGE_VAL
325 : -HUGE_VAL);
326 if (_LIB_VERSION == _POSIX_)
327 __set_errno (ERANGE);
328 else if (!matherr(&exc)) {
329 if (_LIB_VERSION == _SVID_) {
330 (void) WRITE2("yn: DOMAIN error\n", 17);
331 }
332 __set_errno (EDOM);
333 }
334 break;
335 case 13:
336 case 113:
337 case 213:
338 /* yn(x<0) = NaN */
339 exc.type = DOMAIN;
340 exc.name = CSTR ("yn");
341 if (_LIB_VERSION == _SVID_)
342 exc.retval = -HUGE;
343 else
344 exc.retval = NAN;
345 if (_LIB_VERSION == _POSIX_)
346 __set_errno (EDOM);
347 else if (!matherr(&exc)) {
348 if (_LIB_VERSION == _SVID_) {
349 (void) WRITE2("yn: DOMAIN error\n", 17);
350 }
351 __set_errno (EDOM);
352 }
353 break;
354 case 14:
355 case 114:
356 case 214:
357 /* lgamma(finite) overflow */
358 exc.type = OVERFLOW;
359 exc.name = CSTR ("lgamma");
360 if (_LIB_VERSION == _SVID_)
361 exc.retval = HUGE;
362 else
363 exc.retval = HUGE_VAL;
364 if (_LIB_VERSION == _POSIX_)
365 __set_errno (ERANGE);
366 else if (!matherr(&exc)) {
367 __set_errno (ERANGE);
368 }
369 break;
370 case 15:
371 case 115:
372 case 215:
373 /* lgamma(-integer) or lgamma(0) */
374 exc.type = SING;
375 exc.name = CSTR ("lgamma");
376 if (_LIB_VERSION == _SVID_)
377 exc.retval = HUGE;
378 else
379 exc.retval = HUGE_VAL;
380 if (_LIB_VERSION == _POSIX_)
381 __set_errno (ERANGE);
382 else if (!matherr(&exc)) {
383 if (_LIB_VERSION == _SVID_) {
384 (void) WRITE2("lgamma: SING error\n", 19);
385 }
386 __set_errno (EDOM);
387 }
388 break;
389 case 16:
390 case 116:
391 case 216:
392 /* log(0) */
393 exc.type = SING;
394 exc.name = CSTR ("log");
395 if (_LIB_VERSION == _SVID_)
396 exc.retval = -HUGE;
397 else
398 exc.retval = -HUGE_VAL;
399 if (_LIB_VERSION == _POSIX_)
400 __set_errno (ERANGE);
401 else if (!matherr(&exc)) {
402 if (_LIB_VERSION == _SVID_) {
403 (void) WRITE2("log: SING error\n", 16);
404 }
405 __set_errno (EDOM);
406 }
407 break;
408 case 17:
409 case 117:
410 case 217:
411 /* log(x<0) */
412 exc.type = DOMAIN;
413 exc.name = CSTR ("log");
414 if (_LIB_VERSION == _SVID_)
415 exc.retval = -HUGE;
416 else
417 exc.retval = NAN;
418 if (_LIB_VERSION == _POSIX_)
419 __set_errno (EDOM);
420 else if (!matherr(&exc)) {
421 if (_LIB_VERSION == _SVID_) {
422 (void) WRITE2("log: DOMAIN error\n", 18);
423 }
424 __set_errno (EDOM);
425 }
426 break;
427 case 18:
428 case 118:
429 case 218:
430 /* log10(0) */
431 exc.type = SING;
432 exc.name = CSTR ("log10");
433 if (_LIB_VERSION == _SVID_)
434 exc.retval = -HUGE;
435 else
436 exc.retval = -HUGE_VAL;
437 if (_LIB_VERSION == _POSIX_)
438 __set_errno (ERANGE);
439 else if (!matherr(&exc)) {
440 if (_LIB_VERSION == _SVID_) {
441 (void) WRITE2("log10: SING error\n", 18);
442 }
443 __set_errno (EDOM);
444 }
445 break;
446 case 19:
447 case 119:
448 case 219:
449 /* log10(x<0) */
450 exc.type = DOMAIN;
451 exc.name = CSTR ("log10");
452 if (_LIB_VERSION == _SVID_)
453 exc.retval = -HUGE;
454 else
455 exc.retval = NAN;
456 if (_LIB_VERSION == _POSIX_)
457 __set_errno (EDOM);
458 else if (!matherr(&exc)) {
459 if (_LIB_VERSION == _SVID_) {
460 (void) WRITE2("log10: DOMAIN error\n", 20);
461 }
462 __set_errno (EDOM);
463 }
464 break;
465 case 21:
466 case 121:
467 case 221:
468 /* pow(x,y) overflow */
469 exc.type = OVERFLOW;
470 exc.name = CSTR ("pow");
471 if (_LIB_VERSION == _SVID_) {
472 exc.retval = HUGE;
473 y *= 0.5;
474 if(x<zero&&rint(y)!=y) exc.retval = -HUGE;
475 } else {
476 exc.retval = HUGE_VAL;
477 y *= 0.5;
478 if(x<zero&&rint(y)!=y) exc.retval = -HUGE_VAL;
479 }
480 if (_LIB_VERSION == _POSIX_)
481 __set_errno (ERANGE);
482 else if (!matherr(&exc)) {
483 __set_errno (ERANGE);
484 }
485 break;
486 case 22:
487 case 122:
488 case 222:
489 /* pow(x,y) underflow */
490 exc.type = UNDERFLOW;
491 exc.name = CSTR ("pow");
492 exc.retval = zero;
493 y *= 0.5;
494 if (x < zero && rint (y) != y)
495 exc.retval = -zero;
496 if (_LIB_VERSION == _POSIX_)
497 __set_errno (ERANGE);
498 else if (!matherr(&exc)) {
499 __set_errno (ERANGE);
500 }
501 break;
502 case 23:
503 case 123:
504 case 223:
505 /* -0**neg */
506 exc.type = DOMAIN;
507 exc.name = CSTR ("pow");
508 if (_LIB_VERSION == _SVID_)
509 exc.retval = zero;
510 else
511 exc.retval = -HUGE_VAL;
512 if (_LIB_VERSION == _POSIX_)
513 __set_errno (ERANGE);
514 else if (!matherr(&exc)) {
515 if (_LIB_VERSION == _SVID_) {
516 (void) WRITE2("pow(0,neg): DOMAIN error\n", 25);
517 }
518 __set_errno (EDOM);
519 }
520 break;
521 case 43:
522 case 143:
523 case 243:
524 /* +0**neg */
525 exc.type = DOMAIN;
526 exc.name = CSTR ("pow");
527 if (_LIB_VERSION == _SVID_)
528 exc.retval = zero;
529 else
530 exc.retval = HUGE_VAL;
531 if (_LIB_VERSION == _POSIX_)
532 __set_errno (ERANGE);
533 else if (!matherr(&exc)) {
534 if (_LIB_VERSION == _SVID_) {
535 (void) WRITE2("pow(0,neg): DOMAIN error\n", 25);
536 }
537 __set_errno (EDOM);
538 }
539 break;
540 case 24:
541 case 124:
542 case 224:
543 /* neg**non-integral */
544 exc.type = DOMAIN;
545 exc.name = CSTR ("pow");
546 if (_LIB_VERSION == _SVID_)
547 exc.retval = zero;
548 else
549 exc.retval = zero/zero; /* X/Open allow NaN */
550 if (_LIB_VERSION == _POSIX_)
551 __set_errno (EDOM);
552 else if (!matherr(&exc)) {
553 if (_LIB_VERSION == _SVID_) {
554 (void) WRITE2("neg**non-integral: DOMAIN error\n", 32);
555 }
556 __set_errno (EDOM);
557 }
558 break;
559 case 25:
560 case 125:
561 case 225:
562 /* sinh(finite) overflow */
563 exc.type = OVERFLOW;
564 exc.name = CSTR ("sinh");
565 if (_LIB_VERSION == _SVID_)
566 exc.retval = ( (x>zero) ? HUGE : -HUGE);
567 else
568 exc.retval = ( (x>zero) ? HUGE_VAL : -HUGE_VAL);
569 if (_LIB_VERSION == _POSIX_)
570 __set_errno (ERANGE);
571 else if (!matherr(&exc)) {
572 __set_errno (ERANGE);
573 }
574 break;
575 case 26:
576 case 126:
577 case 226:
578 /* sqrt(x<0) */
579 exc.type = DOMAIN;
580 exc.name = CSTR ("sqrt");
581 if (_LIB_VERSION == _SVID_)
582 exc.retval = zero;
583 else
584 exc.retval = zero/zero;
585 if (_LIB_VERSION == _POSIX_)
586 __set_errno (EDOM);
587 else if (!matherr(&exc)) {
588 if (_LIB_VERSION == _SVID_) {
589 (void) WRITE2("sqrt: DOMAIN error\n", 19);
590 }
591 __set_errno (EDOM);
592 }
593 break;
594 case 27:
595 case 127:
596 case 227:
597 /* fmod(x,0) */
598 exc.type = DOMAIN;
599 exc.name = CSTR ("fmod");
600 if (_LIB_VERSION == _SVID_)
601 exc.retval = x;
602 else
603 exc.retval = zero/zero;
604 if (_LIB_VERSION == _POSIX_)
605 __set_errno (EDOM);
606 else if (!matherr(&exc)) {
607 if (_LIB_VERSION == _SVID_) {
608 (void) WRITE2("fmod: DOMAIN error\n", 20);
609 }
610 __set_errno (EDOM);
611 }
612 break;
613 case 28:
614 case 128:
615 case 228:
616 /* remainder(x,0) */
617 exc.type = DOMAIN;
618 exc.name = CSTR ("remainder");
619 exc.retval = zero/zero;
620 if (_LIB_VERSION == _POSIX_)
621 __set_errno (EDOM);
622 else if (!matherr(&exc)) {
623 if (_LIB_VERSION == _SVID_) {
624 (void) WRITE2("remainder: DOMAIN error\n", 24);
625 }
626 __set_errno (EDOM);
627 }
628 break;
629 case 29:
630 case 129:
631 case 229:
632 /* acosh(x<1) */
633 exc.type = DOMAIN;
634 exc.name = CSTR ("acosh");
635 exc.retval = zero/zero;
636 if (_LIB_VERSION == _POSIX_)
637 __set_errno (EDOM);
638 else if (!matherr(&exc)) {
639 if (_LIB_VERSION == _SVID_) {
640 (void) WRITE2("acosh: DOMAIN error\n", 20);
641 }
642 __set_errno (EDOM);
643 }
644 break;
645 case 30:
646 case 130:
647 case 230:
648 /* atanh(|x|>1) */
649 exc.type = DOMAIN;
650 exc.name = CSTR ("atanh");
651 exc.retval = zero/zero;
652 if (_LIB_VERSION == _POSIX_)
653 __set_errno (EDOM);
654 else if (!matherr(&exc)) {
655 if (_LIB_VERSION == _SVID_) {
656 (void) WRITE2("atanh: DOMAIN error\n", 20);
657 }
658 __set_errno (EDOM);
659 }
660 break;
661 case 31:
662 case 131:
663 case 231:
664 /* atanh(|x|=1) */
665 exc.type = SING;
666 exc.name = CSTR ("atanh");
667 exc.retval = x/zero; /* sign(x)*inf */
668 if (_LIB_VERSION == _POSIX_)
669 __set_errno (ERANGE);
670 else if (!matherr(&exc)) {
671 if (_LIB_VERSION == _SVID_) {
672 (void) WRITE2("atanh: SING error\n", 18);
673 }
674 __set_errno (EDOM);
675 }
676 break;
677 case 32:
678 case 132:
679 case 232:
680 /* scalb overflow; SVID also returns +-HUGE_VAL */
681 exc.type = OVERFLOW;
682 exc.name = CSTR ("scalb");
683 exc.retval = x > zero ? HUGE_VAL : -HUGE_VAL;
684 if (_LIB_VERSION == _POSIX_)
685 __set_errno (ERANGE);
686 else if (!matherr(&exc)) {
687 __set_errno (ERANGE);
688 }
689 break;
690 case 33:
691 case 133:
692 case 233:
693 /* scalb underflow */
694 exc.type = UNDERFLOW;
695 exc.name = CSTR ("scalb");
696 exc.retval = copysign(zero,x);
697 if (_LIB_VERSION == _POSIX_)
698 __set_errno (ERANGE);
699 else if (!matherr(&exc)) {
700 __set_errno (ERANGE);
701 }
702 break;
703 case 34:
704 case 134:
705 case 234:
706 /* j0(|x|>X_TLOSS) */
707 exc.type = TLOSS;
708 exc.name = CSTR ("j0");
709 exc.retval = zero;
710 if (_LIB_VERSION == _POSIX_)
711 __set_errno (ERANGE);
712 else if (!matherr(&exc)) {
713 if (_LIB_VERSION == _SVID_) {
714 (void) WRITE2(exc.name, 2);
715 (void) WRITE2(": TLOSS error\n", 14);
716 }
717 __set_errno (ERANGE);
718 }
719 break;
720 case 35:
721 case 135:
722 case 235:
723 /* y0(x>X_TLOSS) */
724 exc.type = TLOSS;
725 exc.name = CSTR ("y0");
726 exc.retval = zero;
727 if (_LIB_VERSION == _POSIX_)
728 __set_errno (ERANGE);
729 else if (!matherr(&exc)) {
730 if (_LIB_VERSION == _SVID_) {
731 (void) WRITE2(exc.name, 2);
732 (void) WRITE2(": TLOSS error\n", 14);
733 }
734 __set_errno (ERANGE);
735 }
736 break;
737 case 36:
738 case 136:
739 case 236:
740 /* j1(|x|>X_TLOSS) */
741 exc.type = TLOSS;
742 exc.name = CSTR ("j1");
743 exc.retval = zero;
744 if (_LIB_VERSION == _POSIX_)
745 __set_errno (ERANGE);
746 else if (!matherr(&exc)) {
747 if (_LIB_VERSION == _SVID_) {
748 (void) WRITE2(exc.name, 2);
749 (void) WRITE2(": TLOSS error\n", 14);
750 }
751 __set_errno (ERANGE);
752 }
753 break;
754 case 37:
755 case 137:
756 case 237:
757 /* y1(x>X_TLOSS) */
758 exc.type = TLOSS;
759 exc.name = CSTR ("y1");
760 exc.retval = zero;
761 if (_LIB_VERSION == _POSIX_)
762 __set_errno (ERANGE);
763 else if (!matherr(&exc)) {
764 if (_LIB_VERSION == _SVID_) {
765 (void) WRITE2(exc.name, 2);
766 (void) WRITE2(": TLOSS error\n", 14);
767 }
768 __set_errno (ERANGE);
769 }
770 break;
771 case 38:
772 case 138:
773 case 238:
774 /* jn(|x|>X_TLOSS) */
775 exc.type = TLOSS;
776 exc.name = CSTR ("jn");
777 exc.retval = zero;
778 if (_LIB_VERSION == _POSIX_)
779 __set_errno (ERANGE);
780 else if (!matherr(&exc)) {
781 if (_LIB_VERSION == _SVID_) {
782 (void) WRITE2(exc.name, 2);
783 (void) WRITE2(": TLOSS error\n", 14);
784 }
785 __set_errno (ERANGE);
786 }
787 break;
788 case 39:
789 case 139:
790 case 239:
791 /* yn(x>X_TLOSS) */
792 exc.type = TLOSS;
793 exc.name = CSTR ("yn");
794 exc.retval = zero;
795 if (_LIB_VERSION == _POSIX_)
796 __set_errno (ERANGE);
797 else if (!matherr(&exc)) {
798 if (_LIB_VERSION == _SVID_) {
799 (void) WRITE2(exc.name, 2);
800 (void) WRITE2(": TLOSS error\n", 14);
801 }
802 __set_errno (ERANGE);
803 }
804 break;
805 case 40:
806 case 140:
807 case 240:
808 /* tgamma(finite) overflow */
809 exc.type = OVERFLOW;
810 exc.name = CSTR ("tgamma");
811 exc.retval = copysign (HUGE_VAL, x);
812 if (_LIB_VERSION == _POSIX_)
813 __set_errno (ERANGE);
814 else if (!matherr(&exc)) {
815 __set_errno (ERANGE);
816 }
817 break;
818 case 41:
819 case 141:
820 case 241:
821 /* tgamma(-integer) */
822 exc.type = SING;
823 exc.name = CSTR ("tgamma");
824 exc.retval = NAN;
825 if (_LIB_VERSION == _POSIX_)
826 __set_errno (EDOM);
827 else if (!matherr(&exc)) {
828 if (_LIB_VERSION == _SVID_) {
829 (void) WRITE2("tgamma: SING error\n", 18);
830 exc.retval = HUGE_VAL;
831 }
832 __set_errno (EDOM);
833 }
834 break;
835
836 case 44:
837 case 144:
838 case 244:
839 /* exp(finite) overflow */
840 exc.type = OVERFLOW;
841 exc.name = CSTR ("exp2");
842 if (_LIB_VERSION == _SVID_)
843 exc.retval = HUGE;
844 else
845 exc.retval = HUGE_VAL;
846 if (_LIB_VERSION == _POSIX_)
847 __set_errno (ERANGE);
848 else if (!matherr(&exc)) {
849 __set_errno (ERANGE);
850 }
851 break;
852 case 45:
853 case 145:
854 case 245:
855 /* exp(finite) underflow */
856 exc.type = UNDERFLOW;
857 exc.name = CSTR ("exp2");
858 exc.retval = zero;
859 if (_LIB_VERSION == _POSIX_)
860 __set_errno (ERANGE);
861 else if (!matherr(&exc)) {
862 __set_errno (ERANGE);
863 }
864 break;
865
866 case 46:
867 case 146:
868 case 246:
869 /* exp(finite) overflow */
870 exc.type = OVERFLOW;
871 exc.name = CSTR ("exp10");
872 if (_LIB_VERSION == _SVID_)
873 exc.retval = HUGE;
874 else
875 exc.retval = HUGE_VAL;
876 if (_LIB_VERSION == _POSIX_)
877 __set_errno (ERANGE);
878 else if (!matherr(&exc)) {
879 __set_errno (ERANGE);
880 }
881 break;
882 case 47:
883 case 147:
884 case 247:
885 /* exp(finite) underflow */
886 exc.type = UNDERFLOW;
887 exc.name = CSTR ("exp10");
888 exc.retval = zero;
889 if (_LIB_VERSION == _POSIX_)
890 __set_errno (ERANGE);
891 else if (!matherr(&exc)) {
892 __set_errno (ERANGE);
893 }
894 break;
895 case 48:
896 case 148:
897 case 248:
898 /* log2(0) */
899 exc.type = SING;
900 exc.name = CSTR ("log2");
901 if (_LIB_VERSION == _SVID_)
902 exc.retval = -HUGE;
903 else
904 exc.retval = -HUGE_VAL;
905 if (_LIB_VERSION == _POSIX_)
906 __set_errno (ERANGE);
907 else if (!matherr(&exc)) {
908 __set_errno (EDOM);
909 }
910 break;
911 case 49:
912 case 149:
913 case 249:
914 /* log2(x<0) */
915 exc.type = DOMAIN;
916 exc.name = CSTR ("log2");
917 if (_LIB_VERSION == _SVID_)
918 exc.retval = -HUGE;
919 else
920 exc.retval = NAN;
921 if (_LIB_VERSION == _POSIX_)
922 __set_errno (EDOM);
923 else if (!matherr(&exc)) {
924 __set_errno (EDOM);
925 }
926 break;
927 case 50:
928 case 150:
929 case 250:
930 /* tgamma(+-0) */
931 exc.type = SING;
932 exc.name = CSTR ("tgamma");
933 exc.retval = copysign (HUGE_VAL, x);
934 if (_LIB_VERSION == _POSIX_)
935 __set_errno (ERANGE);
936 else if (!matherr(&exc)) {
937 if (_LIB_VERSION == _SVID_)
938 (void) WRITE2("tgamma: SING error\n", 18);
939 __set_errno (ERANGE);
940 }
941 break;
942
943 /* #### Last used is 50/150/250 ### */
944
945 default:
946 __builtin_unreachable ();
947 }
948 return exc.retval;
949 }
950 #endif
951