⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dtoa.c

📁 gcc的组建
💻 C
📖 第 1 页 / 共 2 页
字号:
      k0 = k;      ilim0 = ilim;      ieps = 2;			/* conservative */      if (k > 0)	{	  ds = tens[k & 0xf];	  j = k >> 4;	  if (j & Bletch)	    {	      /* prevent overflows */	      j &= Bletch - 1;	      d.d /= bigtens[n_bigtens - 1];	      ieps++;	    }	  for (; j; j >>= 1, i++)	    if (j & 1)	      {		ieps++;		ds *= bigtens[i];	      }	  d.d /= ds;	}      else if ((j1 = -k))	{	  d.d *= tens[j1 & 0xf];	  for (j = j1 >> 4; j; j >>= 1, i++)	    if (j & 1)	      {		ieps++;		d.d *= bigtens[i];	      }	}      if (k_check && d.d < 1. && ilim > 0)	{	  if (ilim1 <= 0)	    goto fast_failed;	  ilim = ilim1;	  k--;	  d.d *= 10.;	  ieps++;	}      eps.d = ieps * d.d + 7.;      word0 (eps) -= (P - 1) * Exp_msk1;      if (ilim == 0)	{	  S = mhi = 0;	  d.d -= 5.;	  if (d.d > eps.d)	    goto one_digit;	  if (d.d < -eps.d)	    goto no_digits;	  goto fast_failed;	}#ifndef No_leftright      if (leftright)	{	  /* Use Steele & White method of only	   * generating digits needed.	   */	  eps.d = 0.5 / tens[ilim - 1] - eps.d;	  for (i = 0;;)	    {	      L = d.d;	      d.d -= L;	      *s++ = '0' + (int) L;	      if (d.d < eps.d)		goto ret1;	      if (1. - d.d < eps.d)		goto bump_up;	      if (++i >= ilim)		break;	      eps.d *= 10.;	      d.d *= 10.;	    }	}      else	{#endif	  /* Generate ilim digits, then fix them up. */	  eps.d *= tens[ilim - 1];	  for (i = 1;; i++, d.d *= 10.)	    {	      L = d.d;	      d.d -= L;	      *s++ = '0' + (int) L;	      if (i == ilim)		{		  if (d.d > 0.5 + eps.d)		    goto bump_up;		  else if (d.d < 0.5 - eps.d)		    {		      while (*--s == '0');		      s++;		      goto ret1;		    }		  break;		}	    }#ifndef No_leftright	}#endif    fast_failed:      s = s0;      d.d = d2.d;      k = k0;      ilim = ilim0;    }  /* Do we have a "small" integer? */  if (be >= 0 && k <= Int_max)    {      /* Yes. */      ds = tens[k];      if (ndigits < 0 && ilim <= 0)	{	  S = mhi = 0;	  if (ilim < 0 || d.d <= 5 * ds)	    goto no_digits;	  goto one_digit;	}      for (i = 1;; i++)	{	  L = d.d / ds;	  d.d -= L * ds;#ifdef Check_FLT_ROUNDS	  /* If FLT_ROUNDS == 2, L will usually be high by 1 */	  if (d.d < 0)	    {	      L--;	      d.d += ds;	    }#endif	  *s++ = '0' + (int) L;	  if (i == ilim)	    {	      d.d += d.d;	      if (d.d > ds || (d.d == ds && L & 1))		{		bump_up:		  while (*--s == '9')		    if (s == s0)		      {			k++;			*s = '0';			break;		      }		  ++*s++;		}	      break;	    }	  if (!(d.d *= 10.))	    break;	}      goto ret1;    }  m2 = b2;  m5 = b5;  mhi = mlo = 0;  if (leftright)    {      if (mode < 2)	{	  i =#ifndef Sudden_Underflow	    denorm ? be + (Bias + (P - 1) - 1 + 1) :#endif#ifdef IBM	    1 + 4 * P - 3 - bbits + ((bbits + be - 1) & 3);#else	    1 + P - bbits;#endif	}      else	{	  j = ilim - 1;	  if (m5 >= j)	    m5 -= j;	  else	    {	      s5 += j -= m5;	      b5 += j;	      m5 = 0;	    }	  if ((i = ilim) < 0)	    {	      m2 -= i;	      i = 0;	    }	}      b2 += i;      s2 += i;      mhi = i2b (ptr, 1);    }  if (m2 > 0 && s2 > 0)    {      i = m2 < s2 ? m2 : s2;      b2 -= i;      m2 -= i;      s2 -= i;    }  if (b5 > 0)    {      if (leftright)	{	  if (m5 > 0)	    {	      mhi = pow5mult (ptr, mhi, m5);	      b1 = mult (ptr, mhi, b);	      Bfree (ptr, b);	      b = b1;	    }	  if ((j = b5 - m5))	    b = pow5mult (ptr, b, j);	}      else	b = pow5mult (ptr, b, b5);    }  S = i2b (ptr, 1);  if (s5 > 0)    S = pow5mult (ptr, S, s5);  /* Check for special case that d is a normalized power of 2. */  if (mode < 2)    {      if (!word1 (d) && !(word0 (d) & Bndry_mask)#ifndef Sudden_Underflow	  && word0(d) & Exp_mask#endif	)	{	  /* The special case */	  b2 += Log2P;	  s2 += Log2P;	  spec_case = 1;	}      else	spec_case = 0;    }  /* Arrange for convenient computation of quotients:   * shift left if necessary so divisor has 4 leading 0 bits.   *   * Perhaps we should just compute leading 28 bits of S once   * and for all and pass them and a shift to quorem, so it   * can do shifts and ors to compute the numerator for q.   */#ifdef Pack_32  if ((i = ((s5 ? 32 - hi0bits (S->_x[S->_wds - 1]) : 1) + s2) & 0x1f))    i = 32 - i;#else  if ((i = ((s5 ? 32 - hi0bits (S->_x[S->_wds - 1]) : 1) + s2) & 0xf))    i = 16 - i;#endif  if (i > 4)    {      i -= 4;      b2 += i;      m2 += i;      s2 += i;    }  else if (i < 4)    {      i += 28;      b2 += i;      m2 += i;      s2 += i;    }  if (b2 > 0)    b = lshift (ptr, b, b2);  if (s2 > 0)    S = lshift (ptr, S, s2);  if (k_check)    {      if (cmp (b, S) < 0)	{	  k--;	  b = multadd (ptr, b, 10, 0);	/* we botched the k estimate */	  if (leftright)	    mhi = multadd (ptr, mhi, 10, 0);	  ilim = ilim1;	}    }  if (ilim <= 0 && mode > 2)    {      if (ilim < 0 || cmp (b, S = multadd (ptr, S, 5, 0)) <= 0)	{	  /* no digits, fcvt style */	no_digits:	  k = -1 - ndigits;	  goto ret;	}    one_digit:      *s++ = '1';      k++;      goto ret;    }  if (leftright)    {      if (m2 > 0)	mhi = lshift (ptr, mhi, m2);      /* Single precision case, */      if (float_type)	mhi = lshift (ptr, mhi, 29);      /* Compute mlo -- check for special case       * that d is a normalized power of 2.       */      mlo = mhi;      if (spec_case)	{	  mhi = Balloc (ptr, mhi->_k);	  Bcopy (mhi, mlo);	  mhi = lshift (ptr, mhi, Log2P);	}      for (i = 1;; i++)	{	  dig = quorem (b, S) + '0';	  /* Do we yet have the shortest decimal string	   * that will round to d?	   */	  j = cmp (b, mlo);	  delta = diff (ptr, S, mhi);	  j1 = delta->_sign ? 1 : cmp (b, delta);	  Bfree (ptr, delta);#ifndef ROUND_BIASED	  if (j1 == 0 && !mode && !(word1 (d) & 1))	    {	      if (dig == '9')		goto round_9_up;	      if (j > 0)		dig++;	      *s++ = dig;	      goto ret;	    }#endif	  if (j < 0 || (j == 0 && !mode#ifndef ROUND_BIASED	      && !(word1 (d) & 1)#endif	    ))	    {	      if (j1 > 0)		{		  b = lshift (ptr, b, 1);		  j1 = cmp (b, S);		  if ((j1 > 0 || (j1 == 0 && dig & 1))		      && dig++ == '9')		    goto round_9_up;		}	      *s++ = dig;	      goto ret;	    }	  if (j1 > 0)	    {	      if (dig == '9')		{		/* possible if i == 1 */		round_9_up:		  *s++ = '9';		  goto roundoff;		}	      *s++ = dig + 1;	      goto ret;	    }	  *s++ = dig;	  if (i == ilim)	    break;	  b = multadd (ptr, b, 10, 0);	  if (mlo == mhi)	    mlo = mhi = multadd (ptr, mhi, 10, 0);	  else	    {	      mlo = multadd (ptr, mlo, 10, 0);	      mhi = multadd (ptr, mhi, 10, 0);	    }	}    }  else    for (i = 1;; i++)      {	*s++ = dig = quorem (b, S) + '0';	if (i >= ilim)	  break;	b = multadd (ptr, b, 10, 0);      }  /* Round off last digit */  b = lshift (ptr, b, 1);  j = cmp (b, S);  if (j > 0 || (j == 0 && dig & 1))    {    roundoff:      while (*--s == '9')	if (s == s0)	  {	    k++;	    *s++ = '1';	    goto ret;	  }      ++*s++;    }  else    {      while (*--s == '0');      s++;    }ret:  Bfree (ptr, S);  if (mhi)    {      if (mlo && mlo != mhi)	Bfree (ptr, mlo);      Bfree (ptr, mhi);    }ret1:  Bfree (ptr, b);  *s = 0;  *decpt = k + 1;  if (rve)    *rve = s;  return s0;}_VOID_DEFUN (_dtoa,	(_d, mode, ndigits, decpt, sign, rve, buf, float_type),	double _d _AND	int mode _AND	int ndigits _AND	int *decpt _AND	int *sign _AND	char **rve _AND	char *buf _AND	int float_type){  struct _Jv_reent reent;  char *p;  memset (&reent, 0, sizeof reent);  p = _dtoa_r (&reent, _d, mode, ndigits, decpt, sign, rve, float_type);  strcpy (buf, p);  return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -