(root)/
glibc-2.38/
sysdeps/
ieee754/
k_standard.c
       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
      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