2 * ====================================================
3 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
5 * Developed at SunPro, a Sun Microsystems, Inc. business.
6 * Permission to use, copy, modify, and distribute this
7 * software is freely granted, provided that this notice
9 * ====================================================
13 #include "math_private.h"
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)
25 #endif /* !defined(_USE_WRITE) */
27 static const double zero = 0.0; /* used as const */
30 * Standard conformance (non-IEEE) on exception cases.
45 * 14-- lgamma(finite) overflow
46 * 15-- lgamma(-integer)
52 * 21-- pow(x,y) overflow
53 * 22-- pow(x,y) underflow
54 * 23-- pow(0,negative)
55 * 24-- pow(neg,non-integral)
56 * 25-- sinh(finite) overflow
64 * 33-- scalb underflow
65 * 34-- j0(|x|>X_TLOSS)
67 * 36-- j1(|x|>X_TLOSS)
69 * 38-- jn(|x|>X_TLOSS, n)
70 * 39-- yn(x>X_TLOSS, n)
71 * 40-- gamma(finite) overflow
72 * 41-- gamma(-integer)
76 double __kernel_standard(double x, double y, int type)
79 #ifndef HUGE_VAL /* this is the only routine that uses HUGE_VAL */
83 SET_HIGH_WORD(inf,0x7ff00000); /* set inf to infinite */
87 (void) fflush(stdout);
96 exc.name = type < 100 ? "acos" : "acosf";
98 if (_LIB_VERSION == _POSIX_)
100 else if (!matherr(&exc)) {
101 if(_LIB_VERSION == _SVID_) {
102 (void) WRITE2("acos: DOMAIN error\n", 19);
111 exc.name = type < 100 ? "asin" : "asinf";
113 if(_LIB_VERSION == _POSIX_)
115 else if (!matherr(&exc)) {
116 if(_LIB_VERSION == _SVID_) {
117 (void) WRITE2("asin: DOMAIN error\n", 19);
128 exc.name = type < 100 ? "atan2" : "atan2f";
130 if(_LIB_VERSION == _POSIX_)
132 else if (!matherr(&exc)) {
133 if(_LIB_VERSION == _SVID_) {
134 (void) WRITE2("atan2: DOMAIN error\n", 20);
141 /* hypot(finite,finite) overflow */
143 exc.name = type < 100 ? "hypot" : "hypotf";
144 if (_LIB_VERSION == _SVID_)
147 exc.retval = HUGE_VAL;
148 if (_LIB_VERSION == _POSIX_)
150 else if (!matherr(&exc)) {
156 /* cosh(finite) overflow */
158 exc.name = type < 100 ? "cosh" : "coshf";
159 if (_LIB_VERSION == _SVID_)
162 exc.retval = HUGE_VAL;
163 if (_LIB_VERSION == _POSIX_)
165 else if (!matherr(&exc)) {
171 /* exp(finite) overflow */
173 exc.name = type < 100 ? "exp" : "expf";
174 if (_LIB_VERSION == _SVID_)
177 exc.retval = HUGE_VAL;
178 if (_LIB_VERSION == _POSIX_)
180 else if (!matherr(&exc)) {
186 /* exp(finite) underflow */
187 exc.type = UNDERFLOW;
188 exc.name = type < 100 ? "exp" : "expf";
190 if (_LIB_VERSION == _POSIX_)
192 else if (!matherr(&exc)) {
199 exc.type = DOMAIN; /* should be SING for IEEE */
200 exc.name = type < 100 ? "y0" : "y0f";
201 if (_LIB_VERSION == _SVID_)
204 exc.retval = -HUGE_VAL;
205 if (_LIB_VERSION == _POSIX_)
207 else if (!matherr(&exc)) {
208 if (_LIB_VERSION == _SVID_) {
209 (void) WRITE2("y0: DOMAIN error\n", 17);
218 exc.name = type < 100 ? "y0" : "y0f";
219 if (_LIB_VERSION == _SVID_)
222 exc.retval = -HUGE_VAL;
223 if (_LIB_VERSION == _POSIX_)
225 else if (!matherr(&exc)) {
226 if (_LIB_VERSION == _SVID_) {
227 (void) WRITE2("y0: DOMAIN error\n", 17);
235 exc.type = DOMAIN; /* should be SING for IEEE */
236 exc.name = type < 100 ? "y1" : "y1f";
237 if (_LIB_VERSION == _SVID_)
240 exc.retval = -HUGE_VAL;
241 if (_LIB_VERSION == _POSIX_)
243 else if (!matherr(&exc)) {
244 if (_LIB_VERSION == _SVID_) {
245 (void) WRITE2("y1: DOMAIN error\n", 17);
254 exc.name = type < 100 ? "y1" : "y1f";
255 if (_LIB_VERSION == _SVID_)
258 exc.retval = -HUGE_VAL;
259 if (_LIB_VERSION == _POSIX_)
261 else if (!matherr(&exc)) {
262 if (_LIB_VERSION == _SVID_) {
263 (void) WRITE2("y1: DOMAIN error\n", 17);
271 exc.type = DOMAIN; /* should be SING for IEEE */
272 exc.name = type < 100 ? "yn" : "ynf";
273 if (_LIB_VERSION == _SVID_)
276 exc.retval = -HUGE_VAL;
277 if (_LIB_VERSION == _POSIX_)
279 else if (!matherr(&exc)) {
280 if (_LIB_VERSION == _SVID_) {
281 (void) WRITE2("yn: DOMAIN error\n", 17);
290 exc.name = type < 100 ? "yn" : "ynf";
291 if (_LIB_VERSION == _SVID_)
294 exc.retval = -HUGE_VAL;
295 if (_LIB_VERSION == _POSIX_)
297 else if (!matherr(&exc)) {
298 if (_LIB_VERSION == _SVID_) {
299 (void) WRITE2("yn: DOMAIN error\n", 17);
306 /* lgamma(finite) overflow */
308 exc.name = type < 100 ? "lgamma" : "lgammaf";
309 if (_LIB_VERSION == _SVID_)
312 exc.retval = HUGE_VAL;
313 if (_LIB_VERSION == _POSIX_)
315 else if (!matherr(&exc)) {
321 /* lgamma(-integer) or lgamma(0) */
323 exc.name = type < 100 ? "lgamma" : "lgammaf";
324 if (_LIB_VERSION == _SVID_)
327 exc.retval = HUGE_VAL;
328 if (_LIB_VERSION == _POSIX_)
330 else if (!matherr(&exc)) {
331 if (_LIB_VERSION == _SVID_) {
332 (void) WRITE2("lgamma: SING error\n", 19);
341 exc.name = type < 100 ? "log" : "logf";
342 if (_LIB_VERSION == _SVID_)
345 exc.retval = -HUGE_VAL;
346 if (_LIB_VERSION == _POSIX_)
348 else if (!matherr(&exc)) {
349 if (_LIB_VERSION == _SVID_) {
350 (void) WRITE2("log: SING error\n", 16);
359 exc.name = type < 100 ? "log" : "logf";
360 if (_LIB_VERSION == _SVID_)
363 exc.retval = -HUGE_VAL;
364 if (_LIB_VERSION == _POSIX_)
366 else if (!matherr(&exc)) {
367 if (_LIB_VERSION == _SVID_) {
368 (void) WRITE2("log: DOMAIN error\n", 18);
377 exc.name = type < 100 ? "log10" : "log10f";
378 if (_LIB_VERSION == _SVID_)
381 exc.retval = -HUGE_VAL;
382 if (_LIB_VERSION == _POSIX_)
384 else if (!matherr(&exc)) {
385 if (_LIB_VERSION == _SVID_) {
386 (void) WRITE2("log10: SING error\n", 18);
395 exc.name = type < 100 ? "log10" : "log10f";
396 if (_LIB_VERSION == _SVID_)
399 exc.retval = -HUGE_VAL;
400 if (_LIB_VERSION == _POSIX_)
402 else if (!matherr(&exc)) {
403 if (_LIB_VERSION == _SVID_) {
404 (void) WRITE2("log10: DOMAIN error\n", 20);
412 /* error only if _LIB_VERSION == _SVID_ */
414 exc.name = type < 100 ? "pow" : "powf";
416 if (_LIB_VERSION != _SVID_) exc.retval = 1.0;
417 else if (!matherr(&exc)) {
418 (void) WRITE2("pow(0,0): DOMAIN error\n", 23);
424 /* pow(x,y) overflow */
426 exc.name = type < 100 ? "pow" : "powf";
427 if (_LIB_VERSION == _SVID_) {
430 if(x<zero&&rint(y)!=y) exc.retval = -HUGE;
432 exc.retval = HUGE_VAL;
434 if(x<zero&&rint(y)!=y) exc.retval = -HUGE_VAL;
436 if (_LIB_VERSION == _POSIX_)
438 else if (!matherr(&exc)) {
444 /* pow(x,y) underflow */
445 exc.type = UNDERFLOW;
446 exc.name = type < 100 ? "pow" : "powf";
448 if (_LIB_VERSION == _POSIX_)
450 else if (!matherr(&exc)) {
458 exc.name = type < 100 ? "pow" : "powf";
459 if (_LIB_VERSION == _SVID_)
462 exc.retval = -HUGE_VAL;
463 if (_LIB_VERSION == _POSIX_)
465 else if (!matherr(&exc)) {
466 if (_LIB_VERSION == _SVID_) {
467 (void) WRITE2("pow(0,neg): DOMAIN error\n", 25);
474 /* neg**non-integral */
476 exc.name = type < 100 ? "pow" : "powf";
477 if (_LIB_VERSION == _SVID_)
480 exc.retval = zero/zero; /* X/Open allow NaN */
481 if (_LIB_VERSION == _POSIX_)
483 else if (!matherr(&exc)) {
484 if (_LIB_VERSION == _SVID_) {
485 (void) WRITE2("neg**non-integral: DOMAIN error\n", 32);
492 /* sinh(finite) overflow */
494 exc.name = type < 100 ? "sinh" : "sinhf";
495 if (_LIB_VERSION == _SVID_)
496 exc.retval = ( (x>zero) ? HUGE : -HUGE);
498 exc.retval = ( (x>zero) ? HUGE_VAL : -HUGE_VAL);
499 if (_LIB_VERSION == _POSIX_)
501 else if (!matherr(&exc)) {
509 exc.name = type < 100 ? "sqrt" : "sqrtf";
510 if (_LIB_VERSION == _SVID_)
513 exc.retval = zero/zero;
514 if (_LIB_VERSION == _POSIX_)
516 else if (!matherr(&exc)) {
517 if (_LIB_VERSION == _SVID_) {
518 (void) WRITE2("sqrt: DOMAIN error\n", 19);
527 exc.name = type < 100 ? "fmod" : "fmodf";
528 if (_LIB_VERSION == _SVID_)
531 exc.retval = zero/zero;
532 if (_LIB_VERSION == _POSIX_)
534 else if (!matherr(&exc)) {
535 if (_LIB_VERSION == _SVID_) {
536 (void) WRITE2("fmod: DOMAIN error\n", 20);
545 exc.name = type < 100 ? "remainder" : "remainderf";
546 exc.retval = zero/zero;
547 if (_LIB_VERSION == _POSIX_)
549 else if (!matherr(&exc)) {
550 if (_LIB_VERSION == _SVID_) {
551 (void) WRITE2("remainder: DOMAIN error\n", 24);
560 exc.name = type < 100 ? "acosh" : "acoshf";
561 exc.retval = zero/zero;
562 if (_LIB_VERSION == _POSIX_)
564 else if (!matherr(&exc)) {
565 if (_LIB_VERSION == _SVID_) {
566 (void) WRITE2("acosh: DOMAIN error\n", 20);
575 exc.name = type < 100 ? "atanh" : "atanhf";
576 exc.retval = zero/zero;
577 if (_LIB_VERSION == _POSIX_)
579 else if (!matherr(&exc)) {
580 if (_LIB_VERSION == _SVID_) {
581 (void) WRITE2("atanh: DOMAIN error\n", 20);
590 exc.name = type < 100 ? "atanh" : "atanhf";
591 exc.retval = x/zero; /* sign(x)*inf */
592 if (_LIB_VERSION == _POSIX_)
594 else if (!matherr(&exc)) {
595 if (_LIB_VERSION == _SVID_) {
596 (void) WRITE2("atanh: SING error\n", 18);
601 # ifdef __UCLIBC_SUSV3_LEGACY__
604 /* scalb overflow; SVID also returns +-HUGE_VAL */
606 exc.name = type < 100 ? "scalb" : "scalbf";
607 exc.retval = x > zero ? HUGE_VAL : -HUGE_VAL;
608 if (_LIB_VERSION == _POSIX_)
610 else if (!matherr(&exc)) {
616 /* scalb underflow */
617 exc.type = UNDERFLOW;
618 exc.name = type < 100 ? "scalb" : "scalbf";
619 exc.retval = copysign(zero,x);
620 if (_LIB_VERSION == _POSIX_)
622 else if (!matherr(&exc)) {
629 /* j0(|x|>X_TLOSS) */
631 exc.name = type < 100 ? "j0" : "j0f";
633 if (_LIB_VERSION == _POSIX_)
635 else if (!matherr(&exc)) {
636 if (_LIB_VERSION == _SVID_) {
637 (void) WRITE2(exc.name, 2);
638 (void) WRITE2(": TLOSS error\n", 14);
647 exc.name = type < 100 ? "y0" : "y0f";
649 if (_LIB_VERSION == _POSIX_)
651 else if (!matherr(&exc)) {
652 if (_LIB_VERSION == _SVID_) {
653 (void) WRITE2(exc.name, 2);
654 (void) WRITE2(": TLOSS error\n", 14);
661 /* j1(|x|>X_TLOSS) */
663 exc.name = type < 100 ? "j1" : "j1f";
665 if (_LIB_VERSION == _POSIX_)
667 else if (!matherr(&exc)) {
668 if (_LIB_VERSION == _SVID_) {
669 (void) WRITE2(exc.name, 2);
670 (void) WRITE2(": TLOSS error\n", 14);
679 exc.name = type < 100 ? "y1" : "y1f";
681 if (_LIB_VERSION == _POSIX_)
683 else if (!matherr(&exc)) {
684 if (_LIB_VERSION == _SVID_) {
685 (void) WRITE2(exc.name, 2);
686 (void) WRITE2(": TLOSS error\n", 14);
693 /* jn(|x|>X_TLOSS) */
695 exc.name = type < 100 ? "jn" : "jnf";
697 if (_LIB_VERSION == _POSIX_)
699 else if (!matherr(&exc)) {
700 if (_LIB_VERSION == _SVID_) {
701 (void) WRITE2(exc.name, 2);
702 (void) WRITE2(": TLOSS error\n", 14);
711 exc.name = type < 100 ? "yn" : "ynf";
713 if (_LIB_VERSION == _POSIX_)
715 else if (!matherr(&exc)) {
716 if (_LIB_VERSION == _SVID_) {
717 (void) WRITE2(exc.name, 2);
718 (void) WRITE2(": TLOSS error\n", 14);
725 /* gamma(finite) overflow */
727 exc.name = type < 100 ? "gamma" : "gammaf";
728 if (_LIB_VERSION == _SVID_)
731 exc.retval = HUGE_VAL;
732 if (_LIB_VERSION == _POSIX_)
734 else if (!matherr(&exc)) {
740 /* gamma(-integer) or gamma(0) */
742 exc.name = type < 100 ? "gamma" : "gammaf";
743 if (_LIB_VERSION == _SVID_)
746 exc.retval = HUGE_VAL;
747 if (_LIB_VERSION == _POSIX_)
749 else if (!matherr(&exc)) {
750 if (_LIB_VERSION == _SVID_) {
751 (void) WRITE2("gamma: SING error\n", 18);
759 /* error only if _LIB_VERSION == _SVID_ & _XOPEN_ */
761 exc.name = type < 100 ? "pow" : "powf";
763 if (_LIB_VERSION == _IEEE_ ||
764 _LIB_VERSION == _POSIX_) exc.retval = 1.0;
765 else if (!matherr(&exc)) {
772 #endif /* _IEEE_LIBM */