|
|
1.1 ! root 1: /* ! 2: Copyright (C) 1993 Free Software Foundation ! 3: ! 4: This file is part of the GNU IO Library. This library is free ! 5: software; you can redistribute it and/or modify it under the ! 6: terms of the GNU General Public License as published by the ! 7: Free Software Foundation; either version 2, or (at your option) ! 8: any later version. ! 9: ! 10: This library is distributed in the hope that it will be useful, ! 11: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 13: GNU General Public License for more details. ! 14: ! 15: You should have received a copy of the GNU General Public License ! 16: along with GNU CC; see the file COPYING. If not, write to ! 17: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 18: ! 19: As a special exception, if you link this library with files ! 20: compiled with a GNU compiler to produce an executable, this does not cause ! 21: the resulting executable to be covered by the GNU General Public License. ! 22: This exception does not however invalidate any other reasons why ! 23: the executable file might be covered by the GNU General Public License. */ ! 24: ! 25: #include <libioP.h> ! 26: #ifdef USE_DTOA ! 27: /**************************************************************** ! 28: * ! 29: * The author of this software is David M. Gay. ! 30: * ! 31: * Copyright (c) 1991 by AT&T. ! 32: * ! 33: * Permission to use, copy, modify, and distribute this software for any ! 34: * purpose without fee is hereby granted, provided that this entire notice ! 35: * is included in all copies of any software which is or includes a copy ! 36: * or modification of this software and in all copies of the supporting ! 37: * documentation for such software. ! 38: * ! 39: * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED ! 40: * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY ! 41: * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY ! 42: * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. ! 43: * ! 44: ***************************************************************/ ! 45: ! 46: /* Some cleaning up by Per Bothner, [email protected], 1992, 1993. ! 47: Re-written to not need static variables ! 48: (except result, result_k, HIWORD, LOWORD). */ ! 49: ! 50: /* Please send bug reports to ! 51: David M. Gay ! 52: AT&T Bell Laboratories, Room 2C-463 ! 53: 600 Mountain Avenue ! 54: Murray Hill, NJ 07974-2070 ! 55: U.S.A. ! 56: [email protected] or research!dmg ! 57: */ ! 58: ! 59: /* strtod for IEEE-, VAX-, and IBM-arithmetic machines. ! 60: * ! 61: * This strtod returns a nearest machine number to the input decimal ! 62: * string (or sets errno to ERANGE). With IEEE arithmetic, ties are ! 63: * broken by the IEEE round-even rule. Otherwise ties are broken by ! 64: * biased rounding (add half and chop). ! 65: * ! 66: * Inspired loosely by William D. Clinger's paper "How to Read Floating ! 67: * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101]. ! 68: * ! 69: * Modifications: ! 70: * ! 71: * 1. We only require IEEE, IBM, or VAX double-precision ! 72: * arithmetic (not IEEE double-extended). ! 73: * 2. We get by with floating-point arithmetic in a case that ! 74: * Clinger missed -- when we're computing d * 10^n ! 75: * for a small integer d and the integer n is not too ! 76: * much larger than 22 (the maximum integer k for which ! 77: * we can represent 10^k exactly), we may be able to ! 78: * compute (d*10^k) * 10^(e-k) with just one roundoff. ! 79: * 3. Rather than a bit-at-a-time adjustment of the binary ! 80: * result in the hard case, we use floating-point ! 81: * arithmetic to determine the adjustment to within ! 82: * one bit; only in really hard cases do we need to ! 83: * compute a second residual. ! 84: * 4. Because of 3., we don't need a large table of powers of 10 ! 85: * for ten-to-e (just some small tables, e.g. of 10^k ! 86: * for 0 <= k <= 22). ! 87: */ ! 88: ! 89: /* ! 90: * #define IEEE_8087 for IEEE-arithmetic machines where the least ! 91: * significant byte has the lowest address. ! 92: * #define IEEE_MC68k for IEEE-arithmetic machines where the most ! 93: * significant byte has the lowest address. ! 94: * #define Sudden_Underflow for IEEE-format machines without gradual ! 95: * underflow (i.e., that flush to zero on underflow). ! 96: * #define IBM for IBM mainframe-style floating-point arithmetic. ! 97: * #define VAX for VAX-style floating-point arithmetic. ! 98: * #define Unsigned_Shifts if >> does treats its left operand as unsigned. ! 99: * #define No_leftright to omit left-right logic in fast floating-point ! 100: * computation of dtoa. ! 101: * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3. ! 102: * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines ! 103: * that use extended-precision instructions to compute rounded ! 104: * products and quotients) with IBM. ! 105: * #define ROUND_BIASED for IEEE-format with biased rounding. ! 106: * #define Inaccurate_Divide for IEEE-format with correctly rounded ! 107: * products but inaccurate quotients, e.g., for Intel i860. ! 108: * #define KR_headers for old-style C function headers. ! 109: */ ! 110: ! 111: #ifdef DEBUG ! 112: #include <stdio.h> ! 113: #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} ! 114: #endif ! 115: ! 116: #ifdef __STDC__ ! 117: #include <stdlib.h> ! 118: #include <string.h> ! 119: #include <float.h> ! 120: #define CONST const ! 121: #else ! 122: #define CONST ! 123: #define KR_headers ! 124: ! 125: /* In this case, we assume IEEE floats. */ ! 126: #define FLT_ROUNDS 1 ! 127: #define FLT_RADIX 2 ! 128: #define DBL_MANT_DIG 53 ! 129: #define DBL_DIG 15 ! 130: #define DBL_MAX_10_EXP 308 ! 131: #define DBL_MAX_EXP 1024 ! 132: #endif ! 133: ! 134: #include <errno.h> ! 135: #ifndef __MATH_H__ ! 136: #include <math.h> ! 137: #endif ! 138: ! 139: #ifdef Unsigned_Shifts ! 140: #define Sign_Extend(a,b) if (b < 0) a |= 0xffff0000; ! 141: #else ! 142: #define Sign_Extend(a,b) /*no-op*/ ! 143: #endif ! 144: ! 145: #if defined(__i386__) || defined(__i860__) || defined(clipper) ! 146: #define IEEE_8087 ! 147: #endif ! 148: #if defined(MIPSEL) || defined(__alpha__) ! 149: #define IEEE_8087 ! 150: #endif ! 151: #if defined(__sparc__) || defined(sparc) || defined(MIPSEB) ! 152: #define IEEE_MC68k ! 153: #endif ! 154: ! 155: #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1 ! 156: ! 157: #if FLT_RADIX==16 ! 158: #define IBM ! 159: #else ! 160: #if DBL_MANT_DIG==56 ! 161: #define VAX ! 162: #else ! 163: #if DBL_MANT_DIG==53 && DBL_MAX_10_EXP==308 ! 164: #define IEEE_Unknown ! 165: #else ! 166: Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined. ! 167: #endif ! 168: #endif ! 169: #endif ! 170: #endif ! 171: ! 172: #ifdef IEEE_8087 ! 173: #define HIWORD 1 ! 174: #define LOWORD 0 ! 175: #define TEST_ENDIANNESS /* nothing */ ! 176: #else ! 177: #if defined(IEEE_MC68k) ! 178: #define HIWORD 0 ! 179: #define LOWORD 1 ! 180: #define TEST_ENDIANNESS /* nothing */ ! 181: #else ! 182: static int HIWORD = -1, LOWORD; ! 183: static void test_endianness() ! 184: { ! 185: union doubleword { ! 186: double d; ! 187: unsigned long u[2]; ! 188: } dw; ! 189: dw.d = 10; ! 190: if (dw.u[0] != 0) /* big-endian */ ! 191: HIWORD=0, LOWORD=1; ! 192: else ! 193: HIWORD=1, LOWORD=0; ! 194: } ! 195: #define TEST_ENDIANNESS if (HIWORD<0) test_endianness(); ! 196: #endif ! 197: #endif ! 198: ! 199: #if 0 ! 200: union { ! 201: double d; ! 202: unsigned long x[2]; ! 203: } _temp; ! 204: #endif ! 205: #define word0(x) ((unsigned long *)&x)[HIWORD] ! 206: #if 0 ! 207: #define word0(X) (_temp.d = X, _temp.x[HIWORD]) ! 208: #define setword0(D,X) (_temp.d = D, _temp.x[HIWORD] = X, D = _temp.d) ! 209: #endif ! 210: #define word1(x) ((unsigned long *)&x)[LOWORD] ! 211: ! 212: /* The following definition of Storeinc is appropriate for MIPS processors. */ ! 213: #if defined(IEEE_8087) + defined(VAX) ! 214: #define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \ ! 215: ((unsigned short *)a)[0] = (unsigned short)c, a++) ! 216: #else ! 217: #if defined(IEEE_MC68k) ! 218: #define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \ ! 219: ((unsigned short *)a)[1] = (unsigned short)c, a++) ! 220: #else ! 221: #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) ! 222: #endif ! 223: #endif ! 224: ! 225: /* #define P DBL_MANT_DIG */ ! 226: /* Ten_pmax = floor(P*log(2)/log(5)) */ ! 227: /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ ! 228: /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ ! 229: /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ ! 230: ! 231: #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(IEEE_Unknown) ! 232: #define Exp_shift 20 ! 233: #define Exp_shift1 20 ! 234: #define Exp_msk1 0x100000 ! 235: #define Exp_msk11 0x100000 ! 236: #define Exp_mask 0x7ff00000 ! 237: #define P 53 ! 238: #define Bias 1023 ! 239: #define IEEE_Arith ! 240: #define Emin (-1022) ! 241: #define Exp_1 0x3ff00000 ! 242: #define Exp_11 0x3ff00000 ! 243: #define Ebits 11 ! 244: #define Frac_mask 0xfffff ! 245: #define Frac_mask1 0xfffff ! 246: #define Ten_pmax 22 ! 247: #define Bletch 0x10 ! 248: #define Bndry_mask 0xfffff ! 249: #define Bndry_mask1 0xfffff ! 250: #define LSB 1 ! 251: #define Sign_bit 0x80000000 ! 252: #define Log2P 1 ! 253: #define Tiny0 0 ! 254: #define Tiny1 1 ! 255: #define Quick_max 14 ! 256: #define Int_max 14 ! 257: #define Infinite(x) (word0(x) == 0x7ff00000) /* sufficient test for here */ ! 258: #else ! 259: #undef Sudden_Underflow ! 260: #define Sudden_Underflow ! 261: #ifdef IBM ! 262: #define Exp_shift 24 ! 263: #define Exp_shift1 24 ! 264: #define Exp_msk1 0x1000000 ! 265: #define Exp_msk11 0x1000000 ! 266: #define Exp_mask 0x7f000000 ! 267: #define P 14 ! 268: #define Bias 65 ! 269: #define Exp_1 0x41000000 ! 270: #define Exp_11 0x41000000 ! 271: #define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ ! 272: #define Frac_mask 0xffffff ! 273: #define Frac_mask1 0xffffff ! 274: #define Bletch 4 ! 275: #define Ten_pmax 22 ! 276: #define Bndry_mask 0xefffff ! 277: #define Bndry_mask1 0xffffff ! 278: #define LSB 1 ! 279: #define Sign_bit 0x80000000 ! 280: #define Log2P 4 ! 281: #define Tiny0 0x100000 ! 282: #define Tiny1 0 ! 283: #define Quick_max 14 ! 284: #define Int_max 15 ! 285: #else /* VAX */ ! 286: #define Exp_shift 23 ! 287: #define Exp_shift1 7 ! 288: #define Exp_msk1 0x80 ! 289: #define Exp_msk11 0x800000 ! 290: #define Exp_mask 0x7f80 ! 291: #define P 56 ! 292: #define Bias 129 ! 293: #define Exp_1 0x40800000 ! 294: #define Exp_11 0x4080 ! 295: #define Ebits 8 ! 296: #define Frac_mask 0x7fffff ! 297: #define Frac_mask1 0xffff007f ! 298: #define Ten_pmax 24 ! 299: #define Bletch 2 ! 300: #define Bndry_mask 0xffff007f ! 301: #define Bndry_mask1 0xffff007f ! 302: #define LSB 0x10000 ! 303: #define Sign_bit 0x8000 ! 304: #define Log2P 1 ! 305: #define Tiny0 0x80 ! 306: #define Tiny1 0 ! 307: #define Quick_max 15 ! 308: #define Int_max 15 ! 309: #endif ! 310: #endif ! 311: ! 312: #ifndef IEEE_Arith ! 313: #define ROUND_BIASED ! 314: #endif ! 315: ! 316: #ifdef RND_PRODQUOT ! 317: #define rounded_product(a,b) a = rnd_prod(a, b) ! 318: #define rounded_quotient(a,b) a = rnd_quot(a, b) ! 319: extern double rnd_prod(double, double), rnd_quot(double, double); ! 320: #else ! 321: #define rounded_product(a,b) a *= b ! 322: #define rounded_quotient(a,b) a /= b ! 323: #endif ! 324: ! 325: #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) ! 326: #define Big1 0xffffffff ! 327: ! 328: #define Kmax 15 ! 329: ! 330: /* (1<<BIGINT_MINIMUM_K) is the minimum number of words to allocate ! 331: in a Bigint. dtoa usually manages with 1<<2, and has not been ! 332: known to need more than 1<<3. */ ! 333: ! 334: #define BIGINT_MINIMUM_K 3 ! 335: ! 336: struct Bigint { ! 337: struct Bigint *next; ! 338: int k; /* Parameter given to Balloc(k) */ ! 339: int maxwds; /* Allocated space: equals 1<<k. */ ! 340: short on_stack; /* 1 if stack-allocated. */ ! 341: short sign; /* 0 if value is positive or zero; 1 if negative. */ ! 342: int wds; /* Current length. */ ! 343: unsigned long x[1<<BIGINT_MINIMUM_K]; /* Actually: x[maxwds] */ ! 344: }; ! 345: ! 346: #define BIGINT_HEADER_SIZE \ ! 347: (sizeof(Bigint) - (1<<BIGINT_MINIMUM_K) * sizeof(unsigned long)) ! 348: ! 349: typedef struct Bigint Bigint; ! 350: ! 351: /* Initialize a stack-allocated Bigint. */ ! 352: ! 353: static Bigint * ! 354: Binit ! 355: #ifdef KR_headers ! 356: (v) Bigint *v; ! 357: #else ! 358: (Bigint *v) ! 359: #endif ! 360: { ! 361: v->on_stack = 1; ! 362: v->k = BIGINT_MINIMUM_K; ! 363: v->maxwds = 1 << BIGINT_MINIMUM_K; ! 364: v->sign = v->wds = 0; ! 365: return v; ! 366: } ! 367: ! 368: /* Allocate a Bigint with '1<<k' big digits. */ ! 369: ! 370: static Bigint * ! 371: Balloc ! 372: #ifdef KR_headers ! 373: (k) int k; ! 374: #else ! 375: (int k) ! 376: #endif ! 377: { ! 378: int x; ! 379: Bigint *rv; ! 380: ! 381: if (k < BIGINT_MINIMUM_K) ! 382: k = BIGINT_MINIMUM_K; ! 383: ! 384: x = 1 << k; ! 385: rv = (Bigint *) ! 386: malloc(BIGINT_HEADER_SIZE + x * sizeof(unsigned long)); ! 387: rv->k = k; ! 388: rv->maxwds = x; ! 389: rv->sign = rv->wds = 0; ! 390: rv->on_stack = 0; ! 391: return rv; ! 392: } ! 393: ! 394: static void ! 395: Bfree ! 396: #ifdef KR_headers ! 397: (v) Bigint *v; ! 398: #else ! 399: (Bigint *v) ! 400: #endif ! 401: { ! 402: if (v && !v->on_stack) ! 403: free (v); ! 404: } ! 405: ! 406: static void ! 407: Bcopy ! 408: #ifdef KR_headers ! 409: (x, y) Bigint *x, *y; ! 410: #else ! 411: (Bigint *x, Bigint *y) ! 412: #endif ! 413: { ! 414: register unsigned long *xp, *yp; ! 415: register int i = y->wds; ! 416: x->sign = y->sign; ! 417: x->wds = i; ! 418: for (xp = x->x, yp = y->x; --i >= 0; ) ! 419: *xp++ = *yp++; ! 420: } ! 421: ! 422: /* Make sure b has room for at least 1<<k big digits. */ ! 423: ! 424: static Bigint * ! 425: Brealloc ! 426: #ifdef KR_headers ! 427: (b, k) Bigint *b; int k; ! 428: #else ! 429: (Bigint * b, int k) ! 430: #endif ! 431: { ! 432: if (b == NULL) ! 433: return Balloc(k); ! 434: if (b->k >= k) ! 435: return b; ! 436: else ! 437: { ! 438: Bigint *rv = Balloc (k); ! 439: Bcopy(rv, b); ! 440: Bfree(b); ! 441: return rv; ! 442: } ! 443: } ! 444: ! 445: /* Return b*m+a. b is modified. ! 446: Assumption: 0xFFFF*m+a fits in 32 bits. */ ! 447: ! 448: static Bigint * ! 449: multadd ! 450: #ifdef KR_headers ! 451: (b, m, a) Bigint *b; int m, a; ! 452: #else ! 453: (Bigint *b, int m, int a) ! 454: #endif ! 455: { ! 456: int i, wds; ! 457: unsigned long *x, y; ! 458: unsigned long xi, z; ! 459: ! 460: wds = b->wds; ! 461: x = b->x; ! 462: i = 0; ! 463: do { ! 464: xi = *x; ! 465: y = (xi & 0xffff) * m + a; ! 466: z = (xi >> 16) * m + (y >> 16); ! 467: a = (int)(z >> 16); ! 468: *x++ = (z << 16) + (y & 0xffff); ! 469: } ! 470: while(++i < wds); ! 471: if (a) { ! 472: if (wds >= b->maxwds) ! 473: b = Brealloc(b, b->k+1); ! 474: b->x[wds++] = a; ! 475: b->wds = wds; ! 476: } ! 477: return b; ! 478: } ! 479: ! 480: static Bigint * ! 481: s2b ! 482: #ifdef KR_headers ! 483: (result, s, nd0, nd, y9) ! 484: Bigint *result; CONST char *s; int nd0, nd; unsigned long y9; ! 485: #else ! 486: (Bigint *result, CONST char *s, int nd0, int nd, unsigned long y9) ! 487: #endif ! 488: { ! 489: int i, k; ! 490: long x, y; ! 491: ! 492: x = (nd + 8) / 9; ! 493: for(k = 0, y = 1; x > y; y <<= 1, k++) ; ! 494: result = Brealloc(result, k); ! 495: result->x[0] = y9; ! 496: result->wds = 1; ! 497: ! 498: i = 9; ! 499: if (9 < nd0) ! 500: { ! 501: s += 9; ! 502: do ! 503: result = multadd(result, 10, *s++ - '0'); ! 504: while (++i < nd0); ! 505: s++; ! 506: } ! 507: else ! 508: s += 10; ! 509: for(; i < nd; i++) ! 510: result = multadd(result, 10, *s++ - '0'); ! 511: return result; ! 512: } ! 513: ! 514: static int ! 515: hi0bits ! 516: #ifdef KR_headers ! 517: (x) register unsigned long x; ! 518: #else ! 519: (register unsigned long x) ! 520: #endif ! 521: { ! 522: register int k = 0; ! 523: ! 524: if (!(x & 0xffff0000)) { ! 525: k = 16; ! 526: x <<= 16; ! 527: } ! 528: if (!(x & 0xff000000)) { ! 529: k += 8; ! 530: x <<= 8; ! 531: } ! 532: if (!(x & 0xf0000000)) { ! 533: k += 4; ! 534: x <<= 4; ! 535: } ! 536: if (!(x & 0xc0000000)) { ! 537: k += 2; ! 538: x <<= 2; ! 539: } ! 540: if (!(x & 0x80000000)) { ! 541: k++; ! 542: if (!(x & 0x40000000)) ! 543: return 32; ! 544: } ! 545: return k; ! 546: } ! 547: ! 548: static int ! 549: lo0bits ! 550: #ifdef KR_headers ! 551: (y) unsigned long *y; ! 552: #else ! 553: (unsigned long *y) ! 554: #endif ! 555: { ! 556: register int k; ! 557: register unsigned long x = *y; ! 558: ! 559: if (x & 7) { ! 560: if (x & 1) ! 561: return 0; ! 562: if (x & 2) { ! 563: *y = x >> 1; ! 564: return 1; ! 565: } ! 566: *y = x >> 2; ! 567: return 2; ! 568: } ! 569: k = 0; ! 570: if (!(x & 0xffff)) { ! 571: k = 16; ! 572: x >>= 16; ! 573: } ! 574: if (!(x & 0xff)) { ! 575: k += 8; ! 576: x >>= 8; ! 577: } ! 578: if (!(x & 0xf)) { ! 579: k += 4; ! 580: x >>= 4; ! 581: } ! 582: if (!(x & 0x3)) { ! 583: k += 2; ! 584: x >>= 2; ! 585: } ! 586: if (!(x & 1)) { ! 587: k++; ! 588: x >>= 1; ! 589: if (!x & 1) ! 590: return 32; ! 591: } ! 592: *y = x; ! 593: return k; ! 594: } ! 595: ! 596: static Bigint * ! 597: i2b ! 598: #ifdef KR_headers ! 599: (result, i) Bigint *result; int i; ! 600: #else ! 601: (Bigint* result, int i) ! 602: #endif ! 603: { ! 604: result = Brealloc(result, 1); ! 605: result->x[0] = i; ! 606: result->wds = 1; ! 607: return result; ! 608: } ! 609: ! 610: /* Do: c = a * b. */ ! 611: ! 612: static Bigint * ! 613: mult ! 614: #ifdef KR_headers ! 615: (c, a, b) Bigint *a, *b, *c; ! 616: #else ! 617: (Bigint *c, Bigint *a, Bigint *b) ! 618: #endif ! 619: { ! 620: int k, wa, wb, wc; ! 621: unsigned long carry, y, z; ! 622: unsigned long *x, *xa, *xae, *xb, *xbe, *xc, *xc0; ! 623: unsigned long z2; ! 624: if (a->wds < b->wds) { ! 625: Bigint *tmp = a; ! 626: a = b; ! 627: b = tmp; ! 628: } ! 629: k = a->k; ! 630: wa = a->wds; ! 631: wb = b->wds; ! 632: wc = wa + wb; ! 633: if (wc > a->maxwds) ! 634: k++; ! 635: c = Brealloc(c, k); ! 636: for(x = c->x, xa = x + wc; x < xa; x++) ! 637: *x = 0; ! 638: xa = a->x; ! 639: xae = xa + wa; ! 640: xb = b->x; ! 641: xbe = xb + wb; ! 642: xc0 = c->x; ! 643: for(; xb < xbe; xb++, xc0++) { ! 644: if (y = *xb & 0xffff) { ! 645: x = xa; ! 646: xc = xc0; ! 647: carry = 0; ! 648: do { ! 649: z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; ! 650: carry = z >> 16; ! 651: z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; ! 652: carry = z2 >> 16; ! 653: Storeinc(xc, z2, z); ! 654: } ! 655: while(x < xae); ! 656: *xc = carry; ! 657: } ! 658: if (y = *xb >> 16) { ! 659: x = xa; ! 660: xc = xc0; ! 661: carry = 0; ! 662: z2 = *xc; ! 663: do { ! 664: z = (*x & 0xffff) * y + (*xc >> 16) + carry; ! 665: carry = z >> 16; ! 666: Storeinc(xc, z, z2); ! 667: z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; ! 668: carry = z2 >> 16; ! 669: } ! 670: while(x < xae); ! 671: *xc = z2; ! 672: } ! 673: } ! 674: for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; ! 675: c->wds = wc; ! 676: return c; ! 677: } ! 678: ! 679: /* Returns b*(5**k). b is modified. */ ! 680: /* Re-written by Per Bothner to not need a static list. */ ! 681: ! 682: static Bigint * ! 683: pow5mult ! 684: #ifdef KR_headers ! 685: (b, k) Bigint *b; int k; ! 686: #else ! 687: (Bigint *b, int k) ! 688: #endif ! 689: { ! 690: static int p05[6] = { 5, 25, 125, 625, 3125, 15625 }; ! 691: ! 692: for (; k > 6; k -= 6) ! 693: b = multadd(b, 15625, 0); /* b *= 5**6 */ ! 694: if (k == 0) ! 695: return b; ! 696: else ! 697: return multadd(b, p05[k-1], 0); ! 698: } ! 699: ! 700: /* Re-written by Per Bothner so shift can be in place. */ ! 701: ! 702: static Bigint * ! 703: lshift ! 704: #ifdef KR_headers ! 705: (b, k) Bigint *b; int k; ! 706: #else ! 707: (Bigint *b, int k) ! 708: #endif ! 709: { ! 710: int i; ! 711: unsigned long *x, *x1, *xe; ! 712: int old_wds = b->wds; ! 713: int n = k >> 5; ! 714: int k1 = b->k; ! 715: int n1 = n + old_wds + 1; ! 716: ! 717: if (k == 0) ! 718: return b; ! 719: ! 720: for(i = b->maxwds; n1 > i; i <<= 1) ! 721: k1++; ! 722: b = Brealloc(b, k1); ! 723: ! 724: xe = b->x; /* Source limit */ ! 725: x = xe + old_wds; /* Source pointer */ ! 726: x1 = x + n; /* Destination pointer */ ! 727: if (k &= 0x1f) { ! 728: int k1 = 32 - k; ! 729: unsigned long z = *--x; ! 730: if ((*x1 = (z >> k1)) != 0) { ! 731: ++n1; ! 732: } ! 733: while (x > xe) { ! 734: unsigned long w = *--x; ! 735: *--x1 = (z << k) | (w >> k1); ! 736: z = w; ! 737: } ! 738: *--x1 = z << k; ! 739: } ! 740: else ! 741: do { ! 742: *--x1 = *--x; ! 743: } while(x > xe); ! 744: while (x1 > xe) ! 745: *--x1 = 0; ! 746: b->wds = n1 - 1; ! 747: return b; ! 748: } ! 749: ! 750: static int ! 751: cmp ! 752: #ifdef KR_headers ! 753: (a, b) Bigint *a, *b; ! 754: #else ! 755: (Bigint *a, Bigint *b) ! 756: #endif ! 757: { ! 758: unsigned long *xa, *xa0, *xb, *xb0; ! 759: int i, j; ! 760: ! 761: i = a->wds; ! 762: j = b->wds; ! 763: #ifdef DEBUG ! 764: if (i > 1 && !a->x[i-1]) ! 765: Bug("cmp called with a->x[a->wds-1] == 0"); ! 766: if (j > 1 && !b->x[j-1]) ! 767: Bug("cmp called with b->x[b->wds-1] == 0"); ! 768: #endif ! 769: if (i -= j) ! 770: return i; ! 771: xa0 = a->x; ! 772: xa = xa0 + j; ! 773: xb0 = b->x; ! 774: xb = xb0 + j; ! 775: for(;;) { ! 776: if (*--xa != *--xb) ! 777: return *xa < *xb ? -1 : 1; ! 778: if (xa <= xa0) ! 779: break; ! 780: } ! 781: return 0; ! 782: } ! 783: ! 784: /* Do: c = a-b. */ ! 785: ! 786: static Bigint * ! 787: diff ! 788: #ifdef KR_headers ! 789: (c, a, b) Bigint *c, *a, *b; ! 790: #else ! 791: (Bigint *c, Bigint *a, Bigint *b) ! 792: #endif ! 793: { ! 794: int i, wa, wb; ! 795: long borrow, y; /* We need signed shifts here. */ ! 796: unsigned long *xa, *xae, *xb, *xbe, *xc; ! 797: long z; ! 798: ! 799: i = cmp(a,b); ! 800: if (!i) { ! 801: c = Brealloc(c, 0); ! 802: c->wds = 1; ! 803: c->x[0] = 0; ! 804: return c; ! 805: } ! 806: if (i < 0) { ! 807: Bigint *tmp = a; ! 808: a = b; ! 809: b = tmp; ! 810: i = 1; ! 811: } ! 812: else ! 813: i = 0; ! 814: c = Brealloc(c, a->k); ! 815: c->sign = i; ! 816: wa = a->wds; ! 817: xa = a->x; ! 818: xae = xa + wa; ! 819: wb = b->wds; ! 820: xb = b->x; ! 821: xbe = xb + wb; ! 822: xc = c->x; ! 823: borrow = 0; ! 824: do { ! 825: y = (*xa & 0xffff) - (*xb & 0xffff) + borrow; ! 826: borrow = y >> 16; ! 827: Sign_Extend(borrow, y); ! 828: z = (*xa++ >> 16) - (*xb++ >> 16) + borrow; ! 829: borrow = z >> 16; ! 830: Sign_Extend(borrow, z); ! 831: Storeinc(xc, z, y); ! 832: } ! 833: while(xb < xbe); ! 834: while(xa < xae) { ! 835: y = (*xa & 0xffff) + borrow; ! 836: borrow = y >> 16; ! 837: Sign_Extend(borrow, y); ! 838: z = (*xa++ >> 16) + borrow; ! 839: borrow = z >> 16; ! 840: Sign_Extend(borrow, z); ! 841: Storeinc(xc, z, y); ! 842: } ! 843: while(!*--xc) ! 844: wa--; ! 845: c->wds = wa; ! 846: return c; ! 847: } ! 848: ! 849: static double ! 850: ulp ! 851: #ifdef KR_headers ! 852: (x) double x; ! 853: #else ! 854: (double x) ! 855: #endif ! 856: { ! 857: register long L; ! 858: double a; ! 859: ! 860: L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; ! 861: #ifndef Sudden_Underflow ! 862: if (L > 0) { ! 863: #endif ! 864: #ifdef IBM ! 865: L |= Exp_msk1 >> 4; ! 866: #endif ! 867: word0(a) = L; ! 868: word1(a) = 0; ! 869: #ifndef Sudden_Underflow ! 870: } ! 871: else { ! 872: L = -L >> Exp_shift; ! 873: if (L < Exp_shift) { ! 874: word0(a) = 0x80000 >> L; ! 875: word1(a) = 0; ! 876: } ! 877: else { ! 878: word0(a) = 0; ! 879: L -= Exp_shift; ! 880: word1(a) = L >= 31 ? 1 : 1 << 31 - L; ! 881: } ! 882: } ! 883: #endif ! 884: return a; ! 885: } ! 886: ! 887: static double ! 888: b2d ! 889: #ifdef KR_headers ! 890: (a, e) Bigint *a; int *e; ! 891: #else ! 892: (Bigint *a, int *e) ! 893: #endif ! 894: { ! 895: unsigned long *xa, *xa0, w, y, z; ! 896: int k; ! 897: double d; ! 898: #ifdef VAX ! 899: unsigned long d0, d1; ! 900: #else ! 901: #define d0 word0(d) ! 902: #define d1 word1(d) ! 903: #endif ! 904: ! 905: xa0 = a->x; ! 906: xa = xa0 + a->wds; ! 907: y = *--xa; ! 908: #ifdef DEBUG ! 909: if (!y) Bug("zero y in b2d"); ! 910: #endif ! 911: k = hi0bits(y); ! 912: *e = 32 - k; ! 913: if (k < Ebits) { ! 914: d0 = Exp_1 | y >> Ebits - k; ! 915: w = xa > xa0 ? *--xa : 0; ! 916: d1 = y << (32-Ebits) + k | w >> Ebits - k; ! 917: goto ret_d; ! 918: } ! 919: z = xa > xa0 ? *--xa : 0; ! 920: if (k -= Ebits) { ! 921: d0 = Exp_1 | y << k | z >> 32 - k; ! 922: y = xa > xa0 ? *--xa : 0; ! 923: d1 = z << k | y >> 32 - k; ! 924: } ! 925: else { ! 926: d0 = Exp_1 | y; ! 927: d1 = z; ! 928: } ! 929: ret_d: ! 930: #ifdef VAX ! 931: word0(d) = d0 >> 16 | d0 << 16; ! 932: word1(d) = d1 >> 16 | d1 << 16; ! 933: #else ! 934: #undef d0 ! 935: #undef d1 ! 936: #endif ! 937: return d; ! 938: } ! 939: ! 940: static Bigint * ! 941: d2b ! 942: #ifdef KR_headers ! 943: (result, d, e, bits) Bigint *result; double d; int *e, *bits; ! 944: #else ! 945: (Bigint *result, double d, int *e, int *bits) ! 946: #endif ! 947: { ! 948: int de, i, k; ! 949: unsigned long *x, y, z; ! 950: #ifdef VAX ! 951: unsigned long d0, d1; ! 952: d0 = word0(d) >> 16 | word0(d) << 16; ! 953: d1 = word1(d) >> 16 | word1(d) << 16; ! 954: #else ! 955: #define d0 word0(d) ! 956: #define d1 word1(d) ! 957: #endif ! 958: ! 959: result = Brealloc(result, 1); ! 960: x = result->x; ! 961: ! 962: z = d0 & Frac_mask; ! 963: d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ ! 964: ! 965: de = (int)(d0 >> Exp_shift); /* The exponent part of d. */ ! 966: ! 967: /* Put back the suppressed high-order bit, if normalized. */ ! 968: #ifndef IBM ! 969: #ifndef Sudden_Underflow ! 970: if (de) ! 971: #endif ! 972: z |= Exp_msk11; ! 973: #endif ! 974: ! 975: if (y = d1) { ! 976: if (k = lo0bits(&y)) { ! 977: x[0] = y | z << 32 - k; ! 978: z >>= k; ! 979: } ! 980: else ! 981: x[0] = y; ! 982: i = result->wds = (x[1] = z) ? 2 : 1; ! 983: } ! 984: else { ! 985: #ifdef DEBUG ! 986: if (!z) ! 987: Bug("Zero passed to d2b"); ! 988: #endif ! 989: k = lo0bits(&z); ! 990: x[0] = z; ! 991: i = result->wds = 1; ! 992: k += 32; ! 993: } ! 994: #ifndef Sudden_Underflow ! 995: if (de) { ! 996: #endif ! 997: #ifdef IBM ! 998: *e = (de - Bias - (P-1) << 2) + k; ! 999: *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask); ! 1000: #else ! 1001: *e = de - Bias - (P-1) + k; ! 1002: *bits = P - k; ! 1003: #endif ! 1004: #ifndef Sudden_Underflow ! 1005: } ! 1006: else { ! 1007: *e = de - Bias - (P-1) + 1 + k; ! 1008: *bits = 32*i - hi0bits(x[i-1]); ! 1009: } ! 1010: #endif ! 1011: return result; ! 1012: } ! 1013: #undef d0 ! 1014: #undef d1 ! 1015: ! 1016: static double ! 1017: ratio ! 1018: #ifdef KR_headers ! 1019: (a, b) Bigint *a, *b; ! 1020: #else ! 1021: (Bigint *a, Bigint *b) ! 1022: #endif ! 1023: { ! 1024: double da, db; ! 1025: int k, ka, kb; ! 1026: ! 1027: da = b2d(a, &ka); ! 1028: db = b2d(b, &kb); ! 1029: k = ka - kb + 32*(a->wds - b->wds); ! 1030: #ifdef IBM ! 1031: if (k > 0) { ! 1032: word0(da) += (k >> 2)*Exp_msk1; ! 1033: if (k &= 3) ! 1034: da *= 1 << k; ! 1035: } ! 1036: else { ! 1037: k = -k; ! 1038: word0(db) += (k >> 2)*Exp_msk1; ! 1039: if (k &= 3) ! 1040: db *= 1 << k; ! 1041: } ! 1042: #else ! 1043: if (k > 0) ! 1044: word0(da) += k*Exp_msk1; ! 1045: else { ! 1046: k = -k; ! 1047: word0(db) += k*Exp_msk1; ! 1048: } ! 1049: #endif ! 1050: return da / db; ! 1051: } ! 1052: ! 1053: static double ! 1054: tens[] = { ! 1055: 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, ! 1056: 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, ! 1057: 1e20, 1e21, 1e22 ! 1058: #ifdef VAX ! 1059: , 1e23, 1e24 ! 1060: #endif ! 1061: }; ! 1062: ! 1063: static double ! 1064: #ifdef IEEE_Arith ! 1065: bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; ! 1066: static double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 }; ! 1067: #define n_bigtens 5 ! 1068: #else ! 1069: #ifdef IBM ! 1070: bigtens[] = { 1e16, 1e32, 1e64 }; ! 1071: static double tinytens[] = { 1e-16, 1e-32, 1e-64 }; ! 1072: #define n_bigtens 3 ! 1073: #else ! 1074: bigtens[] = { 1e16, 1e32 }; ! 1075: static double tinytens[] = { 1e-16, 1e-32 }; ! 1076: #define n_bigtens 2 ! 1077: #endif ! 1078: #endif ! 1079: ! 1080: double ! 1081: _IO_strtod ! 1082: #ifdef KR_headers ! 1083: (s00, se) CONST char *s00; char **se; ! 1084: #else ! 1085: (CONST char *s00, char **se) ! 1086: #endif ! 1087: { ! 1088: int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, ! 1089: e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; ! 1090: CONST char *s, *s0, *s1; ! 1091: double aadj, aadj1, adj, rv, rv0; ! 1092: long L; ! 1093: unsigned long y, z; ! 1094: Bigint _bb, _b_avail, _bd, _bd0, _bs, _delta; ! 1095: Bigint *bb = Binit(&_bb); ! 1096: Bigint *bd = Binit(&_bd); ! 1097: Bigint *bd0 = Binit(&_bd0); ! 1098: Bigint *bs = Binit(&_bs); ! 1099: Bigint *b_avail = Binit(&_b_avail); ! 1100: Bigint *delta = Binit(&_delta); ! 1101: ! 1102: TEST_ENDIANNESS; ! 1103: sign = nz0 = nz = 0; ! 1104: rv = 0.; ! 1105: for(s = s00;;s++) switch(*s) { ! 1106: case '-': ! 1107: sign = 1; ! 1108: /* no break */ ! 1109: case '+': ! 1110: if (*++s) ! 1111: goto break2; ! 1112: /* no break */ ! 1113: case 0: ! 1114: s = s00; ! 1115: goto ret; ! 1116: case '\t': ! 1117: case '\n': ! 1118: case '\v': ! 1119: case '\f': ! 1120: case '\r': ! 1121: case ' ': ! 1122: continue; ! 1123: default: ! 1124: goto break2; ! 1125: } ! 1126: break2: ! 1127: if (*s == '0') { ! 1128: nz0 = 1; ! 1129: while(*++s == '0') ; ! 1130: if (!*s) ! 1131: goto ret; ! 1132: } ! 1133: s0 = s; ! 1134: y = z = 0; ! 1135: for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) ! 1136: if (nd < 9) ! 1137: y = 10*y + c - '0'; ! 1138: else if (nd < 16) ! 1139: z = 10*z + c - '0'; ! 1140: nd0 = nd; ! 1141: if (c == '.') { ! 1142: c = *++s; ! 1143: if (!nd) { ! 1144: for(; c == '0'; c = *++s) ! 1145: nz++; ! 1146: if (c > '0' && c <= '9') { ! 1147: s0 = s; ! 1148: nf += nz; ! 1149: nz = 0; ! 1150: goto have_dig; ! 1151: } ! 1152: goto dig_done; ! 1153: } ! 1154: for(; c >= '0' && c <= '9'; c = *++s) { ! 1155: have_dig: ! 1156: nz++; ! 1157: if (c -= '0') { ! 1158: nf += nz; ! 1159: for(i = 1; i < nz; i++) ! 1160: if (nd++ < 9) ! 1161: y *= 10; ! 1162: else if (nd <= DBL_DIG + 1) ! 1163: z *= 10; ! 1164: if (nd++ < 9) ! 1165: y = 10*y + c; ! 1166: else if (nd <= DBL_DIG + 1) ! 1167: z = 10*z + c; ! 1168: nz = 0; ! 1169: } ! 1170: } ! 1171: } ! 1172: dig_done: ! 1173: e = 0; ! 1174: if (c == 'e' || c == 'E') { ! 1175: if (!nd && !nz && !nz0) { ! 1176: s = s00; ! 1177: goto ret; ! 1178: } ! 1179: s00 = s; ! 1180: esign = 0; ! 1181: switch(c = *++s) { ! 1182: case '-': ! 1183: esign = 1; ! 1184: case '+': ! 1185: c = *++s; ! 1186: } ! 1187: if (c >= '0' && c <= '9') { ! 1188: while(c == '0') ! 1189: c = *++s; ! 1190: if (c > '0' && c <= '9') { ! 1191: e = c - '0'; ! 1192: s1 = s; ! 1193: while((c = *++s) >= '0' && c <= '9') ! 1194: e = 10*e + c - '0'; ! 1195: if (s - s1 > 8) ! 1196: /* Avoid confusion from exponents ! 1197: * so large that e might overflow. ! 1198: */ ! 1199: e = 9999999; ! 1200: if (esign) ! 1201: e = -e; ! 1202: } ! 1203: else ! 1204: e = 0; ! 1205: } ! 1206: else ! 1207: s = s00; ! 1208: } ! 1209: if (!nd) { ! 1210: if (!nz && !nz0) ! 1211: s = s00; ! 1212: goto ret; ! 1213: } ! 1214: e1 = e -= nf; ! 1215: ! 1216: /* Now we have nd0 digits, starting at s0, followed by a ! 1217: * decimal point, followed by nd-nd0 digits. The number we're ! 1218: * after is the integer represented by those digits times ! 1219: * 10**e */ ! 1220: ! 1221: if (!nd0) ! 1222: nd0 = nd; ! 1223: k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; ! 1224: rv = y; ! 1225: if (k > 9) ! 1226: rv = tens[k - 9] * rv + z; ! 1227: if (nd <= DBL_DIG ! 1228: #ifndef RND_PRODQUOT ! 1229: && FLT_ROUNDS == 1 ! 1230: #endif ! 1231: ) { ! 1232: if (!e) ! 1233: goto ret; ! 1234: if (e > 0) { ! 1235: if (e <= Ten_pmax) { ! 1236: #ifdef VAX ! 1237: goto vax_ovfl_check; ! 1238: #else ! 1239: /* rv = */ rounded_product(rv, tens[e]); ! 1240: goto ret; ! 1241: #endif ! 1242: } ! 1243: i = DBL_DIG - nd; ! 1244: if (e <= Ten_pmax + i) { ! 1245: /* A fancier test would sometimes let us do ! 1246: * this for larger i values. ! 1247: */ ! 1248: e -= i; ! 1249: rv *= tens[i]; ! 1250: #ifdef VAX ! 1251: /* VAX exponent range is so narrow we must ! 1252: * worry about overflow here... ! 1253: */ ! 1254: vax_ovfl_check: ! 1255: word0(rv) -= P*Exp_msk1; ! 1256: /* rv = */ rounded_product(rv, tens[e]); ! 1257: if ((word0(rv) & Exp_mask) ! 1258: > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) ! 1259: goto ovfl; ! 1260: word0(rv) += P*Exp_msk1; ! 1261: #else ! 1262: /* rv = */ rounded_product(rv, tens[e]); ! 1263: #endif ! 1264: goto ret; ! 1265: } ! 1266: } ! 1267: #ifndef Inaccurate_Divide ! 1268: else if (e >= -Ten_pmax) { ! 1269: /* rv = */ rounded_quotient(rv, tens[-e]); ! 1270: goto ret; ! 1271: } ! 1272: #endif ! 1273: } ! 1274: e1 += nd - k; ! 1275: ! 1276: /* Get starting approximation = rv * 10**e1 */ ! 1277: ! 1278: if (e1 > 0) { ! 1279: if (i = e1 & 15) ! 1280: rv *= tens[i]; ! 1281: if (e1 &= ~15) { ! 1282: if (e1 > DBL_MAX_10_EXP) { ! 1283: ovfl: ! 1284: errno = ERANGE; ! 1285: #if defined(sun) && !defined(__svr4__) ! 1286: /* SunOS defines HUGE_VAL as __infinity(), which is in libm. */ ! 1287: #undef HUGE_VAL ! 1288: #endif ! 1289: #ifndef HUGE_VAL ! 1290: #define HUGE_VAL 1.7976931348623157E+308 ! 1291: #endif ! 1292: rv = HUGE_VAL; ! 1293: goto ret; ! 1294: } ! 1295: if (e1 >>= 4) { ! 1296: for(j = 0; e1 > 1; j++, e1 >>= 1) ! 1297: if (e1 & 1) ! 1298: rv *= bigtens[j]; ! 1299: /* The last multiplication could overflow. */ ! 1300: word0(rv) -= P*Exp_msk1; ! 1301: rv *= bigtens[j]; ! 1302: if ((z = word0(rv) & Exp_mask) ! 1303: > Exp_msk1*(DBL_MAX_EXP+Bias-P)) ! 1304: goto ovfl; ! 1305: if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { ! 1306: /* set to largest number */ ! 1307: /* (Can't trust DBL_MAX) */ ! 1308: word0(rv) = Big0; ! 1309: word1(rv) = Big1; ! 1310: } ! 1311: else ! 1312: word0(rv) += P*Exp_msk1; ! 1313: } ! 1314: ! 1315: } ! 1316: } ! 1317: else if (e1 < 0) { ! 1318: e1 = -e1; ! 1319: if (i = e1 & 15) ! 1320: rv /= tens[i]; ! 1321: if (e1 &= ~15) { ! 1322: e1 >>= 4; ! 1323: for(j = 0; e1 > 1; j++, e1 >>= 1) ! 1324: if (e1 & 1) ! 1325: rv *= tinytens[j]; ! 1326: /* The last multiplication could underflow. */ ! 1327: rv0 = rv; ! 1328: rv *= tinytens[j]; ! 1329: if (!rv) { ! 1330: rv = 2.*rv0; ! 1331: rv *= tinytens[j]; ! 1332: if (!rv) { ! 1333: undfl: ! 1334: rv = 0.; ! 1335: errno = ERANGE; ! 1336: goto ret; ! 1337: } ! 1338: word0(rv) = Tiny0; ! 1339: word1(rv) = Tiny1; ! 1340: /* The refinement below will clean ! 1341: * this approximation up. ! 1342: */ ! 1343: } ! 1344: } ! 1345: } ! 1346: ! 1347: /* Now the hard part -- adjusting rv to the correct value.*/ ! 1348: ! 1349: /* Put digits into bd: true value = bd * 10^e */ ! 1350: ! 1351: bd0 = s2b(bd0, s0, nd0, nd, y); ! 1352: bd = Brealloc(bd, bd0->k); ! 1353: ! 1354: for(;;) { ! 1355: Bcopy(bd, bd0); ! 1356: bb = d2b(bb, rv, &bbe, &bbbits); /* rv = bb * 2^bbe */ ! 1357: bs = i2b(bs, 1); ! 1358: ! 1359: if (e >= 0) { ! 1360: bb2 = bb5 = 0; ! 1361: bd2 = bd5 = e; ! 1362: } ! 1363: else { ! 1364: bb2 = bb5 = -e; ! 1365: bd2 = bd5 = 0; ! 1366: } ! 1367: if (bbe >= 0) ! 1368: bb2 += bbe; ! 1369: else ! 1370: bd2 -= bbe; ! 1371: bs2 = bb2; ! 1372: #ifdef Sudden_Underflow ! 1373: #ifdef IBM ! 1374: j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3); ! 1375: #else ! 1376: j = P + 1 - bbbits; ! 1377: #endif ! 1378: #else ! 1379: i = bbe + bbbits - 1; /* logb(rv) */ ! 1380: if (i < Emin) /* denormal */ ! 1381: j = bbe + (P-Emin); ! 1382: else ! 1383: j = P + 1 - bbbits; ! 1384: #endif ! 1385: bb2 += j; ! 1386: bd2 += j; ! 1387: i = bb2 < bd2 ? bb2 : bd2; ! 1388: if (i > bs2) ! 1389: i = bs2; ! 1390: if (i > 0) { ! 1391: bb2 -= i; ! 1392: bd2 -= i; ! 1393: bs2 -= i; ! 1394: } ! 1395: if (bb5 > 0) { ! 1396: Bigint *b_tmp; ! 1397: bs = pow5mult(bs, bb5); ! 1398: b_tmp = mult(b_avail, bs, bb); ! 1399: b_avail = bb; ! 1400: bb = b_tmp; ! 1401: } ! 1402: if (bb2 > 0) ! 1403: bb = lshift(bb, bb2); ! 1404: if (bd5 > 0) ! 1405: bd = pow5mult(bd, bd5); ! 1406: if (bd2 > 0) ! 1407: bd = lshift(bd, bd2); ! 1408: if (bs2 > 0) ! 1409: bs = lshift(bs, bs2); ! 1410: delta = diff(delta, bb, bd); ! 1411: dsign = delta->sign; ! 1412: delta->sign = 0; ! 1413: i = cmp(delta, bs); ! 1414: if (i < 0) { ! 1415: /* Error is less than half an ulp -- check for ! 1416: * special case of mantissa a power of two. ! 1417: */ ! 1418: if (dsign || word1(rv) || word0(rv) & Bndry_mask) ! 1419: break; ! 1420: delta = lshift(delta,Log2P); ! 1421: if (cmp(delta, bs) > 0) ! 1422: goto drop_down; ! 1423: break; ! 1424: } ! 1425: if (i == 0) { ! 1426: /* exactly half-way between */ ! 1427: if (dsign) { ! 1428: if ((word0(rv) & Bndry_mask1) == Bndry_mask1 ! 1429: && word1(rv) == 0xffffffff) { ! 1430: /*boundary case -- increment exponent*/ ! 1431: word0(rv) = (word0(rv) & Exp_mask) ! 1432: + Exp_msk1 ! 1433: #ifdef IBM ! 1434: | Exp_msk1 >> 4 ! 1435: #endif ! 1436: ; ! 1437: word1(rv) = 0; ! 1438: break; ! 1439: } ! 1440: } ! 1441: else if (!(word0(rv) & Bndry_mask) && !word1(rv)) { ! 1442: drop_down: ! 1443: /* boundary case -- decrement exponent */ ! 1444: #ifdef Sudden_Underflow ! 1445: L = word0(rv) & Exp_mask; ! 1446: #ifdef IBM ! 1447: if (L < Exp_msk1) ! 1448: #else ! 1449: if (L <= Exp_msk1) ! 1450: #endif ! 1451: goto undfl; ! 1452: L -= Exp_msk1; ! 1453: #else ! 1454: L = (word0(rv) & Exp_mask) - Exp_msk1; ! 1455: #endif ! 1456: word0(rv) = L | Bndry_mask1; ! 1457: word1(rv) = 0xffffffff; ! 1458: #ifdef IBM ! 1459: continue; ! 1460: #else ! 1461: break; ! 1462: #endif ! 1463: } ! 1464: #ifndef ROUND_BIASED ! 1465: if (!(word1(rv) & LSB)) ! 1466: break; ! 1467: #endif ! 1468: if (dsign) ! 1469: rv += ulp(rv); ! 1470: #ifndef ROUND_BIASED ! 1471: else { ! 1472: rv -= ulp(rv); ! 1473: #ifndef Sudden_Underflow ! 1474: if (!rv) ! 1475: goto undfl; ! 1476: #endif ! 1477: } ! 1478: #endif ! 1479: break; ! 1480: } ! 1481: if ((aadj = ratio(delta, bs)) <= 2.) { ! 1482: if (dsign) ! 1483: aadj = aadj1 = 1.; ! 1484: else if (word1(rv) || word0(rv) & Bndry_mask) { ! 1485: #ifndef Sudden_Underflow ! 1486: if (word1(rv) == Tiny1 && !word0(rv)) ! 1487: goto undfl; ! 1488: #endif ! 1489: aadj = 1.; ! 1490: aadj1 = -1.; ! 1491: } ! 1492: else { ! 1493: /* special case -- power of FLT_RADIX to be */ ! 1494: /* rounded down... */ ! 1495: ! 1496: if (aadj < 2./FLT_RADIX) ! 1497: aadj = 1./FLT_RADIX; ! 1498: else ! 1499: aadj *= 0.5; ! 1500: aadj1 = -aadj; ! 1501: } ! 1502: } ! 1503: else { ! 1504: aadj *= 0.5; ! 1505: aadj1 = dsign ? aadj : -aadj; ! 1506: #ifdef Check_FLT_ROUNDS ! 1507: switch(FLT_ROUNDS) { ! 1508: case 2: /* towards +infinity */ ! 1509: aadj1 -= 0.5; ! 1510: break; ! 1511: case 0: /* towards 0 */ ! 1512: case 3: /* towards -infinity */ ! 1513: aadj1 += 0.5; ! 1514: } ! 1515: #else ! 1516: if (FLT_ROUNDS == 0) ! 1517: aadj1 += 0.5; ! 1518: #endif ! 1519: } ! 1520: y = word0(rv) & Exp_mask; ! 1521: ! 1522: /* Check for overflow */ ! 1523: ! 1524: if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { ! 1525: rv0 = rv; ! 1526: word0(rv) -= P*Exp_msk1; ! 1527: adj = aadj1 * ulp(rv); ! 1528: rv += adj; ! 1529: if ((word0(rv) & Exp_mask) >= ! 1530: Exp_msk1*(DBL_MAX_EXP+Bias-P)) { ! 1531: if (word0(rv0) == Big0 && word1(rv0) == Big1) ! 1532: goto ovfl; ! 1533: word0(rv) = Big0; ! 1534: word1(rv) = Big1; ! 1535: continue; ! 1536: } ! 1537: else ! 1538: word0(rv) += P*Exp_msk1; ! 1539: } ! 1540: else { ! 1541: #ifdef Sudden_Underflow ! 1542: if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { ! 1543: rv0 = rv; ! 1544: word0(rv) += P*Exp_msk1; ! 1545: adj = aadj1 * ulp(rv); ! 1546: rv += adj; ! 1547: #ifdef IBM ! 1548: if ((word0(rv) & Exp_mask) < P*Exp_msk1) ! 1549: #else ! 1550: if ((word0(rv) & Exp_mask) <= P*Exp_msk1) ! 1551: #endif ! 1552: { ! 1553: if (word0(rv0) == Tiny0 ! 1554: && word1(rv0) == Tiny1) ! 1555: goto undfl; ! 1556: word0(rv) = Tiny0; ! 1557: word1(rv) = Tiny1; ! 1558: continue; ! 1559: } ! 1560: else ! 1561: word0(rv) -= P*Exp_msk1; ! 1562: } ! 1563: else { ! 1564: adj = aadj1 * ulp(rv); ! 1565: rv += adj; ! 1566: } ! 1567: #else ! 1568: /* Compute adj so that the IEEE rounding rules will ! 1569: * correctly round rv + adj in some half-way cases. ! 1570: * If rv * ulp(rv) is denormalized (i.e., ! 1571: * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid ! 1572: * trouble from bits lost to denormalization; ! 1573: * example: 1.2e-307 . ! 1574: */ ! 1575: if (y <= (P-1)*Exp_msk1 && aadj >= 1.) { ! 1576: aadj1 = (double)(int)(aadj + 0.5); ! 1577: if (!dsign) ! 1578: aadj1 = -aadj1; ! 1579: } ! 1580: adj = aadj1 * ulp(rv); ! 1581: rv += adj; ! 1582: #endif ! 1583: } ! 1584: z = word0(rv) & Exp_mask; ! 1585: if (y == z) { ! 1586: /* Can we stop now? */ ! 1587: L = (long)aadj; ! 1588: aadj -= L; ! 1589: /* The tolerances below are conservative. */ ! 1590: if (dsign || word1(rv) || word0(rv) & Bndry_mask) { ! 1591: if (aadj < .4999999 || aadj > .5000001) ! 1592: break; ! 1593: } ! 1594: else if (aadj < .4999999/FLT_RADIX) ! 1595: break; ! 1596: } ! 1597: } ! 1598: Bfree(bb); ! 1599: Bfree(bd); ! 1600: Bfree(bs); ! 1601: Bfree(bd0); ! 1602: Bfree(delta); ! 1603: Bfree(b_avail); ! 1604: ret: ! 1605: if (se) ! 1606: *se = (char *)s; ! 1607: return sign ? -rv : rv; ! 1608: } ! 1609: ! 1610: static int ! 1611: quorem ! 1612: #ifdef KR_headers ! 1613: (b, S) Bigint *b, *S; ! 1614: #else ! 1615: (Bigint *b, Bigint *S) ! 1616: #endif ! 1617: { ! 1618: int n; ! 1619: long borrow, y; ! 1620: unsigned long carry, q, ys; ! 1621: unsigned long *bx, *bxe, *sx, *sxe; ! 1622: long z; ! 1623: unsigned long si, zs; ! 1624: ! 1625: n = S->wds; ! 1626: #ifdef DEBUG ! 1627: /*debug*/ if (b->wds > n) ! 1628: /*debug*/ Bug("oversize b in quorem"); ! 1629: #endif ! 1630: if (b->wds < n) ! 1631: return 0; ! 1632: sx = S->x; ! 1633: sxe = sx + --n; ! 1634: bx = b->x; ! 1635: bxe = bx + n; ! 1636: q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ ! 1637: #ifdef DEBUG ! 1638: /*debug*/ if (q > 9) ! 1639: /*debug*/ Bug("oversized quotient in quorem"); ! 1640: #endif ! 1641: if (q) { ! 1642: borrow = 0; ! 1643: carry = 0; ! 1644: do { ! 1645: si = *sx++; ! 1646: ys = (si & 0xffff) * q + carry; ! 1647: zs = (si >> 16) * q + (ys >> 16); ! 1648: carry = zs >> 16; ! 1649: y = (*bx & 0xffff) - (ys & 0xffff) + borrow; ! 1650: borrow = y >> 16; ! 1651: Sign_Extend(borrow, y); ! 1652: z = (*bx >> 16) - (zs & 0xffff) + borrow; ! 1653: borrow = z >> 16; ! 1654: Sign_Extend(borrow, z); ! 1655: Storeinc(bx, z, y); ! 1656: } ! 1657: while(sx <= sxe); ! 1658: if (!*bxe) { ! 1659: bx = b->x; ! 1660: while(--bxe > bx && !*bxe) ! 1661: --n; ! 1662: b->wds = n; ! 1663: } ! 1664: } ! 1665: if (cmp(b, S) >= 0) { ! 1666: q++; ! 1667: borrow = 0; ! 1668: carry = 0; ! 1669: bx = b->x; ! 1670: sx = S->x; ! 1671: do { ! 1672: si = *sx++; ! 1673: ys = (si & 0xffff) + carry; ! 1674: zs = (si >> 16) + (ys >> 16); ! 1675: carry = zs >> 16; ! 1676: y = (*bx & 0xffff) - (ys & 0xffff) + borrow; ! 1677: borrow = y >> 16; ! 1678: Sign_Extend(borrow, y); ! 1679: z = (*bx >> 16) - (zs & 0xffff) + borrow; ! 1680: borrow = z >> 16; ! 1681: Sign_Extend(borrow, z); ! 1682: Storeinc(bx, z, y); ! 1683: } ! 1684: while(sx <= sxe); ! 1685: bx = b->x; ! 1686: bxe = bx + n; ! 1687: if (!*bxe) { ! 1688: while(--bxe > bx && !*bxe) ! 1689: --n; ! 1690: b->wds = n; ! 1691: } ! 1692: } ! 1693: return q; ! 1694: } ! 1695: ! 1696: /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. ! 1697: * ! 1698: * Inspired by "How to Print Floating-Point Numbers Accurately" by ! 1699: * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101]. ! 1700: * ! 1701: * Modifications: ! 1702: * 1. Rather than iterating, we use a simple numeric overestimate ! 1703: * to determine k = floor(log10(d)). We scale relevant ! 1704: * quantities using O(log2(k)) rather than O(k) multiplications. ! 1705: * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't ! 1706: * try to generate digits strictly left to right. Instead, we ! 1707: * compute with fewer bits and propagate the carry if necessary ! 1708: * when rounding the final digit up. This is often faster. ! 1709: * 3. Under the assumption that input will be rounded nearest, ! 1710: * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. ! 1711: * That is, we allow equality in stopping tests when the ! 1712: * round-nearest rule will give the same floating-point value ! 1713: * as would satisfaction of the stopping test with strict ! 1714: * inequality. ! 1715: * 4. We remove common factors of powers of 2 from relevant ! 1716: * quantities. ! 1717: * 5. When converting floating-point integers less than 1e16, ! 1718: * we use floating-point arithmetic rather than resorting ! 1719: * to multiple-precision integers. ! 1720: * 6. When asked to produce fewer than 15 digits, we first try ! 1721: * to get by with floating-point arithmetic; we resort to ! 1722: * multiple-precision integer arithmetic only if we cannot ! 1723: * guarantee that the floating-point calculation has given ! 1724: * the correctly rounded result. For k requested digits and ! 1725: * "uniformly" distributed input, the probability is ! 1726: * something like 10^(k-15) that we must resort to the long ! 1727: * calculation. ! 1728: */ ! 1729: ! 1730: char * ! 1731: _IO_dtoa ! 1732: #ifdef KR_headers ! 1733: (d, mode, ndigits, decpt, sign, rve) ! 1734: double d; int mode, ndigits, *decpt, *sign; char **rve; ! 1735: #else ! 1736: (double d, int mode, int ndigits, int *decpt, int *sign, char **rve) ! 1737: #endif ! 1738: { ! 1739: /* Arguments ndigits, decpt, sign are similar to those ! 1740: of ecvt and fcvt; trailing zeros are suppressed from ! 1741: the returned string. If not null, *rve is set to point ! 1742: to the end of the return value. If d is +-Infinity or NaN, ! 1743: then *decpt is set to 9999. ! 1744: ! 1745: mode: ! 1746: 0 ==> shortest string that yields d when read in ! 1747: and rounded to nearest. ! 1748: 1 ==> like 0, but with Steele & White stopping rule; ! 1749: e.g. with IEEE P754 arithmetic , mode 0 gives ! 1750: 1e23 whereas mode 1 gives 9.999999999999999e22. ! 1751: 2 ==> max(1,ndigits) significant digits. This gives a ! 1752: return value similar to that of ecvt, except ! 1753: that trailing zeros are suppressed. ! 1754: 3 ==> through ndigits past the decimal point. This ! 1755: gives a return value similar to that from fcvt, ! 1756: except that trailing zeros are suppressed, and ! 1757: ndigits can be negative. ! 1758: 4-9 should give the same return values as 2-3, i.e., ! 1759: 4 <= mode <= 9 ==> same return as mode ! 1760: 2 + (mode & 1). These modes are mainly for ! 1761: debugging; often they run slower but sometimes ! 1762: faster than modes 2-3. ! 1763: 4,5,8,9 ==> left-to-right digit generation. ! 1764: 6-9 ==> don't try fast floating-point estimate ! 1765: (if applicable). ! 1766: ! 1767: Values of mode other than 0-9 are treated as mode 0. ! 1768: ! 1769: Sufficient space is allocated to the return value ! 1770: to hold the suppressed trailing zeros. ! 1771: */ ! 1772: ! 1773: int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, ! 1774: j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, ! 1775: spec_case, try_quick; ! 1776: long L; ! 1777: #ifndef Sudden_Underflow ! 1778: int denorm; ! 1779: #endif ! 1780: Bigint _b_avail, _b, _mhi, _mlo, _S; ! 1781: Bigint *b_avail = Binit(&_b_avail); ! 1782: Bigint *b = Binit(&_b); ! 1783: Bigint *S = Binit(&_S); ! 1784: /* mhi and mlo are only set and used if leftright. */ ! 1785: Bigint *mhi = NULL, *mlo = NULL; ! 1786: double d2, ds, eps; ! 1787: char *s, *s0; ! 1788: static Bigint *result = NULL; ! 1789: static int result_k; ! 1790: ! 1791: TEST_ENDIANNESS; ! 1792: if (result) { ! 1793: result->k = result_k; ! 1794: result->maxwds = 1 << result_k; ! 1795: } ! 1796: ! 1797: if (word0(d) & Sign_bit) { ! 1798: /* set sign for everything, including 0's and NaNs */ ! 1799: *sign = 1; ! 1800: word0(d) &= ~Sign_bit; /* clear sign bit */ ! 1801: } ! 1802: else ! 1803: *sign = 0; ! 1804: ! 1805: #if defined(IEEE_Arith) + defined(VAX) ! 1806: #ifdef IEEE_Arith ! 1807: if ((word0(d) & Exp_mask) == Exp_mask) ! 1808: #else ! 1809: if (word0(d) == 0x8000) ! 1810: #endif ! 1811: { ! 1812: /* Infinity or NaN */ ! 1813: *decpt = 9999; ! 1814: #ifdef IEEE_Arith ! 1815: if (!word1(d) && !(word0(d) & 0xfffff)) ! 1816: { ! 1817: s = "Infinity"; ! 1818: if (rve) ! 1819: *rve = s + 8; ! 1820: } ! 1821: else ! 1822: #endif ! 1823: { ! 1824: s = "NaN"; ! 1825: if (rve) ! 1826: *rve = s +3; ! 1827: } ! 1828: return s; ! 1829: } ! 1830: #endif ! 1831: #ifdef IBM ! 1832: d += 0; /* normalize */ ! 1833: #endif ! 1834: if (!d) { ! 1835: *decpt = 1; ! 1836: s = "0"; ! 1837: if (rve) ! 1838: *rve = s + 1; ! 1839: return s; ! 1840: } ! 1841: ! 1842: b = d2b(b, d, &be, &bbits); ! 1843: i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); ! 1844: #ifndef Sudden_Underflow ! 1845: if (i) { ! 1846: #endif ! 1847: d2 = d; ! 1848: word0(d2) &= Frac_mask1; ! 1849: word0(d2) |= Exp_11; ! 1850: #ifdef IBM ! 1851: if (j = 11 - hi0bits(word0(d2) & Frac_mask)) ! 1852: d2 /= 1 << j; ! 1853: #endif ! 1854: ! 1855: i -= Bias; ! 1856: #ifdef IBM ! 1857: i <<= 2; ! 1858: i += j; ! 1859: #endif ! 1860: #ifndef Sudden_Underflow ! 1861: denorm = 0; ! 1862: } ! 1863: else { ! 1864: /* d is denormalized */ ! 1865: unsigned long x; ! 1866: ! 1867: i = bbits + be + (Bias + (P-1) - 1); ! 1868: x = i > 32 ? word0(d) << 64 - i | word1(d) >> i - 32 ! 1869: : word1(d) << 32 - i; ! 1870: d2 = x; ! 1871: word0(d2) -= 31*Exp_msk1; /* adjust exponent */ ! 1872: i -= (Bias + (P-1) - 1) + 1; ! 1873: denorm = 1; ! 1874: } ! 1875: #endif ! 1876: ! 1877: /* Now i is the unbiased base-2 exponent. */ ! 1878: ! 1879: /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 ! 1880: * log10(x) = log(x) / log(10) ! 1881: * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) ! 1882: * log10(d) = i*log(2)/log(10) + log10(d2) ! 1883: * ! 1884: * This suggests computing an approximation k to log10(d) by ! 1885: * ! 1886: * k = i*0.301029995663981 ! 1887: * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); ! 1888: * ! 1889: * We want k to be too large rather than too small. ! 1890: * The error in the first-order Taylor series approximation ! 1891: * is in our favor, so we just round up the constant enough ! 1892: * to compensate for any error in the multiplication of ! 1893: * (i) by 0.301029995663981; since |i| <= 1077, ! 1894: * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, ! 1895: * adding 1e-13 to the constant term more than suffices. ! 1896: * Hence we adjust the constant term to 0.1760912590558. ! 1897: * (We could get a more accurate k by invoking log10, ! 1898: * but this is probably not worthwhile.) ! 1899: */ ! 1900: ! 1901: ds = (d2-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; ! 1902: k = (int)ds; ! 1903: if (ds < 0. && ds != k) ! 1904: k--; /* want k = floor(ds) */ ! 1905: k_check = 1; ! 1906: if (k >= 0 && k <= Ten_pmax) { ! 1907: if (d < tens[k]) ! 1908: k--; ! 1909: k_check = 0; ! 1910: } ! 1911: j = bbits - i - 1; ! 1912: if (j >= 0) { ! 1913: b2 = 0; ! 1914: s2 = j; ! 1915: } ! 1916: else { ! 1917: b2 = -j; ! 1918: s2 = 0; ! 1919: } ! 1920: if (k >= 0) { ! 1921: b5 = 0; ! 1922: s5 = k; ! 1923: s2 += k; ! 1924: } ! 1925: else { ! 1926: b2 -= k; ! 1927: b5 = -k; ! 1928: s5 = 0; ! 1929: } ! 1930: if (mode < 0 || mode > 9) ! 1931: mode = 0; ! 1932: try_quick = 1; ! 1933: if (mode > 5) { ! 1934: mode -= 4; ! 1935: try_quick = 0; ! 1936: } ! 1937: leftright = 1; ! 1938: switch(mode) { ! 1939: case 0: ! 1940: case 1: ! 1941: ilim = ilim1 = -1; ! 1942: i = 18; ! 1943: ndigits = 0; ! 1944: break; ! 1945: case 2: ! 1946: leftright = 0; ! 1947: /* no break */ ! 1948: case 4: ! 1949: if (ndigits <= 0) ! 1950: ndigits = 1; ! 1951: ilim = ilim1 = i = ndigits; ! 1952: break; ! 1953: case 3: ! 1954: leftright = 0; ! 1955: /* no break */ ! 1956: case 5: ! 1957: i = ndigits + k + 1; ! 1958: ilim = i; ! 1959: ilim1 = i - 1; ! 1960: if (i <= 0) ! 1961: i = 1; ! 1962: } ! 1963: /* i is now an upper bound of the number of digits to generate. */ ! 1964: j = sizeof(unsigned long) * (1<<BIGINT_MINIMUM_K); ! 1965: /* The test is <= so as to allow room for the final '\0'. */ ! 1966: for(result_k = BIGINT_MINIMUM_K; BIGINT_HEADER_SIZE + j <= i; ! 1967: j <<= 1) result_k++; ! 1968: result = Brealloc(result, result_k); ! 1969: s = s0 = (char *)result; ! 1970: ! 1971: if (ilim >= 0 && ilim <= Quick_max && try_quick) { ! 1972: ! 1973: /* Try to get by with floating-point arithmetic. */ ! 1974: ! 1975: i = 0; ! 1976: d2 = d; ! 1977: k0 = k; ! 1978: ilim0 = ilim; ! 1979: ieps = 2; /* conservative */ ! 1980: if (k > 0) { ! 1981: ds = tens[k&0xf]; ! 1982: j = k >> 4; ! 1983: if (j & Bletch) { ! 1984: /* prevent overflows */ ! 1985: j &= Bletch - 1; ! 1986: d /= bigtens[n_bigtens-1]; ! 1987: ieps++; ! 1988: } ! 1989: for(; j; j >>= 1, i++) ! 1990: if (j & 1) { ! 1991: ieps++; ! 1992: ds *= bigtens[i]; ! 1993: } ! 1994: d /= ds; ! 1995: } ! 1996: else if (j1 = -k) { ! 1997: d *= tens[j1 & 0xf]; ! 1998: for(j = j1 >> 4; j; j >>= 1, i++) ! 1999: if (j & 1) { ! 2000: ieps++; ! 2001: d *= bigtens[i]; ! 2002: } ! 2003: } ! 2004: if (k_check && d < 1. && ilim > 0) { ! 2005: if (ilim1 <= 0) ! 2006: goto fast_failed; ! 2007: ilim = ilim1; ! 2008: k--; ! 2009: d *= 10.; ! 2010: ieps++; ! 2011: } ! 2012: eps = ieps*d + 7.; ! 2013: word0(eps) -= (P-1)*Exp_msk1; ! 2014: if (ilim == 0) { ! 2015: d -= 5.; ! 2016: if (d > eps) ! 2017: goto one_digit; ! 2018: if (d < -eps) ! 2019: goto no_digits; ! 2020: goto fast_failed; ! 2021: } ! 2022: #ifndef No_leftright ! 2023: if (leftright) { ! 2024: /* Use Steele & White method of only ! 2025: * generating digits needed. ! 2026: */ ! 2027: eps = 0.5/tens[ilim-1] - eps; ! 2028: for(i = 0;;) { ! 2029: L = (long)d; ! 2030: d -= L; ! 2031: *s++ = '0' + (int)L; ! 2032: if (d < eps) ! 2033: goto ret1; ! 2034: if (1. - d < eps) ! 2035: goto bump_up; ! 2036: if (++i >= ilim) ! 2037: break; ! 2038: eps *= 10.; ! 2039: d *= 10.; ! 2040: } ! 2041: } ! 2042: else { ! 2043: #endif ! 2044: /* Generate ilim digits, then fix them up. */ ! 2045: eps *= tens[ilim-1]; ! 2046: for(i = 1;; i++, d *= 10.) { ! 2047: L = (long)d; ! 2048: d -= L; ! 2049: *s++ = '0' + (int)L; ! 2050: if (i == ilim) { ! 2051: if (d > 0.5 + eps) ! 2052: goto bump_up; ! 2053: else if (d < 0.5 - eps) { ! 2054: while(*--s == '0'); ! 2055: s++; ! 2056: goto ret1; ! 2057: } ! 2058: break; ! 2059: } ! 2060: } ! 2061: #ifndef No_leftright ! 2062: } ! 2063: #endif ! 2064: fast_failed: ! 2065: s = s0; ! 2066: d = d2; ! 2067: k = k0; ! 2068: ilim = ilim0; ! 2069: } ! 2070: ! 2071: /* Do we have a "small" integer? */ ! 2072: ! 2073: if (be >= 0 && k <= Int_max) { ! 2074: /* Yes. */ ! 2075: ds = tens[k]; ! 2076: if (ndigits < 0 && ilim <= 0) { ! 2077: if (ilim < 0 || d <= 5*ds) ! 2078: goto no_digits; ! 2079: goto one_digit; ! 2080: } ! 2081: for(i = 1;; i++) { ! 2082: L = (long)(d / ds); ! 2083: d -= L*ds; ! 2084: #ifdef Check_FLT_ROUNDS ! 2085: /* If FLT_ROUNDS == 2, L will usually be high by 1 */ ! 2086: if (d < 0) { ! 2087: L--; ! 2088: d += ds; ! 2089: } ! 2090: #endif ! 2091: *s++ = '0' + (int)L; ! 2092: if (i == ilim) { ! 2093: d += d; ! 2094: if (d > ds || d == ds && L & 1) { ! 2095: bump_up: ! 2096: while(*--s == '9') ! 2097: if (s == s0) { ! 2098: k++; ! 2099: *s = '0'; ! 2100: break; ! 2101: } ! 2102: ++*s++; ! 2103: } ! 2104: break; ! 2105: } ! 2106: if (!(d *= 10.)) ! 2107: break; ! 2108: } ! 2109: goto ret1; ! 2110: } ! 2111: ! 2112: m2 = b2; ! 2113: m5 = b5; ! 2114: if (leftright) { ! 2115: if (mode < 2) { ! 2116: i = ! 2117: #ifndef Sudden_Underflow ! 2118: denorm ? be + (Bias + (P-1) - 1 + 1) : ! 2119: #endif ! 2120: #ifdef IBM ! 2121: 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3); ! 2122: #else ! 2123: 1 + P - bbits; ! 2124: #endif ! 2125: } ! 2126: else { ! 2127: j = ilim - 1; ! 2128: if (m5 >= j) ! 2129: m5 -= j; ! 2130: else { ! 2131: s5 += j -= m5; ! 2132: b5 += j; ! 2133: m5 = 0; ! 2134: } ! 2135: if ((i = ilim) < 0) { ! 2136: m2 -= i; ! 2137: i = 0; ! 2138: } ! 2139: } ! 2140: b2 += i; ! 2141: s2 += i; ! 2142: mhi = i2b(Binit(&_mhi), 1); ! 2143: } ! 2144: if (m2 > 0 && s2 > 0) { ! 2145: i = m2 < s2 ? m2 : s2; ! 2146: b2 -= i; ! 2147: m2 -= i; ! 2148: s2 -= i; ! 2149: } ! 2150: if (b5 > 0) { ! 2151: if (leftright) { ! 2152: if (m5 > 0) { ! 2153: Bigint *b_tmp; ! 2154: mhi = pow5mult(mhi, m5); ! 2155: b_tmp = mult(b_avail, mhi, b); ! 2156: b_avail = b; ! 2157: b = b_tmp; ! 2158: } ! 2159: if (j = b5 - m5) ! 2160: b = pow5mult(b, j); ! 2161: } ! 2162: else ! 2163: b = pow5mult(b, b5); ! 2164: } ! 2165: S = i2b(S, 1); ! 2166: if (s5 > 0) ! 2167: S = pow5mult(S, s5); ! 2168: ! 2169: /* Check for special case that d is a normalized power of 2. */ ! 2170: ! 2171: if (mode < 2) { ! 2172: if (!word1(d) && !(word0(d) & Bndry_mask) ! 2173: #ifndef Sudden_Underflow ! 2174: && word0(d) & Exp_mask ! 2175: #endif ! 2176: ) { ! 2177: /* The special case */ ! 2178: b2 += Log2P; ! 2179: s2 += Log2P; ! 2180: spec_case = 1; ! 2181: } ! 2182: else ! 2183: spec_case = 0; ! 2184: } ! 2185: ! 2186: /* Arrange for convenient computation of quotients: ! 2187: * shift left if necessary so divisor has 4 leading 0 bits. ! 2188: * ! 2189: * Perhaps we should just compute leading 28 bits of S once ! 2190: * and for all and pass them and a shift to quorem, so it ! 2191: * can do shifts and ors to compute the numerator for q. ! 2192: */ ! 2193: if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f) ! 2194: i = 32 - i; ! 2195: if (i > 4) { ! 2196: i -= 4; ! 2197: b2 += i; ! 2198: m2 += i; ! 2199: s2 += i; ! 2200: } ! 2201: else if (i < 4) { ! 2202: i += 28; ! 2203: b2 += i; ! 2204: m2 += i; ! 2205: s2 += i; ! 2206: } ! 2207: if (b2 > 0) ! 2208: b = lshift(b, b2); ! 2209: if (s2 > 0) ! 2210: S = lshift(S, s2); ! 2211: if (k_check) { ! 2212: if (cmp(b,S) < 0) { ! 2213: k--; ! 2214: b = multadd(b, 10, 0); /* we botched the k estimate */ ! 2215: if (leftright) ! 2216: mhi = multadd(mhi, 10, 0); ! 2217: ilim = ilim1; ! 2218: } ! 2219: } ! 2220: if (ilim <= 0 && mode > 2) { ! 2221: if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) { ! 2222: /* no digits, fcvt style */ ! 2223: no_digits: ! 2224: k = -1 - ndigits; ! 2225: goto ret; ! 2226: } ! 2227: one_digit: ! 2228: *s++ = '1'; ! 2229: k++; ! 2230: goto ret; ! 2231: } ! 2232: if (leftright) { ! 2233: if (m2 > 0) ! 2234: mhi = lshift(mhi, m2); ! 2235: ! 2236: /* Compute mlo -- check for special case ! 2237: * that d is a normalized power of 2. ! 2238: */ ! 2239: ! 2240: if (spec_case) { ! 2241: mlo = Brealloc(Binit(&_mlo), mhi->k); ! 2242: Bcopy(mlo, mhi); ! 2243: mhi = lshift(mhi, Log2P); ! 2244: } ! 2245: else ! 2246: mlo = mhi; ! 2247: ! 2248: for(i = 1;;i++) { ! 2249: dig = quorem(b,S) + '0'; ! 2250: /* Do we yet have the shortest decimal string ! 2251: * that will round to d? ! 2252: */ ! 2253: j = cmp(b, mlo); ! 2254: b_avail = diff(b_avail, S, mhi); /* b_avail = S - mi */ ! 2255: j1 = b_avail->sign ? 1 : cmp(b, b_avail); ! 2256: #ifndef ROUND_BIASED ! 2257: if (j1 == 0 && !mode && !(word1(d) & 1)) { ! 2258: if (dig == '9') ! 2259: goto round_9_up; ! 2260: if (j > 0) ! 2261: dig++; ! 2262: *s++ = dig; ! 2263: goto ret; ! 2264: } ! 2265: #endif ! 2266: if (j < 0 || j == 0 && !mode ! 2267: #ifndef ROUND_BIASED ! 2268: && !(word1(d) & 1) ! 2269: #endif ! 2270: ) { ! 2271: if (j1 > 0) { ! 2272: b = lshift(b, 1); ! 2273: j1 = cmp(b, S); ! 2274: if ((j1 > 0 || j1 == 0 && dig & 1) ! 2275: && dig++ == '9') ! 2276: goto round_9_up; ! 2277: } ! 2278: *s++ = dig; ! 2279: goto ret; ! 2280: } ! 2281: if (j1 > 0) { ! 2282: if (dig == '9') { /* possible if i == 1 */ ! 2283: round_9_up: ! 2284: *s++ = '9'; ! 2285: goto roundoff; ! 2286: } ! 2287: *s++ = dig + 1; ! 2288: goto ret; ! 2289: } ! 2290: *s++ = dig; ! 2291: if (i == ilim) ! 2292: break; ! 2293: b = multadd(b, 10, 0); ! 2294: if (mlo == mhi) ! 2295: mlo = mhi = multadd(mhi, 10, 0); ! 2296: else { ! 2297: mlo = multadd(mlo, 10, 0); ! 2298: mhi = multadd(mhi, 10, 0); ! 2299: } ! 2300: } ! 2301: } ! 2302: else ! 2303: for(i = 1;; i++) { ! 2304: *s++ = dig = quorem(b,S) + '0'; ! 2305: if (i >= ilim) ! 2306: break; ! 2307: b = multadd(b, 10, 0); ! 2308: } ! 2309: ! 2310: /* Round off last digit */ ! 2311: ! 2312: b = lshift(b, 1); ! 2313: j = cmp(b, S); ! 2314: if (j > 0 || j == 0 && dig & 1) { ! 2315: roundoff: ! 2316: while(*--s == '9') ! 2317: if (s == s0) { ! 2318: k++; ! 2319: *s++ = '1'; ! 2320: goto ret; ! 2321: } ! 2322: ++*s++; ! 2323: } ! 2324: else { ! 2325: while(*--s == '0'); ! 2326: s++; ! 2327: } ! 2328: ret: ! 2329: Bfree(b_avail); ! 2330: Bfree(S); ! 2331: if (mhi) { ! 2332: if (mlo && mlo != mhi) ! 2333: Bfree(mlo); ! 2334: Bfree(mhi); ! 2335: } ! 2336: ret1: ! 2337: Bfree(b); ! 2338: *s = 0; ! 2339: *decpt = k + 1; ! 2340: if (rve) ! 2341: *rve = s; ! 2342: return s0; ! 2343: } ! 2344: #endif /* USE_DTOA */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.