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