|
|
1.1 ! root 1: #include "fconv.h" ! 2: ! 3: /* strtod for IEEE-, VAX-, and IBM-arithmetic machines (dmg). ! 4: * ! 5: * This strtod returns a nearest machine number to the input decimal ! 6: * string (or sets errno to ERANGE). With IEEE arithmetic, ties are ! 7: * broken by the IEEE round-even rule. Otherwise ties are broken by ! 8: * biased rounding (add half and chop). ! 9: * ! 10: * Inspired loosely by William D. Clinger's paper "How to Read Floating ! 11: * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101]. ! 12: * ! 13: * Modifications: ! 14: * ! 15: * 1. We only require IEEE, IBM, or VAX double-precision ! 16: * arithmetic (not IEEE double-extended). ! 17: * 2. We get by with floating-point arithmetic in a case that ! 18: * Clinger missed -- when we're computing d * 10^n ! 19: * for a small integer d and the integer n is not too ! 20: * much larger than 22 (the maximum integer k for which ! 21: * we can represent 10^k exactly), we may be able to ! 22: * compute (d*10^k) * 10^(e-k) with just one roundoff. ! 23: * 3. Rather than a bit-at-a-time adjustment of the binary ! 24: * result in the hard case, we use floating-point ! 25: * arithmetic to determine the adjustment to within ! 26: * one bit; only in really hard cases do we need to ! 27: * compute a second residual. ! 28: * 4. Because of 3., we don't need a large table of powers of 10 ! 29: * for ten-to-e (just some small tables, e.g. of 10^k ! 30: * for 0 <= k <= 22). ! 31: */ ! 32: ! 33: #ifdef RND_PRODQUOT ! 34: #define rounded_product(a,b) a = rnd_prod(a, b) ! 35: #define rounded_quotient(a,b) a = rnd_quot(a, b) ! 36: extern double rnd_prod(double, double), rnd_quot(double, double); ! 37: #else ! 38: #define rounded_product(a,b) a *= b ! 39: #define rounded_quotient(a,b) a /= b ! 40: #endif ! 41: ! 42: static double ! 43: ulp(double xarg) ! 44: { ! 45: register long L; ! 46: Dul a; ! 47: Dul x; ! 48: ! 49: x.d = xarg; ! 50: L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; ! 51: #ifndef Sudden_Underflow ! 52: if (L > 0) { ! 53: #endif ! 54: #ifdef IBM ! 55: L |= Exp_msk1 >> 4; ! 56: #endif ! 57: word0(a) = L; ! 58: word1(a) = 0; ! 59: #ifndef Sudden_Underflow ! 60: } ! 61: else { ! 62: L = -L >> Exp_shift; ! 63: if (L < Exp_shift) { ! 64: word0(a) = 0x80000 >> L; ! 65: word1(a) = 0; ! 66: } ! 67: else { ! 68: word0(a) = 0; ! 69: L -= Exp_shift; ! 70: word1(a) = L >= 31 ? 1 : 1 << 31 - L; ! 71: } ! 72: } ! 73: #endif ! 74: return a.d; ! 75: } ! 76: ! 77: static Bigint * ! 78: s2b(CONST char *s, int nd0, int nd, unsigned long y9) ! 79: { ! 80: Bigint *b; ! 81: int i, k; ! 82: long x, y; ! 83: ! 84: x = (nd + 8) / 9; ! 85: for(k = 0, y = 1; x > y; y <<= 1, k++) ; ! 86: #ifdef Pack_32 ! 87: b = Balloc(k); ! 88: b->x[0] = y9; ! 89: b->wds = 1; ! 90: #else ! 91: b = Balloc(k+1); ! 92: b->x[0] = y9 & 0xffff; ! 93: b->wds = (b->x[1] = y9 >> 16) ? 2 : 1; ! 94: #endif ! 95: ! 96: i = 9; ! 97: if (9 < nd0) { ! 98: s += 9; ! 99: do b = multadd(b, 10, *s++ - '0'); ! 100: while(++i < nd0); ! 101: s++; ! 102: } ! 103: else ! 104: s += 10; ! 105: for(; i < nd; i++) ! 106: b = multadd(b, 10, *s++ - '0'); ! 107: return b; ! 108: } ! 109: ! 110: static double ! 111: b2d(Bigint *a, int *e) ! 112: { ! 113: unsigned long *xa, *xa0, w, y, z; ! 114: int k; ! 115: Dul d; ! 116: #ifdef VAX ! 117: unsigned long d0, d1; ! 118: #else ! 119: #define d0 word0(d) ! 120: #define d1 word1(d) ! 121: #endif ! 122: ! 123: xa0 = a->x; ! 124: xa = xa0 + a->wds; ! 125: y = *--xa; ! 126: #ifdef DEBUG ! 127: if (!y) Bug("zero y in b2d"); ! 128: #endif ! 129: k = hi0bits(y); ! 130: *e = 32 - k; ! 131: #ifdef Pack_32 ! 132: if (k < Ebits) { ! 133: d0 = Exp_1 | y >> Ebits - k; ! 134: w = xa > xa0 ? *--xa : 0; ! 135: d1 = y << (32-Ebits) + k | w >> Ebits - k; ! 136: goto ret_d; ! 137: } ! 138: z = xa > xa0 ? *--xa : 0; ! 139: if (k -= Ebits) { ! 140: d0 = Exp_1 | y << k | z >> 32 - k; ! 141: y = xa > xa0 ? *--xa : 0; ! 142: d1 = z << k | y >> 32 - k; ! 143: } ! 144: else { ! 145: d0 = Exp_1 | y; ! 146: d1 = z; ! 147: } ! 148: #else ! 149: if (k < Ebits + 16) { ! 150: z = xa > xa0 ? *--xa : 0; ! 151: d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k; ! 152: w = xa > xa0 ? *--xa : 0; ! 153: y = xa > xa0 ? *--xa : 0; ! 154: d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k; ! 155: goto ret_d; ! 156: } ! 157: z = xa > xa0 ? *--xa : 0; ! 158: w = xa > xa0 ? *--xa : 0; ! 159: k -= Ebits + 16; ! 160: d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k; ! 161: y = xa > xa0 ? *--xa : 0; ! 162: d1 = w << k + 16 | y << k; ! 163: #endif ! 164: ret_d: ! 165: #ifdef VAX ! 166: word0(d) = d0 >> 16 | d0 << 16; ! 167: word1(d) = d1 >> 16 | d1 << 16; ! 168: #else ! 169: #undef d0 ! 170: #undef d1 ! 171: #endif ! 172: return d.d; ! 173: } ! 174: ! 175: static double ! 176: ratio(Bigint *a, Bigint *b) ! 177: { ! 178: Dul da, db; ! 179: int k, ka, kb; ! 180: ! 181: da.d = b2d(a, &ka); ! 182: db.d = b2d(b, &kb); ! 183: #ifdef Pack_32 ! 184: k = ka - kb + 32*(a->wds - b->wds); ! 185: #else ! 186: k = ka - kb + 16*(a->wds - b->wds); ! 187: #endif ! 188: #ifdef IBM ! 189: if (k > 0) { ! 190: word0(da) += (k >> 2)*Exp_msk1; ! 191: if (k &= 3) ! 192: da *= 1 << k; ! 193: } ! 194: else { ! 195: k = -k; ! 196: word0(db) += (k >> 2)*Exp_msk1; ! 197: if (k &= 3) ! 198: db *= 1 << k; ! 199: } ! 200: #else ! 201: if (k > 0) ! 202: word0(da) += k*Exp_msk1; ! 203: else { ! 204: k = -k; ! 205: word0(db) += k*Exp_msk1; ! 206: } ! 207: #endif ! 208: return da.d / db.d; ! 209: } ! 210: ! 211: double ! 212: strtod(CONST char *s00, char **se) ! 213: { ! 214: int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, ! 215: e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; ! 216: CONST char *s, *s0, *s1; ! 217: double aadj, aadj1, adj; ! 218: Dul rv, rv0; ! 219: long L; ! 220: unsigned long y, z; ! 221: Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; ! 222: sign = nz0 = nz = 0; ! 223: rv.d = 0.; ! 224: for(s = s00;;s++) switch(*s) { ! 225: case '-': ! 226: sign = 1; ! 227: /* no break */ ! 228: case '+': ! 229: if (*++s) ! 230: goto break2; ! 231: /* no break */ ! 232: case 0: ! 233: s = s00; ! 234: goto ret; ! 235: case '\t': ! 236: case '\n': ! 237: case '\v': ! 238: case '\f': ! 239: case '\r': ! 240: case ' ': ! 241: continue; ! 242: default: ! 243: goto break2; ! 244: } ! 245: break2: ! 246: if (*s == '0') { ! 247: nz0 = 1; ! 248: while(*++s == '0') ; ! 249: if (!*s) ! 250: goto ret; ! 251: } ! 252: s0 = s; ! 253: y = z = 0; ! 254: for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) ! 255: if (nd < 9) ! 256: y = 10*y + c - '0'; ! 257: else if (nd < 16) ! 258: z = 10*z + c - '0'; ! 259: nd0 = nd; ! 260: if (c == '.') { ! 261: c = *++s; ! 262: if (!nd) { ! 263: for(; c == '0'; c = *++s) ! 264: nz++; ! 265: if (c > '0' && c <= '9') { ! 266: s0 = s; ! 267: nf += nz; ! 268: nz = 0; ! 269: goto have_dig; ! 270: } ! 271: goto dig_done; ! 272: } ! 273: for(; c >= '0' && c <= '9'; c = *++s) { ! 274: have_dig: ! 275: nz++; ! 276: if (c -= '0') { ! 277: nf += nz; ! 278: for(i = 1; i < nz; i++) ! 279: if (nd++ < 9) ! 280: y *= 10; ! 281: else if (nd <= DBL_DIG + 1) ! 282: z *= 10; ! 283: if (nd++ < 9) ! 284: y = 10*y + c; ! 285: else if (nd <= DBL_DIG + 1) ! 286: z = 10*z + c; ! 287: nz = 0; ! 288: } ! 289: } ! 290: } ! 291: dig_done: ! 292: e = 0; ! 293: if (c == 'e' || c == 'E') { ! 294: if (!nd && !nz && !nz0) { ! 295: s = s00; ! 296: goto ret; ! 297: } ! 298: s00 = s; ! 299: esign = 0; ! 300: switch(c = *++s) { ! 301: case '-': ! 302: esign = 1; ! 303: case '+': ! 304: c = *++s; ! 305: } ! 306: if (c >= '0' && c <= '9') { ! 307: while(c == '0') ! 308: c = *++s; ! 309: if (c > '0' && c <= '9') { ! 310: e = c - '0'; ! 311: s1 = s; ! 312: while((c = *++s) >= '0' && c <= '9') ! 313: e = 10*e + c - '0'; ! 314: if (s - s1 > 8) ! 315: /* Avoid confusion from exponents ! 316: * so large that e might overflow. ! 317: */ ! 318: e = 9999999; ! 319: if (esign) ! 320: e = -e; ! 321: } ! 322: else ! 323: e = 0; ! 324: } ! 325: else ! 326: s = s00; ! 327: } ! 328: if (!nd) { ! 329: if (!nz && !nz0) ! 330: s = s00; ! 331: goto ret; ! 332: } ! 333: e1 = e -= nf; ! 334: ! 335: /* Now we have nd0 digits, starting at s0, followed by a ! 336: * decimal point, followed by nd-nd0 digits. The number we're ! 337: * after is the integer represented by those digits times ! 338: * 10**e */ ! 339: ! 340: if (!nd0) ! 341: nd0 = nd; ! 342: k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; ! 343: rv.d = y; ! 344: if (k > 9) ! 345: rv.d = tens[k - 9] * rv.d + z; ! 346: if (nd <= DBL_DIG ! 347: #ifndef RND_PRODQUOT ! 348: && FLT_ROUNDS == 1 ! 349: #endif ! 350: ) { ! 351: if (!e) ! 352: goto ret; ! 353: if (e > 0) { ! 354: if (e <= Ten_pmax) { ! 355: #ifdef VAX ! 356: goto vax_ovfl_check; ! 357: #else ! 358: /* rv = */ rounded_product(rv.d, tens[e]); ! 359: goto ret; ! 360: #endif ! 361: } ! 362: i = DBL_DIG - nd; ! 363: if (e <= Ten_pmax + i) { ! 364: /* A fancier test would sometimes let us do ! 365: * this for larger i values. ! 366: */ ! 367: e -= i; ! 368: rv.d *= tens[i]; ! 369: #ifdef VAX ! 370: /* VAX exponent range is so narrow we must ! 371: * worry about overflow here... ! 372: */ ! 373: vax_ovfl_check: ! 374: word0(rv) -= P*Exp_msk1; ! 375: /* rv = */ rounded_product(rv.d, tens[e]); ! 376: if ((word0(rv) & Exp_mask) ! 377: > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) ! 378: goto ovfl; ! 379: word0(rv) += P*Exp_msk1; ! 380: #else ! 381: /* rv = */ rounded_product(rv.d, tens[e]); ! 382: #endif ! 383: goto ret; ! 384: } ! 385: } ! 386: else if (e >= -Ten_pmax) { ! 387: /* rv = */ rounded_quotient(rv.d, tens[-e]); ! 388: goto ret; ! 389: } ! 390: } ! 391: e1 += nd - k; ! 392: ! 393: /* Get starting approximation = rv * 10**e1 */ ! 394: ! 395: if (e1 > 0) { ! 396: if (i = e1 & 15) ! 397: rv.d *= tens[i]; ! 398: if (e1 &= ~15) { ! 399: if (e1 > DBL_MAX_10_EXP) { ! 400: ovfl: ! 401: errno = ERANGE; ! 402: rv.d = HUGE_VAL; ! 403: goto ret; ! 404: } ! 405: if (e1 >>= 4) { ! 406: for(j = 0; e1 > 1; j++, e1 >>= 1) ! 407: if (e1 & 1) ! 408: rv.d *= bigtens[j]; ! 409: /* The last multiplication could overflow. */ ! 410: word0(rv) -= P*Exp_msk1; ! 411: rv.d *= bigtens[j]; ! 412: if ((z = word0(rv) & Exp_mask) ! 413: > Exp_msk1*(DBL_MAX_EXP+Bias-P)) ! 414: goto ovfl; ! 415: if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { ! 416: /* set to largest number */ ! 417: /* (Can't trust DBL_MAX) */ ! 418: word0(rv) = Big0; ! 419: word1(rv) = Big1; ! 420: } ! 421: else ! 422: word0(rv) += P*Exp_msk1; ! 423: } ! 424: ! 425: } ! 426: } ! 427: else if (e1 < 0) { ! 428: e1 = -e1; ! 429: if (i = e1 & 15) ! 430: rv.d /= tens[i]; ! 431: if (e1 &= ~15) { ! 432: e1 >>= 4; ! 433: for(j = 0; e1 > 1; j++, e1 >>= 1) ! 434: if (e1 & 1) ! 435: rv.d *= tinytens[j]; ! 436: /* The last multiplication could underflow. */ ! 437: rv0.d = rv.d; ! 438: rv.d *= tinytens[j]; ! 439: if (rv.d == 0) { ! 440: rv.d = 2.*rv0.d; ! 441: rv.d *= tinytens[j]; ! 442: if (rv.d == 0) { ! 443: undfl: ! 444: rv.d = 0.; ! 445: errno = ERANGE; ! 446: goto ret; ! 447: } ! 448: word0(rv) = Tiny0; ! 449: word1(rv) = Tiny1; ! 450: /* The refinement below will clean ! 451: * this approximation up. ! 452: */ ! 453: } ! 454: } ! 455: } ! 456: ! 457: /* Now the hard part -- adjusting rv to the correct value.*/ ! 458: ! 459: /* Put digits into bd: true value = bd * 10^e */ ! 460: ! 461: bd0 = s2b(s0, nd0, nd, y); ! 462: ! 463: for(;;) { ! 464: bd = Balloc(bd0->k); ! 465: Bcopy(bd, bd0); ! 466: bb = d2b(rv.d, &bbe, &bbbits); /* rv = bb * 2^bbe */ ! 467: bs = i2b(1); ! 468: ! 469: if (e >= 0) { ! 470: bb2 = bb5 = 0; ! 471: bd2 = bd5 = e; ! 472: } ! 473: else { ! 474: bb2 = bb5 = -e; ! 475: bd2 = bd5 = 0; ! 476: } ! 477: if (bbe >= 0) ! 478: bb2 += bbe; ! 479: else ! 480: bd2 -= bbe; ! 481: bs2 = bb2; ! 482: #ifdef Sudden_Underflow ! 483: #ifdef IBM ! 484: j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3); ! 485: #else ! 486: j = P + 1 - bbbits; ! 487: #endif ! 488: #else ! 489: i = bbe + bbbits - 1; /* logb(rv) */ ! 490: if (i < Emin) /* denormal */ ! 491: j = bbe + (P-Emin); ! 492: else ! 493: j = P + 1 - bbbits; ! 494: #endif ! 495: bb2 += j; ! 496: bd2 += j; ! 497: i = bb2 < bd2 ? bb2 : bd2; ! 498: if (i > bs2) ! 499: i = bs2; ! 500: if (i > 0) { ! 501: bb2 -= i; ! 502: bd2 -= i; ! 503: bs2 -= i; ! 504: } ! 505: if (bb5 > 0) { ! 506: bs = pow5mult(bs, bb5); ! 507: bb1 = mult(bs, bb); ! 508: Bfree(bb); ! 509: bb = bb1; ! 510: } ! 511: if (bb2 > 0) ! 512: bb = lshift(bb, bb2); ! 513: if (bd5 > 0) ! 514: bd = pow5mult(bd, bd5); ! 515: if (bd2 > 0) ! 516: bd = lshift(bd, bd2); ! 517: if (bs2 > 0) ! 518: bs = lshift(bs, bs2); ! 519: delta = diff(bb, bd); ! 520: dsign = delta->sign; ! 521: delta->sign = 0; ! 522: i = cmp(delta, bs); ! 523: if (i < 0) { ! 524: /* Error is less than half an ulp -- check for ! 525: * special case of mantissa a power of two. ! 526: */ ! 527: if (dsign || word1(rv) || word0(rv) & Bndry_mask) ! 528: break; ! 529: delta = lshift(delta,Log2P); ! 530: if (cmp(delta, bs) > 0) ! 531: goto drop_down; ! 532: break; ! 533: } ! 534: if (i == 0) { ! 535: /* exactly half-way between */ ! 536: if (dsign) { ! 537: if ((word0(rv) & Bndry_mask1) == Bndry_mask1 ! 538: && word1(rv) == 0xffffffff) { ! 539: /*boundary case -- increment exponent*/ ! 540: word0(rv) = (word0(rv) & Exp_mask) ! 541: + Exp_msk1 ! 542: #ifdef IBM ! 543: | Exp_msk1 >> 4 ! 544: #endif ! 545: ; ! 546: word1(rv) = 0; ! 547: break; ! 548: } ! 549: } ! 550: else if (!(word0(rv) & Bndry_mask) && !word1(rv)) { ! 551: drop_down: ! 552: /* boundary case -- decrement exponent */ ! 553: #ifdef Sudden_Underflow ! 554: L = word0(rv) & Exp_mask; ! 555: #ifdef IBM ! 556: if (L < Exp_msk1) ! 557: #else ! 558: if (L <= Exp_msk1) ! 559: #endif ! 560: goto undfl; ! 561: L -= Exp_msk1; ! 562: #else ! 563: L = (word0(rv) & Exp_mask) - Exp_msk1; ! 564: #endif ! 565: word0(rv) = L | Bndry_mask1; ! 566: word1(rv) = 0xffffffff; ! 567: #ifdef IBM ! 568: goto cont; ! 569: #else ! 570: break; ! 571: #endif ! 572: } ! 573: #ifndef ROUND_BIASED ! 574: if (!(word1(rv) & LSB)) ! 575: break; ! 576: #endif ! 577: if (dsign) ! 578: rv.d += ulp(rv.d); ! 579: #ifndef ROUND_BIASED ! 580: else { ! 581: rv.d -= ulp(rv.d); ! 582: #ifndef Sudden_Underflow ! 583: if (rv.d == 0) ! 584: goto undfl; ! 585: #endif ! 586: } ! 587: #endif ! 588: break; ! 589: } ! 590: if ((aadj = ratio(delta, bs)) <= 2.) { ! 591: if (dsign) ! 592: aadj = aadj1 = 1.; ! 593: else if (word1(rv) || word0(rv) & Bndry_mask) { ! 594: #ifndef Sudden_Underflow ! 595: if (word1(rv) == Tiny1 && !word0(rv)) ! 596: goto undfl; ! 597: #endif ! 598: aadj = 1.; ! 599: aadj1 = -1.; ! 600: } ! 601: else { ! 602: /* special case -- power of FLT_RADIX to be */ ! 603: /* rounded down... */ ! 604: ! 605: if (aadj < 2./FLT_RADIX) ! 606: aadj = 1./FLT_RADIX; ! 607: else ! 608: aadj *= 0.5; ! 609: aadj1 = -aadj; ! 610: } ! 611: } ! 612: else { ! 613: aadj *= 0.5; ! 614: aadj1 = dsign ? aadj : -aadj; ! 615: #ifdef Check_FLT_ROUNDS ! 616: switch(FLT_ROUNDS) { ! 617: case 2: /* towards +infinity */ ! 618: aadj1 -= 0.5; ! 619: break; ! 620: case 0: /* towards 0 */ ! 621: case 3: /* towards -infinity */ ! 622: aadj1 += 0.5; ! 623: } ! 624: #else ! 625: if (FLT_ROUNDS == 0) ! 626: aadj1 += 0.5; ! 627: #endif ! 628: } ! 629: y = word0(rv) & Exp_mask; ! 630: ! 631: /* Check for overflow */ ! 632: ! 633: if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { ! 634: rv0.d = rv.d; ! 635: word0(rv) -= P*Exp_msk1; ! 636: adj = aadj1 * ulp(rv.d); ! 637: rv.d += adj; ! 638: if ((word0(rv) & Exp_mask) >= ! 639: Exp_msk1*(DBL_MAX_EXP+Bias-P)) { ! 640: if (word0(rv0) == Big0 && word1(rv0) == Big1) ! 641: goto ovfl; ! 642: word0(rv) = Big0; ! 643: word1(rv) = Big1; ! 644: goto cont; ! 645: } ! 646: else ! 647: word0(rv) += P*Exp_msk1; ! 648: } ! 649: else { ! 650: #ifdef Sudden_Underflow ! 651: if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { ! 652: rv0.d = rv.d; ! 653: word0(rv) += P*Exp_msk1; ! 654: adj = aadj1 * ulp(rv.d); ! 655: rv.d += adj; ! 656: #ifdef IBM ! 657: if ((word0(rv) & Exp_mask) < P*Exp_msk1) ! 658: #else ! 659: if ((word0(rv) & Exp_mask) <= P*Exp_msk1) ! 660: #endif ! 661: { ! 662: if (word0(rv0) == Tiny0 ! 663: && word1(rv0) == Tiny1) ! 664: goto undfl; ! 665: word0(rv) = Tiny0; ! 666: word1(rv) = Tiny1; ! 667: goto cont; ! 668: } ! 669: else ! 670: word0(rv) -= P*Exp_msk1; ! 671: } ! 672: else { ! 673: adj = aadj1 * ulp(rv.d); ! 674: rv.d += adj; ! 675: } ! 676: #else ! 677: /* Compute adj so that the IEEE rounding rules will ! 678: * correctly round rv + adj in some half-way cases. ! 679: * If rv * ulp(rv) is denormalized (i.e., ! 680: * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid ! 681: * trouble from bits lost to denormalization; ! 682: * example: 1.2e-307 . ! 683: */ ! 684: if (y <= (P-1)*Exp_msk1 && aadj >= 1.) { ! 685: aadj1 = (double)(int)(aadj + 0.5); ! 686: if (!dsign) ! 687: aadj1 = -aadj1; ! 688: } ! 689: adj = aadj1 * ulp(rv.d); ! 690: rv.d += adj; ! 691: #endif ! 692: } ! 693: z = word0(rv) & Exp_mask; ! 694: if (y == z) { ! 695: /* Can we stop now? */ ! 696: L = aadj; ! 697: aadj -= L; ! 698: /* The tolerances below are conservative. */ ! 699: if (dsign || word1(rv) || word0(rv) & Bndry_mask) { ! 700: if (aadj < .4999999 || aadj > .5000001) ! 701: break; ! 702: } ! 703: else if (aadj < .4999999/FLT_RADIX) ! 704: break; ! 705: } ! 706: cont: ! 707: Bfree(bb); ! 708: Bfree(bd); ! 709: Bfree(bs); ! 710: Bfree(delta); ! 711: } ! 712: Bfree(bb); ! 713: Bfree(bd); ! 714: Bfree(bs); ! 715: Bfree(bd0); ! 716: Bfree(delta); ! 717: ret: ! 718: if (se) ! 719: *se = (char *)s; ! 720: return sign ? -rv.d : rv.d; ! 721: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.