]> git.saurik.com Git - apple/libc.git/blobdiff - gdtoa/FreeBSD/gdtoa-dtoa.c
Libc-1439.100.3.tar.gz
[apple/libc.git] / gdtoa / FreeBSD / gdtoa-dtoa.c
index 48fdf5efc2da1388738cdfaf554f08339cdd671f..f89ac0c97864d8ce20adf37c562bb9676f595b5f 100644 (file)
@@ -75,10 +75,10 @@ THIS SOFTWARE.
  char *
 dtoa
 #ifdef KR_headers
-       (d, mode, ndigits, decpt, sign, rve)
-       double d; int mode, ndigits, *decpt, *sign; char **rve;
+       (d0, mode, ndigits, decpt, sign, rve)
+       double d0; int mode, ndigits, *decpt, *sign; char **rve;
 #else
-       (double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
+       (double d0, int mode, int ndigits, int *decpt, int *sign, char **rve)
 #endif
 {
  /*    Arguments ndigits, decpt, sign are similar to those
@@ -124,7 +124,8 @@ dtoa
        ULong x;
 #endif
        Bigint *b, *b1, *delta, *mlo, *mhi, *S;
-       double d2, ds, eps;
+       U d, d2, eps;
+       double ds;
        char *s, *s0;
 #ifdef SET_INEXACT
        int inexact, oldinexact;
@@ -149,35 +150,35 @@ dtoa
                dtoa_result = 0;
                }
 #endif
-
-       if (word0(d) & Sign_bit) {
+       d.d = d0;
+       if (word0(&d) & Sign_bit) {
                /* set sign for everything, including 0's and NaNs */
                *sign = 1;
-               word0(d) &= ~Sign_bit;  /* clear sign bit */
+               word0(&d) &= ~Sign_bit; /* clear sign bit */
                }
        else
                *sign = 0;
 
 #if defined(IEEE_Arith) + defined(VAX)
 #ifdef IEEE_Arith
-       if ((word0(d) & Exp_mask) == Exp_mask)
+       if ((word0(&d) & Exp_mask) == Exp_mask)
 #else
-       if (word0(d)  == 0x8000)
+       if (word0(&d)  == 0x8000)
 #endif
                {
                /* Infinity or NaN */
                *decpt = 9999;
 #ifdef IEEE_Arith
-               if (!word1(d) && !(word0(d) & 0xfffff))
+               if (!word1(&d) && !(word0(&d) & 0xfffff))
                        return nrv_alloc("Infinity", rve, 8);
 #endif
                return nrv_alloc("NaN", rve, 3);
                }
 #endif
 #ifdef IBM
-       dval(d) += 0; /* normalize */
+       dval(&d) += 0; /* normalize */
 #endif
-       if (!dval(d)) {
+       if (!dval(&d)) {
                *decpt = 1;
                return nrv_alloc("0", rve, 1);
                }
@@ -196,26 +197,26 @@ dtoa
                }
 #endif
 
-       b = d2b(dval(d), &be, &bbits);
+       b = d2b(dval(&d), &be, &bbits);
 #ifdef Sudden_Underflow
-       i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
+       i = (int)(word0(&d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
 #else
-       if (( i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)) )!=0) {
+       if (( i = (int)(word0(&d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)) )!=0) {
 #endif
-               dval(d2) = dval(d);
-               word0(d2) &= Frac_mask1;
-               word0(d2) |= Exp_11;
+               dval(&d2) = dval(&d);
+               word0(&d2) &= Frac_mask1;
+               word0(&d2) |= Exp_11;
 #ifdef IBM
-               if (( j = 11 - hi0bits(word0(d2) & Frac_mask) )!=0)
-                       dval(d2) /= 1 << j;
+               if (( j = 11 - hi0bits(word0(&d2) & Frac_mask) )!=0)
+                       dval(&d2) /= 1 << j;
 #endif
 
                /* log(x)       ~=~ log(1.5) + (x-1.5)/1.5
                 * log10(x)      =  log(x) / log(10)
                 *              ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
-                * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
+                * log10(&d) = (i-Bias)*log(2)/log(10) + log10(&d2)
                 *
-                * This suggests computing an approximation k to log10(d) by
+                * This suggests computing an approximation k to log10(&d) by
                 *
                 * k = (i - Bias)*0.301029995663981
                 *      + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
@@ -244,21 +245,21 @@ dtoa
                /* d is denormalized */
 
                i = bbits + be + (Bias + (P-1) - 1);
-               x = i > 32  ? word0(d) << 64 - i | word1(d) >> i - 32
-                           : word1(d) << 32 - i;
-               dval(d2) = x;
-               word0(d2) -= 31*Exp_msk1; /* adjust exponent */
+               x = i > 32  ? word0(&d) << (64 - i) | word1(&d) >> (i - 32)
+                           : word1(&d) << (32 - i);
+               dval(&d2) = x;
+               word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
                i -= (Bias + (P-1) - 1) + 1;
                denorm = 1;
                }
 #endif
-       ds = (dval(d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
+       ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
        k = (int)ds;
        if (ds < 0. && ds != k)
                k--;    /* want k = floor(ds) */
        k_check = 1;
        if (k >= 0 && k <= Ten_pmax) {
-               if (dval(d) < tens[k])
+               if (dval(&d) < tens[k])
                        k--;
                k_check = 0;
                }
@@ -297,10 +298,11 @@ dtoa
                try_quick = 0;
                }
        leftright = 1;
+       ilim = ilim1 = -1;      /* Values for cases 0 and 1; done here to */
+                               /* silence erroneous "gcc -Wall" warning. */
        switch(mode) {
                case 0:
                case 1:
-                       ilim = ilim1 = -1;
                        i = 18;
                        ndigits = 0;
                        break;
@@ -334,7 +336,7 @@ dtoa
                /* Try to get by with floating-point arithmetic. */
 
                i = 0;
-               dval(d2) = dval(d);
+               dval(&d2) = dval(&d);
                k0 = k;
                ilim0 = ilim;
                ieps = 2; /* conservative */
@@ -344,7 +346,7 @@ dtoa
                        if (j & Bletch) {
                                /* prevent overflows */
                                j &= Bletch - 1;
-                               dval(d) /= bigtens[n_bigtens-1];
+                               dval(&d) /= bigtens[n_bigtens-1];
                                ieps++;
                                }
                        for(; j; j >>= 1, i++)
@@ -352,32 +354,32 @@ dtoa
                                        ieps++;
                                        ds *= bigtens[i];
                                        }
-                       dval(d) /= ds;
+                       dval(&d) /= ds;
                        }
                else if (( j1 = -k )!=0) {
-                       dval(d) *= tens[j1 & 0xf];
+                       dval(&d) *= tens[j1 & 0xf];
                        for(j = j1 >> 4; j; j >>= 1, i++)
                                if (j & 1) {
                                        ieps++;
-                                       dval(d) *= bigtens[i];
+                                       dval(&d) *= bigtens[i];
                                        }
                        }
-               if (k_check && dval(d) < 1. && ilim > 0) {
+               if (k_check && dval(&d) < 1. && ilim > 0) {
                        if (ilim1 <= 0)
                                goto fast_failed;
                        ilim = ilim1;
                        k--;
-                       dval(d) *= 10.;
+                       dval(&d) *= 10.;
                        ieps++;
                        }
-               dval(eps) = ieps*dval(d) + 7.;
-               word0(eps) -= (P-1)*Exp_msk1;
+               dval(&eps) = ieps*dval(&d) + 7.;
+               word0(&eps) -= (P-1)*Exp_msk1;
                if (ilim == 0) {
                        S = mhi = 0;
-                       dval(d) -= 5.;
-                       if (dval(d) > dval(eps))
+                       dval(&d) -= 5.;
+                       if (dval(&d) > dval(&eps))
                                goto one_digit;
-                       if (dval(d) < -dval(eps))
+                       if (dval(&d) < -dval(&eps))
                                goto no_digits;
                        goto fast_failed;
                        }
@@ -386,34 +388,34 @@ dtoa
                        /* Use Steele & White method of only
                         * generating digits needed.
                         */
-                       dval(eps) = 0.5/tens[ilim-1] - dval(eps);
+                       dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
                        for(i = 0;;) {
-                               L = dval(d);
-                               dval(d) -= L;
+                               L = dval(&d);
+                               dval(&d) -= L;
                                *s++ = '0' + (int)L;
-                               if (dval(d) < dval(eps))
+                               if (dval(&d) < dval(&eps))
                                        goto ret1;
-                               if (1. - dval(d) < dval(eps))
+                               if (1. - dval(&d) < dval(&eps))
                                        goto bump_up;
                                if (++i >= ilim)
                                        break;
-                               dval(eps) *= 10.;
-                               dval(d) *= 10.;
+                               dval(&eps) *= 10.;
+                               dval(&d) *= 10.;
                                }
                        }
                else {
 #endif
                        /* Generate ilim digits, then fix them up. */
-                       dval(eps) *= tens[ilim-1];
-                       for(i = 1;; i++, dval(d) *= 10.) {
-                               L = (Long)(dval(d));
-                               if (!(dval(d) -= L))
+                       dval(&eps) *= tens[ilim-1];
+                       for(i = 1;; i++, dval(&d) *= 10.) {
+                               L = (Long)(dval(&d));
+                               if (!(dval(&d) -= L))
                                        ilim = i;
                                *s++ = '0' + (int)L;
                                if (i == ilim) {
-                                       if (dval(d) > 0.5 + dval(eps))
+                                       if (dval(&d) > 0.5 + dval(&eps))
                                                goto bump_up;
-                                       else if (dval(d) < 0.5 - dval(eps)) {
+                                       else if (dval(&d) < 0.5 - dval(&eps)) {
                                                while(*--s == '0');
                                                s++;
                                                goto ret1;
@@ -426,7 +428,7 @@ dtoa
 #endif
  fast_failed:
                s = s0;
-               dval(d) = dval(d2);
+               dval(&d) = dval(&d2);
                k = k0;
                ilim = ilim0;
                }
@@ -438,22 +440,22 @@ dtoa
                ds = tens[k];
                if (ndigits < 0 && ilim <= 0) {
                        S = mhi = 0;
-                       if (ilim < 0 || dval(d) <= 5*ds)
+                       if (ilim < 0 || dval(&d) <= 5*ds)
                                goto no_digits;
                        goto one_digit;
                        }
-               for(i = 1;; i++, dval(d) *= 10.) {
-                       L = (Long)(dval(d) / ds);
-                       dval(d) -= L*ds;
+               for(i = 1;; i++, dval(&d) *= 10.) {
+                       L = (Long)(dval(&d) / ds);
+                       dval(&d) -= L*ds;
 #ifdef Check_FLT_ROUNDS
                        /* If FLT_ROUNDS == 2, L will usually be high by 1 */
-                       if (dval(d) < 0) {
+                       if (dval(&d) < 0) {
                                L--;
-                               dval(d) += ds;
+                               dval(&d) += ds;
                                }
 #endif
                        *s++ = '0' + (int)L;
-                       if (!dval(d)) {
+                       if (!dval(&d)) {
 #ifdef SET_INEXACT
                                inexact = 0;
 #endif
@@ -467,8 +469,8 @@ dtoa
                                  case 2: goto bump_up;
                                  }
 #endif
-                               dval(d) += dval(d);
-                               if (dval(d) > ds || dval(d) == ds && L & 1) {
+                               dval(&d) += dval(&d);
+                               if (dval(&d) > ds || (dval(&d) == ds && L & 1)) {
  bump_up:
                                        while(*--s == '9')
                                                if (s == s0) {
@@ -533,9 +535,9 @@ dtoa
                        && Rounding == 1
 #endif
                                ) {
-               if (!word1(d) && !(word0(d) & Bndry_mask)
+               if (!word1(&d) && !(word0(&d) & Bndry_mask)
 #ifndef Sudden_Underflow
-                && word0(d) & (Exp_mask & ~Exp_msk1)
+                && word0(&d) & (Exp_mask & ~Exp_msk1)
 #endif
                                ) {
                        /* The special case */
@@ -621,7 +623,7 @@ dtoa
                        j1 = delta->sign ? 1 : cmp(b, delta);
                        Bfree(delta);
 #ifndef ROUND_BIASED
-                       if (j1 == 0 && mode != 1 && !(word1(d) & 1)
+                       if (j1 == 0 && mode != 1 && !(word1(&d) & 1)
 #ifdef Honor_FLT_ROUNDS
                                && Rounding >= 1
 #endif
@@ -638,11 +640,11 @@ dtoa
                                goto ret;
                                }
 #endif
-                       if (j < 0 || j == 0 && mode != 1
+                       if (j < 0 || (j == 0 && mode != 1
 #ifndef ROUND_BIASED
-                                                       && !(word1(d) & 1)
+                                                       && !(word1(&d) & 1)
 #endif
-                                       ) {
+                                       )) {
                                if (!b->x[0] && b->wds <= 1) {
 #ifdef SET_INEXACT
                                        inexact = 0;
@@ -659,7 +661,7 @@ dtoa
                                if (j1 > 0) {
                                        b = lshift(b, 1);
                                        j1 = cmp(b, S);
-                                       if ((j1 > 0 || j1 == 0 && dig & 1)
+                                       if ((j1 > 0 || (j1 == 0 && dig & 1))
                                        && dig++ == '9')
                                                goto round_9_up;
                                        }
@@ -719,7 +721,7 @@ dtoa
 #endif
        b = lshift(b, 1);
        j = cmp(b, S);
-       if (j > 0 || j == 0 && dig & 1) {
+       if (j > 0 || (j == 0 && dig & 1)) {
  roundoff:
                while(*--s == '9')
                        if (s == s0) {
@@ -730,7 +732,9 @@ dtoa
                ++*s++;
                }
        else {
+#ifdef Honor_FLT_ROUNDS
  trimzeros:
+#endif
                while(*--s == '0');
                s++;
                }
@@ -745,9 +749,9 @@ dtoa
 #ifdef SET_INEXACT
        if (inexact) {
                if (!oldinexact) {
-                       word0(d) = Exp_1 + (70 << Exp_shift);
-                       word1(d) = 0;
-                       dval(d) += 1.;
+                       word0(&d) = Exp_1 + (70 << Exp_shift);
+                       word1(&d) = 0;
+                       dval(&d) += 1.;
                        }
                }
        else if (!oldinexact)