Home | History | Annotate | Line # | Download | only in gdtoa
strtod.c revision 1.6
      1  1.6  christos /* $NetBSD: strtod.c,v 1.6 2011/03/20 23:15:35 christos 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.6  christos /* The factor of 2^106 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.6  christos 		9007199254740992.*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 #undef Check_FLT_ROUNDS
     57  1.1    kleink #define Check_FLT_ROUNDS
     58  1.1    kleink #else
     59  1.1    kleink #define Rounding Flt_Rounds
     60  1.1    kleink #endif
     61  1.1    kleink 
     62  1.3    kleink #ifndef __HAVE_LONG_DOUBLE
     63  1.3    kleink __strong_alias(_strtold, strtod)
     64  1.3    kleink __weak_alias(strtold, _strtold)
     65  1.3    kleink #endif
     66  1.3    kleink 
     67  1.6  christos #ifdef Avoid_Underflow /*{*/
     68  1.6  christos  static double
     69  1.6  christos sulp
     70  1.6  christos #ifdef KR_headers
     71  1.6  christos 	(x, scale) U *x; int scale;
     72  1.6  christos #else
     73  1.6  christos 	(U *x, int scale)
     74  1.6  christos #endif
     75  1.6  christos {
     76  1.6  christos 	U u;
     77  1.6  christos 	double rv;
     78  1.6  christos 	int i;
     79  1.6  christos 
     80  1.6  christos 	rv = ulp(x);
     81  1.6  christos 	if (!scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)
     82  1.6  christos 		return rv; /* Is there an example where i <= 0 ? */
     83  1.6  christos 	word0(&u) = Exp_1 + (i << Exp_shift);
     84  1.6  christos 	word1(&u) = 0;
     85  1.6  christos 	return rv * u.d;
     86  1.6  christos 	}
     87  1.6  christos #endif /*}*/
     88  1.6  christos 
     89  1.1    kleink  double
     90  1.1    kleink strtod
     91  1.1    kleink #ifdef KR_headers
     92  1.1    kleink 	(s00, se) CONST char *s00; char **se;
     93  1.1    kleink #else
     94  1.1    kleink 	(CONST char *s00, char **se)
     95  1.1    kleink #endif
     96  1.1    kleink {
     97  1.1    kleink #ifdef Avoid_Underflow
     98  1.1    kleink 	int scale;
     99  1.1    kleink #endif
    100  1.1    kleink 	int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign,
    101  1.1    kleink 		 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
    102  1.1    kleink 	CONST char *s, *s0, *s1;
    103  1.6  christos 	double aadj;
    104  1.1    kleink 	Long L;
    105  1.6  christos 	U adj, aadj1, rv, rv0;
    106  1.1    kleink 	ULong y, z;
    107  1.4       mrg 	Bigint *bb = NULL, *bb1, *bd0;
    108  1.2    kleink 	Bigint *bd = NULL, *bs = NULL, *delta = NULL; /* pacify gcc */
    109  1.6  christos #ifdef Avoid_Underflow
    110  1.6  christos 	ULong Lsb, Lsb1;
    111  1.6  christos #endif
    112  1.1    kleink #ifdef SET_INEXACT
    113  1.1    kleink 	int inexact, oldinexact;
    114  1.1    kleink #endif
    115  1.6  christos #ifdef USE_LOCALE /*{{*/
    116  1.6  christos #ifdef NO_LOCALE_CACHE
    117  1.6  christos 	char *decimalpoint = localeconv()->decimal_point;
    118  1.6  christos 	size_t dplen = strlen(decimalpoint);
    119  1.6  christos #else
    120  1.6  christos 	char *decimalpoint;
    121  1.6  christos 	static char *decimalpoint_cache;
    122  1.6  christos 	static int dplen;
    123  1.6  christos 	if (!(s0 = decimalpoint_cache)) {
    124  1.6  christos 		s0 = localeconv()->decimal_point;
    125  1.6  christos 		if ((decimalpoint_cache = MALLOC(strlen(s0) + 1))) {
    126  1.6  christos 			strcpy(decimalpoint_cache, s0);
    127  1.6  christos 			s0 = decimalpoint_cache;
    128  1.6  christos 			}
    129  1.6  christos 		dplen = strlen(s0);
    130  1.6  christos 		}
    131  1.6  christos 	decimalpoint = __UNCONST(s0);
    132  1.6  christos #endif /*NO_LOCALE_CACHE*/
    133  1.6  christos #else  /*USE_LOCALE}{*/
    134  1.6  christos #define dplen 1
    135  1.6  christos #endif /*USE_LOCALE}}*/
    136  1.6  christos 
    137  1.6  christos #ifdef Honor_FLT_ROUNDS /*{*/
    138  1.6  christos 	int Rounding;
    139  1.6  christos #ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
    140  1.6  christos 	Rounding = Flt_Rounds;
    141  1.6  christos #else /*}{*/
    142  1.6  christos 	Rounding = 1;
    143  1.6  christos 	switch(fegetround()) {
    144  1.6  christos 	  case FE_TOWARDZERO:	Rounding = 0; break;
    145  1.6  christos 	  case FE_UPWARD:	Rounding = 2; break;
    146  1.6  christos 	  case FE_DOWNWARD:	Rounding = 3;
    147  1.6  christos 	  }
    148  1.6  christos #endif /*}}*/
    149  1.6  christos #endif /*}*/
    150  1.1    kleink 
    151  1.1    kleink 	sign = nz0 = nz = decpt = 0;
    152  1.6  christos 	dval(&rv) = 0.;
    153  1.1    kleink 	for(s = s00;;s++) switch(*s) {
    154  1.1    kleink 		case '-':
    155  1.1    kleink 			sign = 1;
    156  1.2    kleink 			/* FALLTHROUGH */
    157  1.1    kleink 		case '+':
    158  1.1    kleink 			if (*++s)
    159  1.1    kleink 				goto break2;
    160  1.2    kleink 			/* FALLTHROUGH */
    161  1.1    kleink 		case 0:
    162  1.1    kleink 			goto ret0;
    163  1.1    kleink 		case '\t':
    164  1.1    kleink 		case '\n':
    165  1.1    kleink 		case '\v':
    166  1.1    kleink 		case '\f':
    167  1.1    kleink 		case '\r':
    168  1.1    kleink 		case ' ':
    169  1.1    kleink 			continue;
    170  1.1    kleink 		default:
    171  1.1    kleink 			goto break2;
    172  1.1    kleink 		}
    173  1.1    kleink  break2:
    174  1.1    kleink 	if (*s == '0') {
    175  1.6  christos #ifndef NO_HEX_FP /*{*/
    176  1.1    kleink 		{
    177  1.1    kleink 		static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI };
    178  1.2    kleink 		Long expt;
    179  1.1    kleink 		ULong bits[2];
    180  1.1    kleink 		switch(s[1]) {
    181  1.1    kleink 		  case 'x':
    182  1.1    kleink 		  case 'X':
    183  1.1    kleink 			{
    184  1.6  christos #ifdef Honor_FLT_ROUNDS
    185  1.1    kleink 			FPI fpi1 = fpi;
    186  1.6  christos 			fpi1.rounding = Rounding;
    187  1.1    kleink #else
    188  1.1    kleink #define fpi1 fpi
    189  1.1    kleink #endif
    190  1.2    kleink 			switch((i = gethex(&s, &fpi1, &expt, &bb, sign)) & STRTOG_Retmask) {
    191  1.1    kleink 			  case STRTOG_NoNumber:
    192  1.1    kleink 				s = s00;
    193  1.1    kleink 				sign = 0;
    194  1.2    kleink 				/* FALLTHROUGH */
    195  1.1    kleink 			  case STRTOG_Zero:
    196  1.1    kleink 				break;
    197  1.1    kleink 			  default:
    198  1.1    kleink 				if (bb) {
    199  1.1    kleink 					copybits(bits, fpi.nbits, bb);
    200  1.1    kleink 					Bfree(bb);
    201  1.1    kleink 					}
    202  1.2    kleink 				ULtod((/* LINTED */(U*)&rv)->L, bits, expt, i);
    203  1.1    kleink 			  }}
    204  1.1    kleink 			goto ret;
    205  1.1    kleink 		  }
    206  1.1    kleink 		}
    207  1.6  christos #endif /*}*/
    208  1.1    kleink 		nz0 = 1;
    209  1.1    kleink 		while(*++s == '0') ;
    210  1.1    kleink 		if (!*s)
    211  1.1    kleink 			goto ret;
    212  1.1    kleink 		}
    213  1.1    kleink 	s0 = s;
    214  1.1    kleink 	y = z = 0;
    215  1.1    kleink 	for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
    216  1.1    kleink 		if (nd < 9)
    217  1.1    kleink 			y = 10*y + c - '0';
    218  1.1    kleink 		else if (nd < 16)
    219  1.1    kleink 			z = 10*z + c - '0';
    220  1.1    kleink 	nd0 = nd;
    221  1.1    kleink #ifdef USE_LOCALE
    222  1.6  christos 	if (c == *decimalpoint) {
    223  1.6  christos 		for(i = 1; decimalpoint[i]; ++i)
    224  1.6  christos 			if (s[i] != decimalpoint[i])
    225  1.6  christos 				goto dig_done;
    226  1.6  christos 		s += i;
    227  1.6  christos 		c = *s;
    228  1.1    kleink #else
    229  1.6  christos 	if (c == '.') {
    230  1.6  christos 		c = *++s;
    231  1.1    kleink #endif
    232  1.1    kleink 		decpt = 1;
    233  1.1    kleink 		if (!nd) {
    234  1.1    kleink 			for(; c == '0'; c = *++s)
    235  1.1    kleink 				nz++;
    236  1.1    kleink 			if (c > '0' && c <= '9') {
    237  1.1    kleink 				s0 = s;
    238  1.1    kleink 				nf += nz;
    239  1.1    kleink 				nz = 0;
    240  1.1    kleink 				goto have_dig;
    241  1.1    kleink 				}
    242  1.1    kleink 			goto dig_done;
    243  1.1    kleink 			}
    244  1.1    kleink 		for(; c >= '0' && c <= '9'; c = *++s) {
    245  1.1    kleink  have_dig:
    246  1.1    kleink 			nz++;
    247  1.1    kleink 			if (c -= '0') {
    248  1.1    kleink 				nf += nz;
    249  1.1    kleink 				for(i = 1; i < nz; i++)
    250  1.1    kleink 					if (nd++ < 9)
    251  1.1    kleink 						y *= 10;
    252  1.1    kleink 					else if (nd <= DBL_DIG + 1)
    253  1.1    kleink 						z *= 10;
    254  1.1    kleink 				if (nd++ < 9)
    255  1.1    kleink 					y = 10*y + c;
    256  1.1    kleink 				else if (nd <= DBL_DIG + 1)
    257  1.1    kleink 					z = 10*z + c;
    258  1.1    kleink 				nz = 0;
    259  1.1    kleink 				}
    260  1.1    kleink 			}
    261  1.6  christos 		}/*}*/
    262  1.1    kleink  dig_done:
    263  1.1    kleink 	e = 0;
    264  1.1    kleink 	if (c == 'e' || c == 'E') {
    265  1.1    kleink 		if (!nd && !nz && !nz0) {
    266  1.1    kleink 			goto ret0;
    267  1.1    kleink 			}
    268  1.1    kleink 		s00 = s;
    269  1.1    kleink 		esign = 0;
    270  1.1    kleink 		switch(c = *++s) {
    271  1.1    kleink 			case '-':
    272  1.1    kleink 				esign = 1;
    273  1.2    kleink 				/* FALLTHROUGH */
    274  1.1    kleink 			case '+':
    275  1.1    kleink 				c = *++s;
    276  1.1    kleink 			}
    277  1.1    kleink 		if (c >= '0' && c <= '9') {
    278  1.1    kleink 			while(c == '0')
    279  1.1    kleink 				c = *++s;
    280  1.1    kleink 			if (c > '0' && c <= '9') {
    281  1.1    kleink 				L = c - '0';
    282  1.1    kleink 				s1 = s;
    283  1.1    kleink 				while((c = *++s) >= '0' && c <= '9')
    284  1.1    kleink 					L = 10*L + c - '0';
    285  1.1    kleink 				if (s - s1 > 8 || L > 19999)
    286  1.1    kleink 					/* Avoid confusion from exponents
    287  1.1    kleink 					 * so large that e might overflow.
    288  1.1    kleink 					 */
    289  1.1    kleink 					e = 19999; /* safe for 16 bit ints */
    290  1.1    kleink 				else
    291  1.1    kleink 					e = (int)L;
    292  1.1    kleink 				if (esign)
    293  1.1    kleink 					e = -e;
    294  1.1    kleink 				}
    295  1.1    kleink 			else
    296  1.1    kleink 				e = 0;
    297  1.1    kleink 			}
    298  1.1    kleink 		else
    299  1.1    kleink 			s = s00;
    300  1.1    kleink 		}
    301  1.1    kleink 	if (!nd) {
    302  1.1    kleink 		if (!nz && !nz0) {
    303  1.1    kleink #ifdef INFNAN_CHECK
    304  1.1    kleink 			/* Check for Nan and Infinity */
    305  1.1    kleink 			ULong bits[2];
    306  1.1    kleink 			static FPI fpinan =	/* only 52 explicit bits */
    307  1.1    kleink 				{ 52, 1-1023-53+1, 2046-1023-53+1, 1, SI };
    308  1.1    kleink 			if (!decpt)
    309  1.1    kleink 			 switch(c) {
    310  1.1    kleink 			  case 'i':
    311  1.1    kleink 			  case 'I':
    312  1.1    kleink 				if (match(&s,"nf")) {
    313  1.1    kleink 					--s;
    314  1.1    kleink 					if (!match(&s,"inity"))
    315  1.1    kleink 						++s;
    316  1.6  christos 					word0(&rv) = 0x7ff00000;
    317  1.6  christos 					word1(&rv) = 0;
    318  1.1    kleink 					goto ret;
    319  1.1    kleink 					}
    320  1.1    kleink 				break;
    321  1.1    kleink 			  case 'n':
    322  1.1    kleink 			  case 'N':
    323  1.1    kleink 				if (match(&s, "an")) {
    324  1.1    kleink #ifndef No_Hex_NaN
    325  1.1    kleink 					if (*s == '(' /*)*/
    326  1.1    kleink 					 && hexnan(&s, &fpinan, bits)
    327  1.1    kleink 							== STRTOG_NaNbits) {
    328  1.6  christos 						word0(&rv) = 0x7ff00000 | bits[1];
    329  1.6  christos 						word1(&rv) = bits[0];
    330  1.1    kleink 						}
    331  1.1    kleink 					else {
    332  1.1    kleink #endif
    333  1.6  christos 						word0(&rv) = NAN_WORD0;
    334  1.6  christos 						word1(&rv) = NAN_WORD1;
    335  1.1    kleink #ifndef No_Hex_NaN
    336  1.1    kleink 						}
    337  1.1    kleink #endif
    338  1.1    kleink 					goto ret;
    339  1.1    kleink 					}
    340  1.1    kleink 			  }
    341  1.1    kleink #endif /* INFNAN_CHECK */
    342  1.1    kleink  ret0:
    343  1.1    kleink 			s = s00;
    344  1.1    kleink 			sign = 0;
    345  1.1    kleink 			}
    346  1.1    kleink 		goto ret;
    347  1.1    kleink 		}
    348  1.1    kleink 	e1 = e -= nf;
    349  1.1    kleink 
    350  1.1    kleink 	/* Now we have nd0 digits, starting at s0, followed by a
    351  1.1    kleink 	 * decimal point, followed by nd-nd0 digits.  The number we're
    352  1.1    kleink 	 * after is the integer represented by those digits times
    353  1.1    kleink 	 * 10**e */
    354  1.1    kleink 
    355  1.1    kleink 	if (!nd0)
    356  1.1    kleink 		nd0 = nd;
    357  1.1    kleink 	k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
    358  1.6  christos 	dval(&rv) = y;
    359  1.1    kleink 	if (k > 9) {
    360  1.1    kleink #ifdef SET_INEXACT
    361  1.1    kleink 		if (k > DBL_DIG)
    362  1.1    kleink 			oldinexact = get_inexact();
    363  1.1    kleink #endif
    364  1.6  christos 		dval(&rv) = tens[k - 9] * dval(&rv) + z;
    365  1.1    kleink 		}
    366  1.1    kleink 	bd0 = 0;
    367  1.1    kleink 	if (nd <= DBL_DIG
    368  1.1    kleink #ifndef RND_PRODQUOT
    369  1.1    kleink #ifndef Honor_FLT_ROUNDS
    370  1.1    kleink 		&& Flt_Rounds == 1
    371  1.1    kleink #endif
    372  1.1    kleink #endif
    373  1.1    kleink 			) {
    374  1.1    kleink 		if (!e)
    375  1.1    kleink 			goto ret;
    376  1.6  christos #ifndef ROUND_BIASED_without_Round_Up
    377  1.1    kleink 		if (e > 0) {
    378  1.1    kleink 			if (e <= Ten_pmax) {
    379  1.1    kleink #ifdef VAX
    380  1.1    kleink 				goto vax_ovfl_check;
    381  1.1    kleink #else
    382  1.1    kleink #ifdef Honor_FLT_ROUNDS
    383  1.1    kleink 				/* round correctly FLT_ROUNDS = 2 or 3 */
    384  1.1    kleink 				if (sign) {
    385  1.6  christos 					rv.d = -rv.d;
    386  1.1    kleink 					sign = 0;
    387  1.1    kleink 					}
    388  1.1    kleink #endif
    389  1.6  christos 				/* rv = */ rounded_product(dval(&rv), tens[e]);
    390  1.1    kleink 				goto ret;
    391  1.1    kleink #endif
    392  1.1    kleink 				}
    393  1.1    kleink 			i = DBL_DIG - nd;
    394  1.1    kleink 			if (e <= Ten_pmax + i) {
    395  1.1    kleink 				/* A fancier test would sometimes let us do
    396  1.1    kleink 				 * this for larger i values.
    397  1.1    kleink 				 */
    398  1.1    kleink #ifdef Honor_FLT_ROUNDS
    399  1.1    kleink 				/* round correctly FLT_ROUNDS = 2 or 3 */
    400  1.1    kleink 				if (sign) {
    401  1.6  christos 					rv.d = -rv.d;
    402  1.1    kleink 					sign = 0;
    403  1.1    kleink 					}
    404  1.1    kleink #endif
    405  1.1    kleink 				e -= i;
    406  1.6  christos 				dval(&rv) *= tens[i];
    407  1.1    kleink #ifdef VAX
    408  1.1    kleink 				/* VAX exponent range is so narrow we must
    409  1.1    kleink 				 * worry about overflow here...
    410  1.1    kleink 				 */
    411  1.1    kleink  vax_ovfl_check:
    412  1.6  christos 				word0(&rv) -= P*Exp_msk1;
    413  1.6  christos 				/* rv = */ rounded_product(dval(&rv), tens[e]);
    414  1.6  christos 				if ((word0(&rv) & Exp_mask)
    415  1.1    kleink 				 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
    416  1.1    kleink 					goto ovfl;
    417  1.6  christos 				word0(&rv) += P*Exp_msk1;
    418  1.1    kleink #else
    419  1.6  christos 				/* rv = */ rounded_product(dval(&rv), tens[e]);
    420  1.1    kleink #endif
    421  1.1    kleink 				goto ret;
    422  1.1    kleink 				}
    423  1.1    kleink 			}
    424  1.1    kleink #ifndef Inaccurate_Divide
    425  1.1    kleink 		else if (e >= -Ten_pmax) {
    426  1.1    kleink #ifdef Honor_FLT_ROUNDS
    427  1.1    kleink 			/* round correctly FLT_ROUNDS = 2 or 3 */
    428  1.1    kleink 			if (sign) {
    429  1.6  christos 				rv.d = -rv.d;
    430  1.1    kleink 				sign = 0;
    431  1.1    kleink 				}
    432  1.1    kleink #endif
    433  1.6  christos 			/* rv = */ rounded_quotient(dval(&rv), tens[-e]);
    434  1.1    kleink 			goto ret;
    435  1.1    kleink 			}
    436  1.1    kleink #endif
    437  1.6  christos #endif /* ROUND_BIASED_without_Round_Up */
    438  1.1    kleink 		}
    439  1.1    kleink 	e1 += nd - k;
    440  1.1    kleink 
    441  1.1    kleink #ifdef IEEE_Arith
    442  1.1    kleink #ifdef SET_INEXACT
    443  1.1    kleink 	inexact = 1;
    444  1.1    kleink 	if (k <= DBL_DIG)
    445  1.1    kleink 		oldinexact = get_inexact();
    446  1.1    kleink #endif
    447  1.1    kleink #ifdef Avoid_Underflow
    448  1.1    kleink 	scale = 0;
    449  1.1    kleink #endif
    450  1.1    kleink #ifdef Honor_FLT_ROUNDS
    451  1.6  christos 	if (Rounding >= 2) {
    452  1.1    kleink 		if (sign)
    453  1.6  christos 			Rounding = Rounding == 2 ? 0 : 2;
    454  1.1    kleink 		else
    455  1.6  christos 			if (Rounding != 2)
    456  1.6  christos 				Rounding = 0;
    457  1.1    kleink 		}
    458  1.1    kleink #endif
    459  1.1    kleink #endif /*IEEE_Arith*/
    460  1.1    kleink 
    461  1.1    kleink 	/* Get starting approximation = rv * 10**e1 */
    462  1.1    kleink 
    463  1.1    kleink 	if (e1 > 0) {
    464  1.1    kleink 		if ( (i = e1 & 15) !=0)
    465  1.6  christos 			dval(&rv) *= tens[i];
    466  1.1    kleink 		if (e1 &= ~15) {
    467  1.1    kleink 			if (e1 > DBL_MAX_10_EXP) {
    468  1.1    kleink  ovfl:
    469  1.1    kleink 				/* Can't trust HUGE_VAL */
    470  1.1    kleink #ifdef IEEE_Arith
    471  1.1    kleink #ifdef Honor_FLT_ROUNDS
    472  1.6  christos 				switch(Rounding) {
    473  1.1    kleink 				  case 0: /* toward 0 */
    474  1.1    kleink 				  case 3: /* toward -infinity */
    475  1.6  christos 					word0(&rv) = Big0;
    476  1.6  christos 					word1(&rv) = Big1;
    477  1.1    kleink 					break;
    478  1.1    kleink 				  default:
    479  1.6  christos 					word0(&rv) = Exp_mask;
    480  1.6  christos 					word1(&rv) = 0;
    481  1.1    kleink 				  }
    482  1.1    kleink #else /*Honor_FLT_ROUNDS*/
    483  1.6  christos 				word0(&rv) = Exp_mask;
    484  1.6  christos 				word1(&rv) = 0;
    485  1.1    kleink #endif /*Honor_FLT_ROUNDS*/
    486  1.1    kleink #ifdef SET_INEXACT
    487  1.1    kleink 				/* set overflow bit */
    488  1.6  christos 				dval(&rv0) = 1e300;
    489  1.6  christos 				dval(&rv0) *= dval(&rv0);
    490  1.1    kleink #endif
    491  1.1    kleink #else /*IEEE_Arith*/
    492  1.6  christos 				word0(&rv) = Big0;
    493  1.6  christos 				word1(&rv) = Big1;
    494  1.1    kleink #endif /*IEEE_Arith*/
    495  1.6  christos  range_err:
    496  1.6  christos 				if (bd0) {
    497  1.6  christos 					Bfree(bb);
    498  1.6  christos 					Bfree(bd);
    499  1.6  christos 					Bfree(bs);
    500  1.6  christos 					Bfree(bd0);
    501  1.6  christos 					Bfree(delta);
    502  1.6  christos 					}
    503  1.6  christos #ifndef NO_ERRNO
    504  1.6  christos 				errno = ERANGE;
    505  1.6  christos #endif
    506  1.1    kleink 				goto ret;
    507  1.1    kleink 				}
    508  1.2    kleink 			e1 = (unsigned int)e1 >> 4;
    509  1.2    kleink 			for(j = 0; e1 > 1; j++, e1 = (unsigned int)e1 >> 1)
    510  1.1    kleink 				if (e1 & 1)
    511  1.6  christos 					dval(&rv) *= bigtens[j];
    512  1.1    kleink 		/* The last multiplication could overflow. */
    513  1.6  christos 			word0(&rv) -= P*Exp_msk1;
    514  1.6  christos 			dval(&rv) *= bigtens[j];
    515  1.6  christos 			if ((z = word0(&rv) & Exp_mask)
    516  1.1    kleink 			 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
    517  1.1    kleink 				goto ovfl;
    518  1.1    kleink 			if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
    519  1.1    kleink 				/* set to largest number */
    520  1.1    kleink 				/* (Can't trust DBL_MAX) */
    521  1.6  christos 				word0(&rv) = Big0;
    522  1.6  christos 				word1(&rv) = Big1;
    523  1.1    kleink 				}
    524  1.1    kleink 			else
    525  1.6  christos 				word0(&rv) += P*Exp_msk1;
    526  1.1    kleink 			}
    527  1.1    kleink 		}
    528  1.1    kleink 	else if (e1 < 0) {
    529  1.1    kleink 		e1 = -e1;
    530  1.1    kleink 		if ( (i = e1 & 15) !=0)
    531  1.6  christos 			dval(&rv) /= tens[i];
    532  1.1    kleink 		if (e1 >>= 4) {
    533  1.1    kleink 			if (e1 >= 1 << n_bigtens)
    534  1.1    kleink 				goto undfl;
    535  1.1    kleink #ifdef Avoid_Underflow
    536  1.1    kleink 			if (e1 & Scale_Bit)
    537  1.1    kleink 				scale = 2*P;
    538  1.2    kleink 			for(j = 0; e1 > 0; j++, e1 = (unsigned int)e1 >> 1)
    539  1.1    kleink 				if (e1 & 1)
    540  1.6  christos 					dval(&rv) *= tinytens[j];
    541  1.6  christos 			if (scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
    542  1.1    kleink 						>> Exp_shift)) > 0) {
    543  1.1    kleink 				/* scaled rv is denormal; zap j low bits */
    544  1.1    kleink 				if (j >= 32) {
    545  1.6  christos 					word1(&rv) = 0;
    546  1.1    kleink 					if (j >= 53)
    547  1.6  christos 					 word0(&rv) = (P+2)*Exp_msk1;
    548  1.1    kleink 					else
    549  1.6  christos 					 word0(&rv) &= 0xffffffff << (j-32);
    550  1.1    kleink 					}
    551  1.1    kleink 				else
    552  1.6  christos 					word1(&rv) &= 0xffffffff << j;
    553  1.1    kleink 				}
    554  1.1    kleink #else
    555  1.1    kleink 			for(j = 0; e1 > 1; j++, e1 >>= 1)
    556  1.1    kleink 				if (e1 & 1)
    557  1.6  christos 					dval(&rv) *= tinytens[j];
    558  1.1    kleink 			/* The last multiplication could underflow. */
    559  1.6  christos 			dval(&rv0) = dval(&rv);
    560  1.6  christos 			dval(&rv) *= tinytens[j];
    561  1.6  christos 			if (!dval(&rv)) {
    562  1.6  christos 				dval(&rv) = 2.*dval(&rv0);
    563  1.6  christos 				dval(&rv) *= tinytens[j];
    564  1.1    kleink #endif
    565  1.6  christos 				if (!dval(&rv)) {
    566  1.1    kleink  undfl:
    567  1.6  christos 					dval(&rv) = 0.;
    568  1.6  christos 					goto range_err;
    569  1.1    kleink 					}
    570  1.1    kleink #ifndef Avoid_Underflow
    571  1.6  christos 				word0(&rv) = Tiny0;
    572  1.6  christos 				word1(&rv) = Tiny1;
    573  1.1    kleink 				/* The refinement below will clean
    574  1.1    kleink 				 * this approximation up.
    575  1.1    kleink 				 */
    576  1.1    kleink 				}
    577  1.1    kleink #endif
    578  1.1    kleink 			}
    579  1.1    kleink 		}
    580  1.1    kleink 
    581  1.1    kleink 	/* Now the hard part -- adjusting rv to the correct value.*/
    582  1.1    kleink 
    583  1.1    kleink 	/* Put digits into bd: true value = bd * 10^e */
    584  1.1    kleink 
    585  1.6  christos 	bd0 = s2b(s0, nd0, nd, y, dplen);
    586  1.5  christos 	if (bd0 == NULL)
    587  1.5  christos 		goto ovfl;
    588  1.1    kleink 
    589  1.1    kleink 	for(;;) {
    590  1.1    kleink 		bd = Balloc(bd0->k);
    591  1.5  christos 		if (bd == NULL)
    592  1.5  christos 			goto ovfl;
    593  1.1    kleink 		Bcopy(bd, bd0);
    594  1.6  christos 		bb = d2b(dval(&rv), &bbe, &bbbits);	/* rv = bb * 2^bbe */
    595  1.5  christos 		if (bb == NULL)
    596  1.5  christos 			goto ovfl;
    597  1.1    kleink 		bs = i2b(1);
    598  1.5  christos 		if (bs == NULL)
    599  1.5  christos 			goto ovfl;
    600  1.1    kleink 
    601  1.1    kleink 		if (e >= 0) {
    602  1.1    kleink 			bb2 = bb5 = 0;
    603  1.1    kleink 			bd2 = bd5 = e;
    604  1.1    kleink 			}
    605  1.1    kleink 		else {
    606  1.1    kleink 			bb2 = bb5 = -e;
    607  1.1    kleink 			bd2 = bd5 = 0;
    608  1.1    kleink 			}
    609  1.1    kleink 		if (bbe >= 0)
    610  1.1    kleink 			bb2 += bbe;
    611  1.1    kleink 		else
    612  1.1    kleink 			bd2 -= bbe;
    613  1.1    kleink 		bs2 = bb2;
    614  1.1    kleink #ifdef Honor_FLT_ROUNDS
    615  1.6  christos 		if (Rounding != 1)
    616  1.1    kleink 			bs2++;
    617  1.1    kleink #endif
    618  1.1    kleink #ifdef Avoid_Underflow
    619  1.6  christos 		Lsb = LSB;
    620  1.6  christos 		Lsb1 = 0;
    621  1.1    kleink 		j = bbe - scale;
    622  1.1    kleink 		i = j + bbbits - 1;	/* logb(rv) */
    623  1.6  christos 		j = P + 1 - bbbits;
    624  1.6  christos 		if (i < Emin) {	/* denormal */
    625  1.6  christos 			i = Emin - i;
    626  1.6  christos 			j -= i;
    627  1.6  christos 			if (i < 32)
    628  1.6  christos 				Lsb <<= i;
    629  1.6  christos 			else
    630  1.6  christos 				Lsb1 = Lsb << (i-32);
    631  1.6  christos 			}
    632  1.1    kleink #else /*Avoid_Underflow*/
    633  1.1    kleink #ifdef Sudden_Underflow
    634  1.1    kleink #ifdef IBM
    635  1.1    kleink 		j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
    636  1.1    kleink #else
    637  1.1    kleink 		j = P + 1 - bbbits;
    638  1.1    kleink #endif
    639  1.1    kleink #else /*Sudden_Underflow*/
    640  1.1    kleink 		j = bbe;
    641  1.6  christos 		i = j + bbbits - 1;	/* logb(&rv) */
    642  1.1    kleink 		if (i < Emin)	/* denormal */
    643  1.1    kleink 			j += P - Emin;
    644  1.1    kleink 		else
    645  1.1    kleink 			j = P + 1 - bbbits;
    646  1.1    kleink #endif /*Sudden_Underflow*/
    647  1.1    kleink #endif /*Avoid_Underflow*/
    648  1.1    kleink 		bb2 += j;
    649  1.1    kleink 		bd2 += j;
    650  1.1    kleink #ifdef Avoid_Underflow
    651  1.1    kleink 		bd2 += scale;
    652  1.1    kleink #endif
    653  1.1    kleink 		i = bb2 < bd2 ? bb2 : bd2;
    654  1.1    kleink 		if (i > bs2)
    655  1.1    kleink 			i = bs2;
    656  1.1    kleink 		if (i > 0) {
    657  1.1    kleink 			bb2 -= i;
    658  1.1    kleink 			bd2 -= i;
    659  1.1    kleink 			bs2 -= i;
    660  1.1    kleink 			}
    661  1.1    kleink 		if (bb5 > 0) {
    662  1.1    kleink 			bs = pow5mult(bs, bb5);
    663  1.5  christos 			if (bs == NULL)
    664  1.5  christos 				goto ovfl;
    665  1.1    kleink 			bb1 = mult(bs, bb);
    666  1.5  christos 			if (bb1 == NULL)
    667  1.5  christos 				goto ovfl;
    668  1.1    kleink 			Bfree(bb);
    669  1.1    kleink 			bb = bb1;
    670  1.1    kleink 			}
    671  1.5  christos 		if (bb2 > 0) {
    672  1.1    kleink 			bb = lshift(bb, bb2);
    673  1.5  christos 			if (bb == NULL)
    674  1.5  christos 				goto ovfl;
    675  1.5  christos 			}
    676  1.5  christos 		if (bd5 > 0) {
    677  1.1    kleink 			bd = pow5mult(bd, bd5);
    678  1.5  christos 			if (bd == NULL)
    679  1.5  christos 				goto ovfl;
    680  1.5  christos 			}
    681  1.5  christos 		if (bd2 > 0) {
    682  1.1    kleink 			bd = lshift(bd, bd2);
    683  1.5  christos 			if (bd == NULL)
    684  1.5  christos 				goto ovfl;
    685  1.5  christos 			}
    686  1.5  christos 		if (bs2 > 0) {
    687  1.1    kleink 			bs = lshift(bs, bs2);
    688  1.5  christos 			if (bs == NULL)
    689  1.5  christos 				goto ovfl;
    690  1.5  christos 			}
    691  1.1    kleink 		delta = diff(bb, bd);
    692  1.5  christos 		if (delta == NULL)
    693  1.5  christos 			goto ovfl;
    694  1.1    kleink 		dsign = delta->sign;
    695  1.1    kleink 		delta->sign = 0;
    696  1.1    kleink 		i = cmp(delta, bs);
    697  1.1    kleink #ifdef Honor_FLT_ROUNDS
    698  1.6  christos 		if (Rounding != 1) {
    699  1.1    kleink 			if (i < 0) {
    700  1.1    kleink 				/* Error is less than an ulp */
    701  1.1    kleink 				if (!delta->x[0] && delta->wds <= 1) {
    702  1.1    kleink 					/* exact */
    703  1.1    kleink #ifdef SET_INEXACT
    704  1.1    kleink 					inexact = 0;
    705  1.1    kleink #endif
    706  1.1    kleink 					break;
    707  1.1    kleink 					}
    708  1.6  christos 				if (Rounding) {
    709  1.1    kleink 					if (dsign) {
    710  1.6  christos 						dval(&adj) = 1.;
    711  1.1    kleink 						goto apply_adj;
    712  1.1    kleink 						}
    713  1.1    kleink 					}
    714  1.1    kleink 				else if (!dsign) {
    715  1.6  christos 					dval(&adj) = -1.;
    716  1.6  christos 					if (!word1(&rv)
    717  1.6  christos 					 && !(word0(&rv) & Frac_mask)) {
    718  1.6  christos 						y = word0(&rv) & Exp_mask;
    719  1.1    kleink #ifdef Avoid_Underflow
    720  1.1    kleink 						if (!scale || y > 2*P*Exp_msk1)
    721  1.1    kleink #else
    722  1.1    kleink 						if (y)
    723  1.1    kleink #endif
    724  1.1    kleink 						  {
    725  1.1    kleink 						  delta = lshift(delta,Log2P);
    726  1.1    kleink 						  if (cmp(delta, bs) <= 0)
    727  1.6  christos 							dval(&adj) = -0.5;
    728  1.1    kleink 						  }
    729  1.1    kleink 						}
    730  1.1    kleink  apply_adj:
    731  1.1    kleink #ifdef Avoid_Underflow
    732  1.6  christos 					if (scale && (y = word0(&rv) & Exp_mask)
    733  1.1    kleink 						<= 2*P*Exp_msk1)
    734  1.6  christos 					  word0(&adj) += (2*P+1)*Exp_msk1 - y;
    735  1.1    kleink #else
    736  1.1    kleink #ifdef Sudden_Underflow
    737  1.6  christos 					if ((word0(&rv) & Exp_mask) <=
    738  1.1    kleink 							P*Exp_msk1) {
    739  1.6  christos 						word0(&rv) += P*Exp_msk1;
    740  1.6  christos 						dval(&rv) += adj*ulp(&rv);
    741  1.6  christos 						word0(&rv) -= P*Exp_msk1;
    742  1.1    kleink 						}
    743  1.1    kleink 					else
    744  1.1    kleink #endif /*Sudden_Underflow*/
    745  1.1    kleink #endif /*Avoid_Underflow*/
    746  1.6  christos 					dval(&rv) += adj.d*ulp(&rv);
    747  1.1    kleink 					}
    748  1.1    kleink 				break;
    749  1.1    kleink 				}
    750  1.6  christos 			dval(&adj) = ratio(delta, bs);
    751  1.6  christos 			if (adj.d < 1.)
    752  1.6  christos 				dval(&adj) = 1.;
    753  1.6  christos 			if (adj.d <= 0x7ffffffe) {
    754  1.6  christos 				/* dval(&adj) = Rounding ? ceil(&adj) : floor(&adj); */
    755  1.6  christos 				y = adj.d;
    756  1.6  christos 				if (y != adj.d) {
    757  1.6  christos 					if (!((Rounding>>1) ^ dsign))
    758  1.1    kleink 						y++;
    759  1.6  christos 					dval(&adj) = y;
    760  1.1    kleink 					}
    761  1.1    kleink 				}
    762  1.1    kleink #ifdef Avoid_Underflow
    763  1.6  christos 			if (scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
    764  1.6  christos 				word0(&adj) += (2*P+1)*Exp_msk1 - y;
    765  1.1    kleink #else
    766  1.1    kleink #ifdef Sudden_Underflow
    767  1.6  christos 			if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
    768  1.6  christos 				word0(&rv) += P*Exp_msk1;
    769  1.6  christos 				dval(&adj) *= ulp(&rv);
    770  1.1    kleink 				if (dsign)
    771  1.6  christos 					dval(&rv) += adj;
    772  1.1    kleink 				else
    773  1.6  christos 					dval(&rv) -= adj;
    774  1.6  christos 				word0(&rv) -= P*Exp_msk1;
    775  1.1    kleink 				goto cont;
    776  1.1    kleink 				}
    777  1.1    kleink #endif /*Sudden_Underflow*/
    778  1.1    kleink #endif /*Avoid_Underflow*/
    779  1.6  christos 			dval(&adj) *= ulp(&rv);
    780  1.6  christos 			if (dsign) {
    781  1.6  christos 				if (word0(&rv) == Big0 && word1(&rv) == Big1)
    782  1.6  christos 					goto ovfl;
    783  1.6  christos 				dval(&rv) += adj.d;
    784  1.6  christos 				}
    785  1.1    kleink 			else
    786  1.6  christos 				dval(&rv) -= adj.d;
    787  1.1    kleink 			goto cont;
    788  1.1    kleink 			}
    789  1.1    kleink #endif /*Honor_FLT_ROUNDS*/
    790  1.1    kleink 
    791  1.1    kleink 		if (i < 0) {
    792  1.1    kleink 			/* Error is less than half an ulp -- check for
    793  1.1    kleink 			 * special case of mantissa a power of two.
    794  1.1    kleink 			 */
    795  1.6  christos 			if (dsign || word1(&rv) || word0(&rv) & Bndry_mask
    796  1.1    kleink #ifdef IEEE_Arith
    797  1.1    kleink #ifdef Avoid_Underflow
    798  1.6  christos 			 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
    799  1.1    kleink #else
    800  1.6  christos 			 || (word0(&rv) & Exp_mask) <= Exp_msk1
    801  1.1    kleink #endif
    802  1.1    kleink #endif
    803  1.1    kleink 				) {
    804  1.1    kleink #ifdef SET_INEXACT
    805  1.1    kleink 				if (!delta->x[0] && delta->wds <= 1)
    806  1.1    kleink 					inexact = 0;
    807  1.1    kleink #endif
    808  1.1    kleink 				break;
    809  1.1    kleink 				}
    810  1.1    kleink 			if (!delta->x[0] && delta->wds <= 1) {
    811  1.1    kleink 				/* exact result */
    812  1.1    kleink #ifdef SET_INEXACT
    813  1.1    kleink 				inexact = 0;
    814  1.1    kleink #endif
    815  1.1    kleink 				break;
    816  1.1    kleink 				}
    817  1.1    kleink 			delta = lshift(delta,Log2P);
    818  1.1    kleink 			if (cmp(delta, bs) > 0)
    819  1.1    kleink 				goto drop_down;
    820  1.1    kleink 			break;
    821  1.1    kleink 			}
    822  1.1    kleink 		if (i == 0) {
    823  1.1    kleink 			/* exactly half-way between */
    824  1.1    kleink 			if (dsign) {
    825  1.6  christos 				if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
    826  1.6  christos 				 &&  word1(&rv) == (
    827  1.1    kleink #ifdef Avoid_Underflow
    828  1.6  christos 			(scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
    829  1.1    kleink 		? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
    830  1.1    kleink #endif
    831  1.1    kleink 						   0xffffffff)) {
    832  1.1    kleink 					/*boundary case -- increment exponent*/
    833  1.6  christos 					if (word0(&rv) == Big0 && word1(&rv) == Big1)
    834  1.6  christos 						goto ovfl;
    835  1.6  christos 					word0(&rv) = (word0(&rv) & Exp_mask)
    836  1.1    kleink 						+ Exp_msk1
    837  1.1    kleink #ifdef IBM
    838  1.1    kleink 						| Exp_msk1 >> 4
    839  1.1    kleink #endif
    840  1.1    kleink 						;
    841  1.6  christos 					word1(&rv) = 0;
    842  1.1    kleink #ifdef Avoid_Underflow
    843  1.1    kleink 					dsign = 0;
    844  1.1    kleink #endif
    845  1.1    kleink 					break;
    846  1.1    kleink 					}
    847  1.1    kleink 				}
    848  1.6  christos 			else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
    849  1.1    kleink  drop_down:
    850  1.1    kleink 				/* boundary case -- decrement exponent */
    851  1.1    kleink #ifdef Sudden_Underflow /*{{*/
    852  1.6  christos 				L = word0(&rv) & Exp_mask;
    853  1.1    kleink #ifdef IBM
    854  1.1    kleink 				if (L <  Exp_msk1)
    855  1.1    kleink #else
    856  1.1    kleink #ifdef Avoid_Underflow
    857  1.1    kleink 				if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
    858  1.1    kleink #else
    859  1.1    kleink 				if (L <= Exp_msk1)
    860  1.1    kleink #endif /*Avoid_Underflow*/
    861  1.1    kleink #endif /*IBM*/
    862  1.1    kleink 					goto undfl;
    863  1.1    kleink 				L -= Exp_msk1;
    864  1.1    kleink #else /*Sudden_Underflow}{*/
    865  1.1    kleink #ifdef Avoid_Underflow
    866  1.1    kleink 				if (scale) {
    867  1.6  christos 					L = word0(&rv) & Exp_mask;
    868  1.1    kleink 					if (L <= (2*P+1)*Exp_msk1) {
    869  1.1    kleink 						if (L > (P+2)*Exp_msk1)
    870  1.1    kleink 							/* round even ==> */
    871  1.1    kleink 							/* accept rv */
    872  1.1    kleink 							break;
    873  1.1    kleink 						/* rv = smallest denormal */
    874  1.1    kleink 						goto undfl;
    875  1.1    kleink 						}
    876  1.1    kleink 					}
    877  1.1    kleink #endif /*Avoid_Underflow*/
    878  1.6  christos 				L = (word0(&rv) & Exp_mask) - Exp_msk1;
    879  1.6  christos #endif /*Sudden_Underflow}}*/
    880  1.6  christos 				word0(&rv) = L | Bndry_mask1;
    881  1.6  christos 				word1(&rv) = 0xffffffff;
    882  1.1    kleink #ifdef IBM
    883  1.1    kleink 				goto cont;
    884  1.1    kleink #else
    885  1.1    kleink 				break;
    886  1.1    kleink #endif
    887  1.1    kleink 				}
    888  1.1    kleink #ifndef ROUND_BIASED
    889  1.6  christos #ifdef Avoid_Underflow
    890  1.6  christos 			if (Lsb1) {
    891  1.6  christos 				if (!(word0(&rv) & Lsb1))
    892  1.6  christos 					break;
    893  1.6  christos 				}
    894  1.6  christos 			else if (!(word1(&rv) & Lsb))
    895  1.6  christos 				break;
    896  1.6  christos #else
    897  1.6  christos 			if (!(word1(&rv) & LSB))
    898  1.1    kleink 				break;
    899  1.1    kleink #endif
    900  1.6  christos #endif
    901  1.1    kleink 			if (dsign)
    902  1.6  christos #ifdef Avoid_Underflow
    903  1.6  christos 				dval(&rv) += sulp(&rv, scale);
    904  1.6  christos #else
    905  1.6  christos 				dval(&rv) += ulp(&rv);
    906  1.6  christos #endif
    907  1.1    kleink #ifndef ROUND_BIASED
    908  1.1    kleink 			else {
    909  1.6  christos #ifdef Avoid_Underflow
    910  1.6  christos 				dval(&rv) -= sulp(&rv, scale);
    911  1.6  christos #else
    912  1.6  christos 				dval(&rv) -= ulp(&rv);
    913  1.6  christos #endif
    914  1.1    kleink #ifndef Sudden_Underflow
    915  1.6  christos 				if (!dval(&rv))
    916  1.1    kleink 					goto undfl;
    917  1.1    kleink #endif
    918  1.1    kleink 				}
    919  1.1    kleink #ifdef Avoid_Underflow
    920  1.1    kleink 			dsign = 1 - dsign;
    921  1.1    kleink #endif
    922  1.1    kleink #endif
    923  1.1    kleink 			break;
    924  1.1    kleink 			}
    925  1.1    kleink 		if ((aadj = ratio(delta, bs)) <= 2.) {
    926  1.1    kleink 			if (dsign)
    927  1.6  christos 				aadj = dval(&aadj1) = 1.;
    928  1.6  christos 			else if (word1(&rv) || word0(&rv) & Bndry_mask) {
    929  1.1    kleink #ifndef Sudden_Underflow
    930  1.6  christos 				if (word1(&rv) == Tiny1 && !word0(&rv))
    931  1.1    kleink 					goto undfl;
    932  1.1    kleink #endif
    933  1.1    kleink 				aadj = 1.;
    934  1.6  christos 				dval(&aadj1) = -1.;
    935  1.1    kleink 				}
    936  1.1    kleink 			else {
    937  1.1    kleink 				/* special case -- power of FLT_RADIX to be */
    938  1.1    kleink 				/* rounded down... */
    939  1.1    kleink 
    940  1.1    kleink 				if (aadj < 2./FLT_RADIX)
    941  1.1    kleink 					aadj = 1./FLT_RADIX;
    942  1.1    kleink 				else
    943  1.1    kleink 					aadj *= 0.5;
    944  1.6  christos 				dval(&aadj1) = -aadj;
    945  1.1    kleink 				}
    946  1.1    kleink 			}
    947  1.1    kleink 		else {
    948  1.1    kleink 			aadj *= 0.5;
    949  1.6  christos 			dval(&aadj1) = dsign ? aadj : -aadj;
    950  1.1    kleink #ifdef Check_FLT_ROUNDS
    951  1.1    kleink 			switch(Rounding) {
    952  1.1    kleink 				case 2: /* towards +infinity */
    953  1.6  christos 					dval(&aadj1) -= 0.5;
    954  1.1    kleink 					break;
    955  1.1    kleink 				case 0: /* towards 0 */
    956  1.1    kleink 				case 3: /* towards -infinity */
    957  1.6  christos 					dval(&aadj1) += 0.5;
    958  1.1    kleink 				}
    959  1.1    kleink #else
    960  1.1    kleink 			if (Flt_Rounds == 0)
    961  1.6  christos 				dval(&aadj1) += 0.5;
    962  1.1    kleink #endif /*Check_FLT_ROUNDS*/
    963  1.1    kleink 			}
    964  1.6  christos 		y = word0(&rv) & Exp_mask;
    965  1.1    kleink 
    966  1.1    kleink 		/* Check for overflow */
    967  1.1    kleink 
    968  1.1    kleink 		if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
    969  1.6  christos 			dval(&rv0) = dval(&rv);
    970  1.6  christos 			word0(&rv) -= P*Exp_msk1;
    971  1.6  christos 			dval(&adj) = dval(&aadj1) * ulp(&rv);
    972  1.6  christos 			dval(&rv) += dval(&adj);
    973  1.6  christos 			if ((word0(&rv) & Exp_mask) >=
    974  1.1    kleink 					Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
    975  1.6  christos 				if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
    976  1.1    kleink 					goto ovfl;
    977  1.6  christos 				word0(&rv) = Big0;
    978  1.6  christos 				word1(&rv) = Big1;
    979  1.1    kleink 				goto cont;
    980  1.1    kleink 				}
    981  1.1    kleink 			else
    982  1.6  christos 				word0(&rv) += P*Exp_msk1;
    983  1.1    kleink 			}
    984  1.1    kleink 		else {
    985  1.1    kleink #ifdef Avoid_Underflow
    986  1.1    kleink 			if (scale && y <= 2*P*Exp_msk1) {
    987  1.1    kleink 				if (aadj <= 0x7fffffff) {
    988  1.2    kleink 					if ((z = aadj) == 0)
    989  1.1    kleink 						z = 1;
    990  1.1    kleink 					aadj = z;
    991  1.6  christos 					dval(&aadj1) = dsign ? aadj : -aadj;
    992  1.1    kleink 					}
    993  1.6  christos 				word0(&aadj1) += (2*P+1)*Exp_msk1 - y;
    994  1.1    kleink 				}
    995  1.6  christos 			dval(&adj) = dval(&aadj1) * ulp(&rv);
    996  1.6  christos 			dval(&rv) += dval(&adj);
    997  1.1    kleink #else
    998  1.1    kleink #ifdef Sudden_Underflow
    999  1.6  christos 			if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
   1000  1.6  christos 				dval(&rv0) = dval(&rv);
   1001  1.6  christos 				word0(&rv) += P*Exp_msk1;
   1002  1.6  christos 				dval(&adj) = dval(&aadj1) * ulp(&rv);
   1003  1.6  christos 				dval(&rv) += adj;
   1004  1.1    kleink #ifdef IBM
   1005  1.6  christos 				if ((word0(&rv) & Exp_mask) <  P*Exp_msk1)
   1006  1.1    kleink #else
   1007  1.6  christos 				if ((word0(&rv) & Exp_mask) <= P*Exp_msk1)
   1008  1.1    kleink #endif
   1009  1.1    kleink 					{
   1010  1.6  christos 					if (word0(&rv0) == Tiny0
   1011  1.6  christos 					 && word1(&rv0) == Tiny1)
   1012  1.1    kleink 						goto undfl;
   1013  1.6  christos 					word0(&rv) = Tiny0;
   1014  1.6  christos 					word1(&rv) = Tiny1;
   1015  1.1    kleink 					goto cont;
   1016  1.1    kleink 					}
   1017  1.1    kleink 				else
   1018  1.6  christos 					word0(&rv) -= P*Exp_msk1;
   1019  1.1    kleink 				}
   1020  1.1    kleink 			else {
   1021  1.6  christos 				dval(&adj) = dval(&aadj1) * ulp(&rv);
   1022  1.6  christos 				dval(&rv) += adj;
   1023  1.1    kleink 				}
   1024  1.1    kleink #else /*Sudden_Underflow*/
   1025  1.6  christos 			/* Compute dval(&adj) so that the IEEE rounding rules will
   1026  1.6  christos 			 * correctly round rv + dval(&adj) in some half-way cases.
   1027  1.6  christos 			 * If rv * ulp(&rv) is denormalized (i.e.,
   1028  1.1    kleink 			 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
   1029  1.1    kleink 			 * trouble from bits lost to denormalization;
   1030  1.1    kleink 			 * example: 1.2e-307 .
   1031  1.1    kleink 			 */
   1032  1.1    kleink 			if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
   1033  1.6  christos 				dval(&aadj1) = (double)(int)(aadj + 0.5);
   1034  1.1    kleink 				if (!dsign)
   1035  1.6  christos 					dval(&aadj1) = -dval(&aadj1);
   1036  1.1    kleink 				}
   1037  1.6  christos 			dval(&adj) = dval(&aadj1) * ulp(&rv);
   1038  1.6  christos 			dval(&rv) += adj;
   1039  1.1    kleink #endif /*Sudden_Underflow*/
   1040  1.1    kleink #endif /*Avoid_Underflow*/
   1041  1.1    kleink 			}
   1042  1.6  christos 		z = word0(&rv) & Exp_mask;
   1043  1.1    kleink #ifndef SET_INEXACT
   1044  1.1    kleink #ifdef Avoid_Underflow
   1045  1.1    kleink 		if (!scale)
   1046  1.1    kleink #endif
   1047  1.1    kleink 		if (y == z) {
   1048  1.1    kleink 			/* Can we stop now? */
   1049  1.1    kleink 			L = (Long)aadj;
   1050  1.1    kleink 			aadj -= L;
   1051  1.1    kleink 			/* The tolerances below are conservative. */
   1052  1.6  christos 			if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
   1053  1.1    kleink 				if (aadj < .4999999 || aadj > .5000001)
   1054  1.1    kleink 					break;
   1055  1.1    kleink 				}
   1056  1.1    kleink 			else if (aadj < .4999999/FLT_RADIX)
   1057  1.1    kleink 				break;
   1058  1.1    kleink 			}
   1059  1.1    kleink #endif
   1060  1.1    kleink  cont:
   1061  1.1    kleink 		Bfree(bb);
   1062  1.1    kleink 		Bfree(bd);
   1063  1.1    kleink 		Bfree(bs);
   1064  1.1    kleink 		Bfree(delta);
   1065  1.1    kleink 		}
   1066  1.6  christos 	Bfree(bb);
   1067  1.6  christos 	Bfree(bd);
   1068  1.6  christos 	Bfree(bs);
   1069  1.6  christos 	Bfree(bd0);
   1070  1.6  christos 	Bfree(delta);
   1071  1.1    kleink #ifdef SET_INEXACT
   1072  1.1    kleink 	if (inexact) {
   1073  1.1    kleink 		if (!oldinexact) {
   1074  1.6  christos 			word0(&rv0) = Exp_1 + (70 << Exp_shift);
   1075  1.6  christos 			word1(&rv0) = 0;
   1076  1.6  christos 			dval(&rv0) += 1.;
   1077  1.1    kleink 			}
   1078  1.1    kleink 		}
   1079  1.1    kleink 	else if (!oldinexact)
   1080  1.1    kleink 		clear_inexact();
   1081  1.1    kleink #endif
   1082  1.1    kleink #ifdef Avoid_Underflow
   1083  1.1    kleink 	if (scale) {
   1084  1.6  christos 		word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
   1085  1.6  christos 		word1(&rv0) = 0;
   1086  1.6  christos 		dval(&rv) *= dval(&rv0);
   1087  1.1    kleink #ifndef NO_ERRNO
   1088  1.1    kleink 		/* try to avoid the bug of testing an 8087 register value */
   1089  1.6  christos #ifdef IEEE_Arith
   1090  1.6  christos 		if (!(word0(&rv) & Exp_mask))
   1091  1.6  christos #else
   1092  1.6  christos 		if (word0(&rv) == 0 && word1(&rv) == 0)
   1093  1.6  christos #endif
   1094  1.1    kleink 			errno = ERANGE;
   1095  1.1    kleink #endif
   1096  1.1    kleink 		}
   1097  1.1    kleink #endif /* Avoid_Underflow */
   1098  1.1    kleink #ifdef SET_INEXACT
   1099  1.6  christos 	if (inexact && !(word0(&rv) & Exp_mask)) {
   1100  1.1    kleink 		/* set underflow bit */
   1101  1.6  christos 		dval(&rv0) = 1e-300;
   1102  1.6  christos 		dval(&rv0) *= dval(&rv0);
   1103  1.1    kleink 		}
   1104  1.1    kleink #endif
   1105  1.1    kleink  ret:
   1106  1.1    kleink 	if (se)
   1107  1.2    kleink 		*se = __UNCONST(s);
   1108  1.6  christos 	return sign ? -dval(&rv) : dval(&rv);
   1109  1.1    kleink 	}
   1110  1.1    kleink 
   1111