Home | History | Annotate | Line # | Download | only in gdtoa
strtod.c revision 1.1
      1  1.1  kleink /* $NetBSD: strtod.c,v 1.1 2006/01/25 15:18:51 kleink Exp $ */
      2  1.1  kleink 
      3  1.1  kleink /****************************************************************
      4  1.1  kleink 
      5  1.1  kleink The author of this software is David M. Gay.
      6  1.1  kleink 
      7  1.1  kleink Copyright (C) 1998-2001 by Lucent Technologies
      8  1.1  kleink All Rights Reserved
      9  1.1  kleink 
     10  1.1  kleink Permission to use, copy, modify, and distribute this software and
     11  1.1  kleink its documentation for any purpose and without fee is hereby
     12  1.1  kleink granted, provided that the above copyright notice appear in all
     13  1.1  kleink copies and that both that the copyright notice and this
     14  1.1  kleink permission notice and warranty disclaimer appear in supporting
     15  1.1  kleink documentation, and that the name of Lucent or any of its entities
     16  1.1  kleink not be used in advertising or publicity pertaining to
     17  1.1  kleink distribution of the software without specific, written prior
     18  1.1  kleink permission.
     19  1.1  kleink 
     20  1.1  kleink LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
     21  1.1  kleink INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
     22  1.1  kleink IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
     23  1.1  kleink SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     24  1.1  kleink WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
     25  1.1  kleink IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
     26  1.1  kleink ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
     27  1.1  kleink THIS SOFTWARE.
     28  1.1  kleink 
     29  1.1  kleink ****************************************************************/
     30  1.1  kleink 
     31  1.1  kleink /* Please send bug reports to David M. Gay (dmg at acm dot org,
     32  1.1  kleink  * with " at " changed at "@" and " dot " changed to ".").	*/
     33  1.1  kleink 
     34  1.1  kleink #include "gdtoaimp.h"
     35  1.1  kleink #ifndef NO_FENV_H
     36  1.1  kleink #include <fenv.h>
     37  1.1  kleink #endif
     38  1.1  kleink 
     39  1.1  kleink #ifdef USE_LOCALE
     40  1.1  kleink #include "locale.h"
     41  1.1  kleink #endif
     42  1.1  kleink 
     43  1.1  kleink #ifdef IEEE_Arith
     44  1.1  kleink #ifndef NO_IEEE_Scale
     45  1.1  kleink #define Avoid_Underflow
     46  1.1  kleink #undef tinytens
     47  1.1  kleink /* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */
     48  1.1  kleink /* flag unnecessarily.  It leads to a song and dance at the end of strtod. */
     49  1.1  kleink static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
     50  1.1  kleink 		9007199254740992.e-256
     51  1.1  kleink 		};
     52  1.1  kleink #endif
     53  1.1  kleink #endif
     54  1.1  kleink 
     55  1.1  kleink #ifdef Honor_FLT_ROUNDS
     56  1.1  kleink #define Rounding rounding
     57  1.1  kleink #undef Check_FLT_ROUNDS
     58  1.1  kleink #define Check_FLT_ROUNDS
     59  1.1  kleink #else
     60  1.1  kleink #define Rounding Flt_Rounds
     61  1.1  kleink #endif
     62  1.1  kleink 
     63  1.1  kleink  double
     64  1.1  kleink strtod
     65  1.1  kleink #ifdef KR_headers
     66  1.1  kleink 	(s00, se) CONST char *s00; char **se;
     67  1.1  kleink #else
     68  1.1  kleink 	(CONST char *s00, char **se)
     69  1.1  kleink #endif
     70  1.1  kleink {
     71  1.1  kleink #ifdef Avoid_Underflow
     72  1.1  kleink 	int scale;
     73  1.1  kleink #endif
     74  1.1  kleink 	int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign,
     75  1.1  kleink 		 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
     76  1.1  kleink 	CONST char *s, *s0, *s1;
     77  1.1  kleink 	double aadj, aadj1, adj, rv, rv0;
     78  1.1  kleink 	Long L;
     79  1.1  kleink 	ULong y, z;
     80  1.1  kleink 	Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
     81  1.1  kleink #ifdef SET_INEXACT
     82  1.1  kleink 	int inexact, oldinexact;
     83  1.1  kleink #endif
     84  1.1  kleink #ifdef Honor_FLT_ROUNDS
     85  1.1  kleink 	int rounding;
     86  1.1  kleink #endif
     87  1.1  kleink 
     88  1.1  kleink 	sign = nz0 = nz = decpt = 0;
     89  1.1  kleink 	dval(rv) = 0.;
     90  1.1  kleink 	for(s = s00;;s++) switch(*s) {
     91  1.1  kleink 		case '-':
     92  1.1  kleink 			sign = 1;
     93  1.1  kleink 			/* no break */
     94  1.1  kleink 		case '+':
     95  1.1  kleink 			if (*++s)
     96  1.1  kleink 				goto break2;
     97  1.1  kleink 			/* no break */
     98  1.1  kleink 		case 0:
     99  1.1  kleink 			goto ret0;
    100  1.1  kleink 		case '\t':
    101  1.1  kleink 		case '\n':
    102  1.1  kleink 		case '\v':
    103  1.1  kleink 		case '\f':
    104  1.1  kleink 		case '\r':
    105  1.1  kleink 		case ' ':
    106  1.1  kleink 			continue;
    107  1.1  kleink 		default:
    108  1.1  kleink 			goto break2;
    109  1.1  kleink 		}
    110  1.1  kleink  break2:
    111  1.1  kleink 	if (*s == '0') {
    112  1.1  kleink #ifndef NO_HEX_FP
    113  1.1  kleink 		{
    114  1.1  kleink 		static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI };
    115  1.1  kleink 		Long exp;
    116  1.1  kleink 		ULong bits[2];
    117  1.1  kleink 		switch(s[1]) {
    118  1.1  kleink 		  case 'x':
    119  1.1  kleink 		  case 'X':
    120  1.1  kleink 			{
    121  1.1  kleink #if defined(FE_DOWNWARD) && defined(FE_TONEAREST) && defined(FE_TOWARDZERO) && defined(FE_UPWARD)
    122  1.1  kleink 			FPI fpi1 = fpi;
    123  1.1  kleink 			switch(fegetround()) {
    124  1.1  kleink 			  case FE_TOWARDZERO:	fpi1.rounding = 0; break;
    125  1.1  kleink 			  case FE_UPWARD:	fpi1.rounding = 2; break;
    126  1.1  kleink 			  case FE_DOWNWARD:	fpi1.rounding = 3;
    127  1.1  kleink 			  }
    128  1.1  kleink #else
    129  1.1  kleink #define fpi1 fpi
    130  1.1  kleink #endif
    131  1.1  kleink 			switch((i = gethex(&s, &fpi1, &exp, &bb, sign)) & STRTOG_Retmask) {
    132  1.1  kleink 			  case STRTOG_NoNumber:
    133  1.1  kleink 				s = s00;
    134  1.1  kleink 				sign = 0;
    135  1.1  kleink 			  case STRTOG_Zero:
    136  1.1  kleink 				break;
    137  1.1  kleink 			  default:
    138  1.1  kleink 				if (bb) {
    139  1.1  kleink 					copybits(bits, fpi.nbits, bb);
    140  1.1  kleink 					Bfree(bb);
    141  1.1  kleink 					}
    142  1.1  kleink 				ULtod(((U*)&rv)->L, bits, exp, i);
    143  1.1  kleink 			  }}
    144  1.1  kleink 			goto ret;
    145  1.1  kleink 		  }
    146  1.1  kleink 		}
    147  1.1  kleink #endif
    148  1.1  kleink 		nz0 = 1;
    149  1.1  kleink 		while(*++s == '0') ;
    150  1.1  kleink 		if (!*s)
    151  1.1  kleink 			goto ret;
    152  1.1  kleink 		}
    153  1.1  kleink 	s0 = s;
    154  1.1  kleink 	y = z = 0;
    155  1.1  kleink 	for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
    156  1.1  kleink 		if (nd < 9)
    157  1.1  kleink 			y = 10*y + c - '0';
    158  1.1  kleink 		else if (nd < 16)
    159  1.1  kleink 			z = 10*z + c - '0';
    160  1.1  kleink 	nd0 = nd;
    161  1.1  kleink #ifdef USE_LOCALE
    162  1.1  kleink 	if (c == *localeconv()->decimal_point)
    163  1.1  kleink #else
    164  1.1  kleink 	if (c == '.')
    165  1.1  kleink #endif
    166  1.1  kleink 		{
    167  1.1  kleink 		decpt = 1;
    168  1.1  kleink 		c = *++s;
    169  1.1  kleink 		if (!nd) {
    170  1.1  kleink 			for(; c == '0'; c = *++s)
    171  1.1  kleink 				nz++;
    172  1.1  kleink 			if (c > '0' && c <= '9') {
    173  1.1  kleink 				s0 = s;
    174  1.1  kleink 				nf += nz;
    175  1.1  kleink 				nz = 0;
    176  1.1  kleink 				goto have_dig;
    177  1.1  kleink 				}
    178  1.1  kleink 			goto dig_done;
    179  1.1  kleink 			}
    180  1.1  kleink 		for(; c >= '0' && c <= '9'; c = *++s) {
    181  1.1  kleink  have_dig:
    182  1.1  kleink 			nz++;
    183  1.1  kleink 			if (c -= '0') {
    184  1.1  kleink 				nf += nz;
    185  1.1  kleink 				for(i = 1; i < nz; i++)
    186  1.1  kleink 					if (nd++ < 9)
    187  1.1  kleink 						y *= 10;
    188  1.1  kleink 					else if (nd <= DBL_DIG + 1)
    189  1.1  kleink 						z *= 10;
    190  1.1  kleink 				if (nd++ < 9)
    191  1.1  kleink 					y = 10*y + c;
    192  1.1  kleink 				else if (nd <= DBL_DIG + 1)
    193  1.1  kleink 					z = 10*z + c;
    194  1.1  kleink 				nz = 0;
    195  1.1  kleink 				}
    196  1.1  kleink 			}
    197  1.1  kleink 		}
    198  1.1  kleink  dig_done:
    199  1.1  kleink 	e = 0;
    200  1.1  kleink 	if (c == 'e' || c == 'E') {
    201  1.1  kleink 		if (!nd && !nz && !nz0) {
    202  1.1  kleink 			goto ret0;
    203  1.1  kleink 			}
    204  1.1  kleink 		s00 = s;
    205  1.1  kleink 		esign = 0;
    206  1.1  kleink 		switch(c = *++s) {
    207  1.1  kleink 			case '-':
    208  1.1  kleink 				esign = 1;
    209  1.1  kleink 			case '+':
    210  1.1  kleink 				c = *++s;
    211  1.1  kleink 			}
    212  1.1  kleink 		if (c >= '0' && c <= '9') {
    213  1.1  kleink 			while(c == '0')
    214  1.1  kleink 				c = *++s;
    215  1.1  kleink 			if (c > '0' && c <= '9') {
    216  1.1  kleink 				L = c - '0';
    217  1.1  kleink 				s1 = s;
    218  1.1  kleink 				while((c = *++s) >= '0' && c <= '9')
    219  1.1  kleink 					L = 10*L + c - '0';
    220  1.1  kleink 				if (s - s1 > 8 || L > 19999)
    221  1.1  kleink 					/* Avoid confusion from exponents
    222  1.1  kleink 					 * so large that e might overflow.
    223  1.1  kleink 					 */
    224  1.1  kleink 					e = 19999; /* safe for 16 bit ints */
    225  1.1  kleink 				else
    226  1.1  kleink 					e = (int)L;
    227  1.1  kleink 				if (esign)
    228  1.1  kleink 					e = -e;
    229  1.1  kleink 				}
    230  1.1  kleink 			else
    231  1.1  kleink 				e = 0;
    232  1.1  kleink 			}
    233  1.1  kleink 		else
    234  1.1  kleink 			s = s00;
    235  1.1  kleink 		}
    236  1.1  kleink 	if (!nd) {
    237  1.1  kleink 		if (!nz && !nz0) {
    238  1.1  kleink #ifdef INFNAN_CHECK
    239  1.1  kleink 			/* Check for Nan and Infinity */
    240  1.1  kleink 			ULong bits[2];
    241  1.1  kleink 			static FPI fpinan =	/* only 52 explicit bits */
    242  1.1  kleink 				{ 52, 1-1023-53+1, 2046-1023-53+1, 1, SI };
    243  1.1  kleink 			if (!decpt)
    244  1.1  kleink 			 switch(c) {
    245  1.1  kleink 			  case 'i':
    246  1.1  kleink 			  case 'I':
    247  1.1  kleink 				if (match(&s,"nf")) {
    248  1.1  kleink 					--s;
    249  1.1  kleink 					if (!match(&s,"inity"))
    250  1.1  kleink 						++s;
    251  1.1  kleink 					word0(rv) = 0x7ff00000;
    252  1.1  kleink 					word1(rv) = 0;
    253  1.1  kleink 					goto ret;
    254  1.1  kleink 					}
    255  1.1  kleink 				break;
    256  1.1  kleink 			  case 'n':
    257  1.1  kleink 			  case 'N':
    258  1.1  kleink 				if (match(&s, "an")) {
    259  1.1  kleink #ifndef No_Hex_NaN
    260  1.1  kleink 					if (*s == '(' /*)*/
    261  1.1  kleink 					 && hexnan(&s, &fpinan, bits)
    262  1.1  kleink 							== STRTOG_NaNbits) {
    263  1.1  kleink 						word0(rv) = 0x7ff00000 | bits[1];
    264  1.1  kleink 						word1(rv) = bits[0];
    265  1.1  kleink 						}
    266  1.1  kleink 					else {
    267  1.1  kleink #endif
    268  1.1  kleink 						word0(rv) = NAN_WORD0;
    269  1.1  kleink 						word1(rv) = NAN_WORD1;
    270  1.1  kleink #ifndef No_Hex_NaN
    271  1.1  kleink 						}
    272  1.1  kleink #endif
    273  1.1  kleink 					goto ret;
    274  1.1  kleink 					}
    275  1.1  kleink 			  }
    276  1.1  kleink #endif /* INFNAN_CHECK */
    277  1.1  kleink  ret0:
    278  1.1  kleink 			s = s00;
    279  1.1  kleink 			sign = 0;
    280  1.1  kleink 			}
    281  1.1  kleink 		goto ret;
    282  1.1  kleink 		}
    283  1.1  kleink 	e1 = e -= nf;
    284  1.1  kleink 
    285  1.1  kleink 	/* Now we have nd0 digits, starting at s0, followed by a
    286  1.1  kleink 	 * decimal point, followed by nd-nd0 digits.  The number we're
    287  1.1  kleink 	 * after is the integer represented by those digits times
    288  1.1  kleink 	 * 10**e */
    289  1.1  kleink 
    290  1.1  kleink 	if (!nd0)
    291  1.1  kleink 		nd0 = nd;
    292  1.1  kleink 	k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
    293  1.1  kleink 	dval(rv) = y;
    294  1.1  kleink 	if (k > 9) {
    295  1.1  kleink #ifdef SET_INEXACT
    296  1.1  kleink 		if (k > DBL_DIG)
    297  1.1  kleink 			oldinexact = get_inexact();
    298  1.1  kleink #endif
    299  1.1  kleink 		dval(rv) = tens[k - 9] * dval(rv) + z;
    300  1.1  kleink 		}
    301  1.1  kleink 	bd0 = 0;
    302  1.1  kleink 	if (nd <= DBL_DIG
    303  1.1  kleink #ifndef RND_PRODQUOT
    304  1.1  kleink #ifndef Honor_FLT_ROUNDS
    305  1.1  kleink 		&& Flt_Rounds == 1
    306  1.1  kleink #endif
    307  1.1  kleink #endif
    308  1.1  kleink 			) {
    309  1.1  kleink 		if (!e)
    310  1.1  kleink 			goto ret;
    311  1.1  kleink 		if (e > 0) {
    312  1.1  kleink 			if (e <= Ten_pmax) {
    313  1.1  kleink #ifdef VAX
    314  1.1  kleink 				goto vax_ovfl_check;
    315  1.1  kleink #else
    316  1.1  kleink #ifdef Honor_FLT_ROUNDS
    317  1.1  kleink 				/* round correctly FLT_ROUNDS = 2 or 3 */
    318  1.1  kleink 				if (sign) {
    319  1.1  kleink 					rv = -rv;
    320  1.1  kleink 					sign = 0;
    321  1.1  kleink 					}
    322  1.1  kleink #endif
    323  1.1  kleink 				/* rv = */ rounded_product(dval(rv), tens[e]);
    324  1.1  kleink 				goto ret;
    325  1.1  kleink #endif
    326  1.1  kleink 				}
    327  1.1  kleink 			i = DBL_DIG - nd;
    328  1.1  kleink 			if (e <= Ten_pmax + i) {
    329  1.1  kleink 				/* A fancier test would sometimes let us do
    330  1.1  kleink 				 * this for larger i values.
    331  1.1  kleink 				 */
    332  1.1  kleink #ifdef Honor_FLT_ROUNDS
    333  1.1  kleink 				/* round correctly FLT_ROUNDS = 2 or 3 */
    334  1.1  kleink 				if (sign) {
    335  1.1  kleink 					rv = -rv;
    336  1.1  kleink 					sign = 0;
    337  1.1  kleink 					}
    338  1.1  kleink #endif
    339  1.1  kleink 				e -= i;
    340  1.1  kleink 				dval(rv) *= tens[i];
    341  1.1  kleink #ifdef VAX
    342  1.1  kleink 				/* VAX exponent range is so narrow we must
    343  1.1  kleink 				 * worry about overflow here...
    344  1.1  kleink 				 */
    345  1.1  kleink  vax_ovfl_check:
    346  1.1  kleink 				word0(rv) -= P*Exp_msk1;
    347  1.1  kleink 				/* rv = */ rounded_product(dval(rv), tens[e]);
    348  1.1  kleink 				if ((word0(rv) & Exp_mask)
    349  1.1  kleink 				 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
    350  1.1  kleink 					goto ovfl;
    351  1.1  kleink 				word0(rv) += P*Exp_msk1;
    352  1.1  kleink #else
    353  1.1  kleink 				/* rv = */ rounded_product(dval(rv), tens[e]);
    354  1.1  kleink #endif
    355  1.1  kleink 				goto ret;
    356  1.1  kleink 				}
    357  1.1  kleink 			}
    358  1.1  kleink #ifndef Inaccurate_Divide
    359  1.1  kleink 		else if (e >= -Ten_pmax) {
    360  1.1  kleink #ifdef Honor_FLT_ROUNDS
    361  1.1  kleink 			/* round correctly FLT_ROUNDS = 2 or 3 */
    362  1.1  kleink 			if (sign) {
    363  1.1  kleink 				rv = -rv;
    364  1.1  kleink 				sign = 0;
    365  1.1  kleink 				}
    366  1.1  kleink #endif
    367  1.1  kleink 			/* rv = */ rounded_quotient(dval(rv), tens[-e]);
    368  1.1  kleink 			goto ret;
    369  1.1  kleink 			}
    370  1.1  kleink #endif
    371  1.1  kleink 		}
    372  1.1  kleink 	e1 += nd - k;
    373  1.1  kleink 
    374  1.1  kleink #ifdef IEEE_Arith
    375  1.1  kleink #ifdef SET_INEXACT
    376  1.1  kleink 	inexact = 1;
    377  1.1  kleink 	if (k <= DBL_DIG)
    378  1.1  kleink 		oldinexact = get_inexact();
    379  1.1  kleink #endif
    380  1.1  kleink #ifdef Avoid_Underflow
    381  1.1  kleink 	scale = 0;
    382  1.1  kleink #endif
    383  1.1  kleink #ifdef Honor_FLT_ROUNDS
    384  1.1  kleink 	if ((rounding = Flt_Rounds) >= 2) {
    385  1.1  kleink 		if (sign)
    386  1.1  kleink 			rounding = rounding == 2 ? 0 : 2;
    387  1.1  kleink 		else
    388  1.1  kleink 			if (rounding != 2)
    389  1.1  kleink 				rounding = 0;
    390  1.1  kleink 		}
    391  1.1  kleink #endif
    392  1.1  kleink #endif /*IEEE_Arith*/
    393  1.1  kleink 
    394  1.1  kleink 	/* Get starting approximation = rv * 10**e1 */
    395  1.1  kleink 
    396  1.1  kleink 	if (e1 > 0) {
    397  1.1  kleink 		if ( (i = e1 & 15) !=0)
    398  1.1  kleink 			dval(rv) *= tens[i];
    399  1.1  kleink 		if (e1 &= ~15) {
    400  1.1  kleink 			if (e1 > DBL_MAX_10_EXP) {
    401  1.1  kleink  ovfl:
    402  1.1  kleink #ifndef NO_ERRNO
    403  1.1  kleink 				errno = ERANGE;
    404  1.1  kleink #endif
    405  1.1  kleink 				/* Can't trust HUGE_VAL */
    406  1.1  kleink #ifdef IEEE_Arith
    407  1.1  kleink #ifdef Honor_FLT_ROUNDS
    408  1.1  kleink 				switch(rounding) {
    409  1.1  kleink 				  case 0: /* toward 0 */
    410  1.1  kleink 				  case 3: /* toward -infinity */
    411  1.1  kleink 					word0(rv) = Big0;
    412  1.1  kleink 					word1(rv) = Big1;
    413  1.1  kleink 					break;
    414  1.1  kleink 				  default:
    415  1.1  kleink 					word0(rv) = Exp_mask;
    416  1.1  kleink 					word1(rv) = 0;
    417  1.1  kleink 				  }
    418  1.1  kleink #else /*Honor_FLT_ROUNDS*/
    419  1.1  kleink 				word0(rv) = Exp_mask;
    420  1.1  kleink 				word1(rv) = 0;
    421  1.1  kleink #endif /*Honor_FLT_ROUNDS*/
    422  1.1  kleink #ifdef SET_INEXACT
    423  1.1  kleink 				/* set overflow bit */
    424  1.1  kleink 				dval(rv0) = 1e300;
    425  1.1  kleink 				dval(rv0) *= dval(rv0);
    426  1.1  kleink #endif
    427  1.1  kleink #else /*IEEE_Arith*/
    428  1.1  kleink 				word0(rv) = Big0;
    429  1.1  kleink 				word1(rv) = Big1;
    430  1.1  kleink #endif /*IEEE_Arith*/
    431  1.1  kleink 				if (bd0)
    432  1.1  kleink 					goto retfree;
    433  1.1  kleink 				goto ret;
    434  1.1  kleink 				}
    435  1.1  kleink 			e1 >>= 4;
    436  1.1  kleink 			for(j = 0; e1 > 1; j++, e1 >>= 1)
    437  1.1  kleink 				if (e1 & 1)
    438  1.1  kleink 					dval(rv) *= bigtens[j];
    439  1.1  kleink 		/* The last multiplication could overflow. */
    440  1.1  kleink 			word0(rv) -= P*Exp_msk1;
    441  1.1  kleink 			dval(rv) *= bigtens[j];
    442  1.1  kleink 			if ((z = word0(rv) & Exp_mask)
    443  1.1  kleink 			 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
    444  1.1  kleink 				goto ovfl;
    445  1.1  kleink 			if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
    446  1.1  kleink 				/* set to largest number */
    447  1.1  kleink 				/* (Can't trust DBL_MAX) */
    448  1.1  kleink 				word0(rv) = Big0;
    449  1.1  kleink 				word1(rv) = Big1;
    450  1.1  kleink 				}
    451  1.1  kleink 			else
    452  1.1  kleink 				word0(rv) += P*Exp_msk1;
    453  1.1  kleink 			}
    454  1.1  kleink 		}
    455  1.1  kleink 	else if (e1 < 0) {
    456  1.1  kleink 		e1 = -e1;
    457  1.1  kleink 		if ( (i = e1 & 15) !=0)
    458  1.1  kleink 			dval(rv) /= tens[i];
    459  1.1  kleink 		if (e1 >>= 4) {
    460  1.1  kleink 			if (e1 >= 1 << n_bigtens)
    461  1.1  kleink 				goto undfl;
    462  1.1  kleink #ifdef Avoid_Underflow
    463  1.1  kleink 			if (e1 & Scale_Bit)
    464  1.1  kleink 				scale = 2*P;
    465  1.1  kleink 			for(j = 0; e1 > 0; j++, e1 >>= 1)
    466  1.1  kleink 				if (e1 & 1)
    467  1.1  kleink 					dval(rv) *= tinytens[j];
    468  1.1  kleink 			if (scale && (j = 2*P + 1 - ((word0(rv) & Exp_mask)
    469  1.1  kleink 						>> Exp_shift)) > 0) {
    470  1.1  kleink 				/* scaled rv is denormal; zap j low bits */
    471  1.1  kleink 				if (j >= 32) {
    472  1.1  kleink 					word1(rv) = 0;
    473  1.1  kleink 					if (j >= 53)
    474  1.1  kleink 					 word0(rv) = (P+2)*Exp_msk1;
    475  1.1  kleink 					else
    476  1.1  kleink 					 word0(rv) &= 0xffffffff << j-32;
    477  1.1  kleink 					}
    478  1.1  kleink 				else
    479  1.1  kleink 					word1(rv) &= 0xffffffff << j;
    480  1.1  kleink 				}
    481  1.1  kleink #else
    482  1.1  kleink 			for(j = 0; e1 > 1; j++, e1 >>= 1)
    483  1.1  kleink 				if (e1 & 1)
    484  1.1  kleink 					dval(rv) *= tinytens[j];
    485  1.1  kleink 			/* The last multiplication could underflow. */
    486  1.1  kleink 			dval(rv0) = dval(rv);
    487  1.1  kleink 			dval(rv) *= tinytens[j];
    488  1.1  kleink 			if (!dval(rv)) {
    489  1.1  kleink 				dval(rv) = 2.*dval(rv0);
    490  1.1  kleink 				dval(rv) *= tinytens[j];
    491  1.1  kleink #endif
    492  1.1  kleink 				if (!dval(rv)) {
    493  1.1  kleink  undfl:
    494  1.1  kleink 					dval(rv) = 0.;
    495  1.1  kleink #ifndef NO_ERRNO
    496  1.1  kleink 					errno = ERANGE;
    497  1.1  kleink #endif
    498  1.1  kleink 					if (bd0)
    499  1.1  kleink 						goto retfree;
    500  1.1  kleink 					goto ret;
    501  1.1  kleink 					}
    502  1.1  kleink #ifndef Avoid_Underflow
    503  1.1  kleink 				word0(rv) = Tiny0;
    504  1.1  kleink 				word1(rv) = Tiny1;
    505  1.1  kleink 				/* The refinement below will clean
    506  1.1  kleink 				 * this approximation up.
    507  1.1  kleink 				 */
    508  1.1  kleink 				}
    509  1.1  kleink #endif
    510  1.1  kleink 			}
    511  1.1  kleink 		}
    512  1.1  kleink 
    513  1.1  kleink 	/* Now the hard part -- adjusting rv to the correct value.*/
    514  1.1  kleink 
    515  1.1  kleink 	/* Put digits into bd: true value = bd * 10^e */
    516  1.1  kleink 
    517  1.1  kleink 	bd0 = s2b(s0, nd0, nd, y);
    518  1.1  kleink 
    519  1.1  kleink 	for(;;) {
    520  1.1  kleink 		bd = Balloc(bd0->k);
    521  1.1  kleink 		Bcopy(bd, bd0);
    522  1.1  kleink 		bb = d2b(dval(rv), &bbe, &bbbits);	/* rv = bb * 2^bbe */
    523  1.1  kleink 		bs = i2b(1);
    524  1.1  kleink 
    525  1.1  kleink 		if (e >= 0) {
    526  1.1  kleink 			bb2 = bb5 = 0;
    527  1.1  kleink 			bd2 = bd5 = e;
    528  1.1  kleink 			}
    529  1.1  kleink 		else {
    530  1.1  kleink 			bb2 = bb5 = -e;
    531  1.1  kleink 			bd2 = bd5 = 0;
    532  1.1  kleink 			}
    533  1.1  kleink 		if (bbe >= 0)
    534  1.1  kleink 			bb2 += bbe;
    535  1.1  kleink 		else
    536  1.1  kleink 			bd2 -= bbe;
    537  1.1  kleink 		bs2 = bb2;
    538  1.1  kleink #ifdef Honor_FLT_ROUNDS
    539  1.1  kleink 		if (rounding != 1)
    540  1.1  kleink 			bs2++;
    541  1.1  kleink #endif
    542  1.1  kleink #ifdef Avoid_Underflow
    543  1.1  kleink 		j = bbe - scale;
    544  1.1  kleink 		i = j + bbbits - 1;	/* logb(rv) */
    545  1.1  kleink 		if (i < Emin)	/* denormal */
    546  1.1  kleink 			j += P - Emin;
    547  1.1  kleink 		else
    548  1.1  kleink 			j = P + 1 - bbbits;
    549  1.1  kleink #else /*Avoid_Underflow*/
    550  1.1  kleink #ifdef Sudden_Underflow
    551  1.1  kleink #ifdef IBM
    552  1.1  kleink 		j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
    553  1.1  kleink #else
    554  1.1  kleink 		j = P + 1 - bbbits;
    555  1.1  kleink #endif
    556  1.1  kleink #else /*Sudden_Underflow*/
    557  1.1  kleink 		j = bbe;
    558  1.1  kleink 		i = j + bbbits - 1;	/* logb(rv) */
    559  1.1  kleink 		if (i < Emin)	/* denormal */
    560  1.1  kleink 			j += P - Emin;
    561  1.1  kleink 		else
    562  1.1  kleink 			j = P + 1 - bbbits;
    563  1.1  kleink #endif /*Sudden_Underflow*/
    564  1.1  kleink #endif /*Avoid_Underflow*/
    565  1.1  kleink 		bb2 += j;
    566  1.1  kleink 		bd2 += j;
    567  1.1  kleink #ifdef Avoid_Underflow
    568  1.1  kleink 		bd2 += scale;
    569  1.1  kleink #endif
    570  1.1  kleink 		i = bb2 < bd2 ? bb2 : bd2;
    571  1.1  kleink 		if (i > bs2)
    572  1.1  kleink 			i = bs2;
    573  1.1  kleink 		if (i > 0) {
    574  1.1  kleink 			bb2 -= i;
    575  1.1  kleink 			bd2 -= i;
    576  1.1  kleink 			bs2 -= i;
    577  1.1  kleink 			}
    578  1.1  kleink 		if (bb5 > 0) {
    579  1.1  kleink 			bs = pow5mult(bs, bb5);
    580  1.1  kleink 			bb1 = mult(bs, bb);
    581  1.1  kleink 			Bfree(bb);
    582  1.1  kleink 			bb = bb1;
    583  1.1  kleink 			}
    584  1.1  kleink 		if (bb2 > 0)
    585  1.1  kleink 			bb = lshift(bb, bb2);
    586  1.1  kleink 		if (bd5 > 0)
    587  1.1  kleink 			bd = pow5mult(bd, bd5);
    588  1.1  kleink 		if (bd2 > 0)
    589  1.1  kleink 			bd = lshift(bd, bd2);
    590  1.1  kleink 		if (bs2 > 0)
    591  1.1  kleink 			bs = lshift(bs, bs2);
    592  1.1  kleink 		delta = diff(bb, bd);
    593  1.1  kleink 		dsign = delta->sign;
    594  1.1  kleink 		delta->sign = 0;
    595  1.1  kleink 		i = cmp(delta, bs);
    596  1.1  kleink #ifdef Honor_FLT_ROUNDS
    597  1.1  kleink 		if (rounding != 1) {
    598  1.1  kleink 			if (i < 0) {
    599  1.1  kleink 				/* Error is less than an ulp */
    600  1.1  kleink 				if (!delta->x[0] && delta->wds <= 1) {
    601  1.1  kleink 					/* exact */
    602  1.1  kleink #ifdef SET_INEXACT
    603  1.1  kleink 					inexact = 0;
    604  1.1  kleink #endif
    605  1.1  kleink 					break;
    606  1.1  kleink 					}
    607  1.1  kleink 				if (rounding) {
    608  1.1  kleink 					if (dsign) {
    609  1.1  kleink 						adj = 1.;
    610  1.1  kleink 						goto apply_adj;
    611  1.1  kleink 						}
    612  1.1  kleink 					}
    613  1.1  kleink 				else if (!dsign) {
    614  1.1  kleink 					adj = -1.;
    615  1.1  kleink 					if (!word1(rv)
    616  1.1  kleink 					 && !(word0(rv) & Frac_mask)) {
    617  1.1  kleink 						y = word0(rv) & Exp_mask;
    618  1.1  kleink #ifdef Avoid_Underflow
    619  1.1  kleink 						if (!scale || y > 2*P*Exp_msk1)
    620  1.1  kleink #else
    621  1.1  kleink 						if (y)
    622  1.1  kleink #endif
    623  1.1  kleink 						  {
    624  1.1  kleink 						  delta = lshift(delta,Log2P);
    625  1.1  kleink 						  if (cmp(delta, bs) <= 0)
    626  1.1  kleink 							adj = -0.5;
    627  1.1  kleink 						  }
    628  1.1  kleink 						}
    629  1.1  kleink  apply_adj:
    630  1.1  kleink #ifdef Avoid_Underflow
    631  1.1  kleink 					if (scale && (y = word0(rv) & Exp_mask)
    632  1.1  kleink 						<= 2*P*Exp_msk1)
    633  1.1  kleink 					  word0(adj) += (2*P+1)*Exp_msk1 - y;
    634  1.1  kleink #else
    635  1.1  kleink #ifdef Sudden_Underflow
    636  1.1  kleink 					if ((word0(rv) & Exp_mask) <=
    637  1.1  kleink 							P*Exp_msk1) {
    638  1.1  kleink 						word0(rv) += P*Exp_msk1;
    639  1.1  kleink 						dval(rv) += adj*ulp(dval(rv));
    640  1.1  kleink 						word0(rv) -= P*Exp_msk1;
    641  1.1  kleink 						}
    642  1.1  kleink 					else
    643  1.1  kleink #endif /*Sudden_Underflow*/
    644  1.1  kleink #endif /*Avoid_Underflow*/
    645  1.1  kleink 					dval(rv) += adj*ulp(dval(rv));
    646  1.1  kleink 					}
    647  1.1  kleink 				break;
    648  1.1  kleink 				}
    649  1.1  kleink 			adj = ratio(delta, bs);
    650  1.1  kleink 			if (adj < 1.)
    651  1.1  kleink 				adj = 1.;
    652  1.1  kleink 			if (adj <= 0x7ffffffe) {
    653  1.1  kleink 				/* adj = rounding ? ceil(adj) : floor(adj); */
    654  1.1  kleink 				y = adj;
    655  1.1  kleink 				if (y != adj) {
    656  1.1  kleink 					if (!((rounding>>1) ^ dsign))
    657  1.1  kleink 						y++;
    658  1.1  kleink 					adj = y;
    659  1.1  kleink 					}
    660  1.1  kleink 				}
    661  1.1  kleink #ifdef Avoid_Underflow
    662  1.1  kleink 			if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
    663  1.1  kleink 				word0(adj) += (2*P+1)*Exp_msk1 - y;
    664  1.1  kleink #else
    665  1.1  kleink #ifdef Sudden_Underflow
    666  1.1  kleink 			if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
    667  1.1  kleink 				word0(rv) += P*Exp_msk1;
    668  1.1  kleink 				adj *= ulp(dval(rv));
    669  1.1  kleink 				if (dsign)
    670  1.1  kleink 					dval(rv) += adj;
    671  1.1  kleink 				else
    672  1.1  kleink 					dval(rv) -= adj;
    673  1.1  kleink 				word0(rv) -= P*Exp_msk1;
    674  1.1  kleink 				goto cont;
    675  1.1  kleink 				}
    676  1.1  kleink #endif /*Sudden_Underflow*/
    677  1.1  kleink #endif /*Avoid_Underflow*/
    678  1.1  kleink 			adj *= ulp(dval(rv));
    679  1.1  kleink 			if (dsign)
    680  1.1  kleink 				dval(rv) += adj;
    681  1.1  kleink 			else
    682  1.1  kleink 				dval(rv) -= adj;
    683  1.1  kleink 			goto cont;
    684  1.1  kleink 			}
    685  1.1  kleink #endif /*Honor_FLT_ROUNDS*/
    686  1.1  kleink 
    687  1.1  kleink 		if (i < 0) {
    688  1.1  kleink 			/* Error is less than half an ulp -- check for
    689  1.1  kleink 			 * special case of mantissa a power of two.
    690  1.1  kleink 			 */
    691  1.1  kleink 			if (dsign || word1(rv) || word0(rv) & Bndry_mask
    692  1.1  kleink #ifdef IEEE_Arith
    693  1.1  kleink #ifdef Avoid_Underflow
    694  1.1  kleink 			 || (word0(rv) & Exp_mask) <= (2*P+1)*Exp_msk1
    695  1.1  kleink #else
    696  1.1  kleink 			 || (word0(rv) & Exp_mask) <= Exp_msk1
    697  1.1  kleink #endif
    698  1.1  kleink #endif
    699  1.1  kleink 				) {
    700  1.1  kleink #ifdef SET_INEXACT
    701  1.1  kleink 				if (!delta->x[0] && delta->wds <= 1)
    702  1.1  kleink 					inexact = 0;
    703  1.1  kleink #endif
    704  1.1  kleink 				break;
    705  1.1  kleink 				}
    706  1.1  kleink 			if (!delta->x[0] && delta->wds <= 1) {
    707  1.1  kleink 				/* exact result */
    708  1.1  kleink #ifdef SET_INEXACT
    709  1.1  kleink 				inexact = 0;
    710  1.1  kleink #endif
    711  1.1  kleink 				break;
    712  1.1  kleink 				}
    713  1.1  kleink 			delta = lshift(delta,Log2P);
    714  1.1  kleink 			if (cmp(delta, bs) > 0)
    715  1.1  kleink 				goto drop_down;
    716  1.1  kleink 			break;
    717  1.1  kleink 			}
    718  1.1  kleink 		if (i == 0) {
    719  1.1  kleink 			/* exactly half-way between */
    720  1.1  kleink 			if (dsign) {
    721  1.1  kleink 				if ((word0(rv) & Bndry_mask1) == Bndry_mask1
    722  1.1  kleink 				 &&  word1(rv) == (
    723  1.1  kleink #ifdef Avoid_Underflow
    724  1.1  kleink 			(scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
    725  1.1  kleink 		? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
    726  1.1  kleink #endif
    727  1.1  kleink 						   0xffffffff)) {
    728  1.1  kleink 					/*boundary case -- increment exponent*/
    729  1.1  kleink 					word0(rv) = (word0(rv) & Exp_mask)
    730  1.1  kleink 						+ Exp_msk1
    731  1.1  kleink #ifdef IBM
    732  1.1  kleink 						| Exp_msk1 >> 4
    733  1.1  kleink #endif
    734  1.1  kleink 						;
    735  1.1  kleink 					word1(rv) = 0;
    736  1.1  kleink #ifdef Avoid_Underflow
    737  1.1  kleink 					dsign = 0;
    738  1.1  kleink #endif
    739  1.1  kleink 					break;
    740  1.1  kleink 					}
    741  1.1  kleink 				}
    742  1.1  kleink 			else if (!(word0(rv) & Bndry_mask) && !word1(rv)) {
    743  1.1  kleink  drop_down:
    744  1.1  kleink 				/* boundary case -- decrement exponent */
    745  1.1  kleink #ifdef Sudden_Underflow /*{{*/
    746  1.1  kleink 				L = word0(rv) & Exp_mask;
    747  1.1  kleink #ifdef IBM
    748  1.1  kleink 				if (L <  Exp_msk1)
    749  1.1  kleink #else
    750  1.1  kleink #ifdef Avoid_Underflow
    751  1.1  kleink 				if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
    752  1.1  kleink #else
    753  1.1  kleink 				if (L <= Exp_msk1)
    754  1.1  kleink #endif /*Avoid_Underflow*/
    755  1.1  kleink #endif /*IBM*/
    756  1.1  kleink 					goto undfl;
    757  1.1  kleink 				L -= Exp_msk1;
    758  1.1  kleink #else /*Sudden_Underflow}{*/
    759  1.1  kleink #ifdef Avoid_Underflow
    760  1.1  kleink 				if (scale) {
    761  1.1  kleink 					L = word0(rv) & Exp_mask;
    762  1.1  kleink 					if (L <= (2*P+1)*Exp_msk1) {
    763  1.1  kleink 						if (L > (P+2)*Exp_msk1)
    764  1.1  kleink 							/* round even ==> */
    765  1.1  kleink 							/* accept rv */
    766  1.1  kleink 							break;
    767  1.1  kleink 						/* rv = smallest denormal */
    768  1.1  kleink 						goto undfl;
    769  1.1  kleink 						}
    770  1.1  kleink 					}
    771  1.1  kleink #endif /*Avoid_Underflow*/
    772  1.1  kleink 				L = (word0(rv) & Exp_mask) - Exp_msk1;
    773  1.1  kleink #endif /*Sudden_Underflow}*/
    774  1.1  kleink 				word0(rv) = L | Bndry_mask1;
    775  1.1  kleink 				word1(rv) = 0xffffffff;
    776  1.1  kleink #ifdef IBM
    777  1.1  kleink 				goto cont;
    778  1.1  kleink #else
    779  1.1  kleink 				break;
    780  1.1  kleink #endif
    781  1.1  kleink 				}
    782  1.1  kleink #ifndef ROUND_BIASED
    783  1.1  kleink 			if (!(word1(rv) & LSB))
    784  1.1  kleink 				break;
    785  1.1  kleink #endif
    786  1.1  kleink 			if (dsign)
    787  1.1  kleink 				dval(rv) += ulp(dval(rv));
    788  1.1  kleink #ifndef ROUND_BIASED
    789  1.1  kleink 			else {
    790  1.1  kleink 				dval(rv) -= ulp(dval(rv));
    791  1.1  kleink #ifndef Sudden_Underflow
    792  1.1  kleink 				if (!dval(rv))
    793  1.1  kleink 					goto undfl;
    794  1.1  kleink #endif
    795  1.1  kleink 				}
    796  1.1  kleink #ifdef Avoid_Underflow
    797  1.1  kleink 			dsign = 1 - dsign;
    798  1.1  kleink #endif
    799  1.1  kleink #endif
    800  1.1  kleink 			break;
    801  1.1  kleink 			}
    802  1.1  kleink 		if ((aadj = ratio(delta, bs)) <= 2.) {
    803  1.1  kleink 			if (dsign)
    804  1.1  kleink 				aadj = aadj1 = 1.;
    805  1.1  kleink 			else if (word1(rv) || word0(rv) & Bndry_mask) {
    806  1.1  kleink #ifndef Sudden_Underflow
    807  1.1  kleink 				if (word1(rv) == Tiny1 && !word0(rv))
    808  1.1  kleink 					goto undfl;
    809  1.1  kleink #endif
    810  1.1  kleink 				aadj = 1.;
    811  1.1  kleink 				aadj1 = -1.;
    812  1.1  kleink 				}
    813  1.1  kleink 			else {
    814  1.1  kleink 				/* special case -- power of FLT_RADIX to be */
    815  1.1  kleink 				/* rounded down... */
    816  1.1  kleink 
    817  1.1  kleink 				if (aadj < 2./FLT_RADIX)
    818  1.1  kleink 					aadj = 1./FLT_RADIX;
    819  1.1  kleink 				else
    820  1.1  kleink 					aadj *= 0.5;
    821  1.1  kleink 				aadj1 = -aadj;
    822  1.1  kleink 				}
    823  1.1  kleink 			}
    824  1.1  kleink 		else {
    825  1.1  kleink 			aadj *= 0.5;
    826  1.1  kleink 			aadj1 = dsign ? aadj : -aadj;
    827  1.1  kleink #ifdef Check_FLT_ROUNDS
    828  1.1  kleink 			switch(Rounding) {
    829  1.1  kleink 				case 2: /* towards +infinity */
    830  1.1  kleink 					aadj1 -= 0.5;
    831  1.1  kleink 					break;
    832  1.1  kleink 				case 0: /* towards 0 */
    833  1.1  kleink 				case 3: /* towards -infinity */
    834  1.1  kleink 					aadj1 += 0.5;
    835  1.1  kleink 				}
    836  1.1  kleink #else
    837  1.1  kleink 			if (Flt_Rounds == 0)
    838  1.1  kleink 				aadj1 += 0.5;
    839  1.1  kleink #endif /*Check_FLT_ROUNDS*/
    840  1.1  kleink 			}
    841  1.1  kleink 		y = word0(rv) & Exp_mask;
    842  1.1  kleink 
    843  1.1  kleink 		/* Check for overflow */
    844  1.1  kleink 
    845  1.1  kleink 		if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
    846  1.1  kleink 			dval(rv0) = dval(rv);
    847  1.1  kleink 			word0(rv) -= P*Exp_msk1;
    848  1.1  kleink 			adj = aadj1 * ulp(dval(rv));
    849  1.1  kleink 			dval(rv) += adj;
    850  1.1  kleink 			if ((word0(rv) & Exp_mask) >=
    851  1.1  kleink 					Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
    852  1.1  kleink 				if (word0(rv0) == Big0 && word1(rv0) == Big1)
    853  1.1  kleink 					goto ovfl;
    854  1.1  kleink 				word0(rv) = Big0;
    855  1.1  kleink 				word1(rv) = Big1;
    856  1.1  kleink 				goto cont;
    857  1.1  kleink 				}
    858  1.1  kleink 			else
    859  1.1  kleink 				word0(rv) += P*Exp_msk1;
    860  1.1  kleink 			}
    861  1.1  kleink 		else {
    862  1.1  kleink #ifdef Avoid_Underflow
    863  1.1  kleink 			if (scale && y <= 2*P*Exp_msk1) {
    864  1.1  kleink 				if (aadj <= 0x7fffffff) {
    865  1.1  kleink 					if ((z = aadj) <= 0)
    866  1.1  kleink 						z = 1;
    867  1.1  kleink 					aadj = z;
    868  1.1  kleink 					aadj1 = dsign ? aadj : -aadj;
    869  1.1  kleink 					}
    870  1.1  kleink 				word0(aadj1) += (2*P+1)*Exp_msk1 - y;
    871  1.1  kleink 				}
    872  1.1  kleink 			adj = aadj1 * ulp(dval(rv));
    873  1.1  kleink 			dval(rv) += adj;
    874  1.1  kleink #else
    875  1.1  kleink #ifdef Sudden_Underflow
    876  1.1  kleink 			if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
    877  1.1  kleink 				dval(rv0) = dval(rv);
    878  1.1  kleink 				word0(rv) += P*Exp_msk1;
    879  1.1  kleink 				adj = aadj1 * ulp(dval(rv));
    880  1.1  kleink 				dval(rv) += adj;
    881  1.1  kleink #ifdef IBM
    882  1.1  kleink 				if ((word0(rv) & Exp_mask) <  P*Exp_msk1)
    883  1.1  kleink #else
    884  1.1  kleink 				if ((word0(rv) & Exp_mask) <= P*Exp_msk1)
    885  1.1  kleink #endif
    886  1.1  kleink 					{
    887  1.1  kleink 					if (word0(rv0) == Tiny0
    888  1.1  kleink 					 && word1(rv0) == Tiny1)
    889  1.1  kleink 						goto undfl;
    890  1.1  kleink 					word0(rv) = Tiny0;
    891  1.1  kleink 					word1(rv) = Tiny1;
    892  1.1  kleink 					goto cont;
    893  1.1  kleink 					}
    894  1.1  kleink 				else
    895  1.1  kleink 					word0(rv) -= P*Exp_msk1;
    896  1.1  kleink 				}
    897  1.1  kleink 			else {
    898  1.1  kleink 				adj = aadj1 * ulp(dval(rv));
    899  1.1  kleink 				dval(rv) += adj;
    900  1.1  kleink 				}
    901  1.1  kleink #else /*Sudden_Underflow*/
    902  1.1  kleink 			/* Compute adj so that the IEEE rounding rules will
    903  1.1  kleink 			 * correctly round rv + adj in some half-way cases.
    904  1.1  kleink 			 * If rv * ulp(rv) is denormalized (i.e.,
    905  1.1  kleink 			 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
    906  1.1  kleink 			 * trouble from bits lost to denormalization;
    907  1.1  kleink 			 * example: 1.2e-307 .
    908  1.1  kleink 			 */
    909  1.1  kleink 			if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
    910  1.1  kleink 				aadj1 = (double)(int)(aadj + 0.5);
    911  1.1  kleink 				if (!dsign)
    912  1.1  kleink 					aadj1 = -aadj1;
    913  1.1  kleink 				}
    914  1.1  kleink 			adj = aadj1 * ulp(dval(rv));
    915  1.1  kleink 			dval(rv) += adj;
    916  1.1  kleink #endif /*Sudden_Underflow*/
    917  1.1  kleink #endif /*Avoid_Underflow*/
    918  1.1  kleink 			}
    919  1.1  kleink 		z = word0(rv) & Exp_mask;
    920  1.1  kleink #ifndef SET_INEXACT
    921  1.1  kleink #ifdef Avoid_Underflow
    922  1.1  kleink 		if (!scale)
    923  1.1  kleink #endif
    924  1.1  kleink 		if (y == z) {
    925  1.1  kleink 			/* Can we stop now? */
    926  1.1  kleink 			L = (Long)aadj;
    927  1.1  kleink 			aadj -= L;
    928  1.1  kleink 			/* The tolerances below are conservative. */
    929  1.1  kleink 			if (dsign || word1(rv) || word0(rv) & Bndry_mask) {
    930  1.1  kleink 				if (aadj < .4999999 || aadj > .5000001)
    931  1.1  kleink 					break;
    932  1.1  kleink 				}
    933  1.1  kleink 			else if (aadj < .4999999/FLT_RADIX)
    934  1.1  kleink 				break;
    935  1.1  kleink 			}
    936  1.1  kleink #endif
    937  1.1  kleink  cont:
    938  1.1  kleink 		Bfree(bb);
    939  1.1  kleink 		Bfree(bd);
    940  1.1  kleink 		Bfree(bs);
    941  1.1  kleink 		Bfree(delta);
    942  1.1  kleink 		}
    943  1.1  kleink #ifdef SET_INEXACT
    944  1.1  kleink 	if (inexact) {
    945  1.1  kleink 		if (!oldinexact) {
    946  1.1  kleink 			word0(rv0) = Exp_1 + (70 << Exp_shift);
    947  1.1  kleink 			word1(rv0) = 0;
    948  1.1  kleink 			dval(rv0) += 1.;
    949  1.1  kleink 			}
    950  1.1  kleink 		}
    951  1.1  kleink 	else if (!oldinexact)
    952  1.1  kleink 		clear_inexact();
    953  1.1  kleink #endif
    954  1.1  kleink #ifdef Avoid_Underflow
    955  1.1  kleink 	if (scale) {
    956  1.1  kleink 		word0(rv0) = Exp_1 - 2*P*Exp_msk1;
    957  1.1  kleink 		word1(rv0) = 0;
    958  1.1  kleink 		dval(rv) *= dval(rv0);
    959  1.1  kleink #ifndef NO_ERRNO
    960  1.1  kleink 		/* try to avoid the bug of testing an 8087 register value */
    961  1.1  kleink 		if (word0(rv) == 0 && word1(rv) == 0)
    962  1.1  kleink 			errno = ERANGE;
    963  1.1  kleink #endif
    964  1.1  kleink 		}
    965  1.1  kleink #endif /* Avoid_Underflow */
    966  1.1  kleink #ifdef SET_INEXACT
    967  1.1  kleink 	if (inexact && !(word0(rv) & Exp_mask)) {
    968  1.1  kleink 		/* set underflow bit */
    969  1.1  kleink 		dval(rv0) = 1e-300;
    970  1.1  kleink 		dval(rv0) *= dval(rv0);
    971  1.1  kleink 		}
    972  1.1  kleink #endif
    973  1.1  kleink  retfree:
    974  1.1  kleink 	Bfree(bb);
    975  1.1  kleink 	Bfree(bd);
    976  1.1  kleink 	Bfree(bs);
    977  1.1  kleink 	Bfree(bd0);
    978  1.1  kleink 	Bfree(delta);
    979  1.1  kleink  ret:
    980  1.1  kleink 	if (se)
    981  1.1  kleink 		*se = (char *)s;
    982  1.1  kleink 	return sign ? -dval(rv) : dval(rv);
    983  1.1  kleink 	}
    984  1.1  kleink 
    985