strtod.c (187808) | strtod.c (219557) |
---|---|
1/**************************************************************** 2 3The author of this software is David M. Gay. 4 5Copyright (C) 1998-2001 by Lucent Technologies 6All Rights Reserved 7 8Permission to use, copy, modify, and distribute this software and --- 15 unchanged lines hidden (view full) --- 24ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 25THIS SOFTWARE. 26 27****************************************************************/ 28 29/* Please send bug reports to David M. Gay (dmg at acm dot org, 30 * with " at " changed at "@" and " dot " changed to "."). */ 31 | 1/**************************************************************** 2 3The author of this software is David M. Gay. 4 5Copyright (C) 1998-2001 by Lucent Technologies 6All Rights Reserved 7 8Permission to use, copy, modify, and distribute this software and --- 15 unchanged lines hidden (view full) --- 24ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 25THIS SOFTWARE. 26 27****************************************************************/ 28 29/* Please send bug reports to David M. Gay (dmg at acm dot org, 30 * with " at " changed at "@" and " dot " changed to "."). */ 31 |
32/* $FreeBSD: head/contrib/gdtoa/strtod.c 187808 2009-01-28 04:36:34Z das $ */ | 32/* $FreeBSD: head/contrib/gdtoa/strtod.c 219557 2011-03-12 07:03:06Z das $ */ |
33 34#include "gdtoaimp.h" 35#ifndef NO_FENV_H 36#include <fenv.h> 37#endif 38 39#ifdef USE_LOCALE 40#include "locale.h" --- 13 unchanged lines hidden (view full) --- 54 55#ifdef Honor_FLT_ROUNDS 56#undef Check_FLT_ROUNDS 57#define Check_FLT_ROUNDS 58#else 59#define Rounding Flt_Rounds 60#endif 61 | 33 34#include "gdtoaimp.h" 35#ifndef NO_FENV_H 36#include <fenv.h> 37#endif 38 39#ifdef USE_LOCALE 40#include "locale.h" --- 13 unchanged lines hidden (view full) --- 54 55#ifdef Honor_FLT_ROUNDS 56#undef Check_FLT_ROUNDS 57#define Check_FLT_ROUNDS 58#else 59#define Rounding Flt_Rounds 60#endif 61 |
62#ifdef Avoid_Underflow /*{*/ 63 static double 64sulp 65#ifdef KR_headers 66 (x, scale) U *x; int scale; 67#else 68 (U *x, int scale) 69#endif 70{ 71 U u; 72 double rv; 73 int i; 74 75 rv = ulp(x); 76 if (!scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0) 77 return rv; /* Is there an example where i <= 0 ? */ 78 word0(&u) = Exp_1 + (i << Exp_shift); 79 word1(&u) = 0; 80 return rv * u.d; 81 } 82#endif /*}*/ 83 |
|
62 double 63strtod 64#ifdef KR_headers 65 (s00, se) CONST char *s00; char **se; 66#else 67 (CONST char *s00, char **se) 68#endif 69{ 70#ifdef Avoid_Underflow 71 int scale; 72#endif 73 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign, 74 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; 75 CONST char *s, *s0, *s1; | 84 double 85strtod 86#ifdef KR_headers 87 (s00, se) CONST char *s00; char **se; 88#else 89 (CONST char *s00, char **se) 90#endif 91{ 92#ifdef Avoid_Underflow 93 int scale; 94#endif 95 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign, 96 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; 97 CONST char *s, *s0, *s1; |
76 double aadj, aadj1, adj, rv, rv0; | 98 double aadj; |
77 Long L; | 99 Long L; |
100 U adj, aadj1, rv, rv0; |
|
78 ULong y, z; 79 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; | 101 ULong y, z; 102 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; |
103#ifdef Avoid_Underflow 104 ULong Lsb, Lsb1; 105#endif |
|
80#ifdef SET_INEXACT 81 int inexact, oldinexact; 82#endif 83#ifdef USE_LOCALE /*{{*/ 84#ifdef NO_LOCALE_CACHE 85 char *decimalpoint = localeconv()->decimal_point; 86 int dplen = strlen(decimalpoint); 87#else 88 char *decimalpoint; 89 static char *decimalpoint_cache; 90 static int dplen; 91 if (!(s0 = decimalpoint_cache)) { 92 s0 = localeconv()->decimal_point; | 106#ifdef SET_INEXACT 107 int inexact, oldinexact; 108#endif 109#ifdef USE_LOCALE /*{{*/ 110#ifdef NO_LOCALE_CACHE 111 char *decimalpoint = localeconv()->decimal_point; 112 int dplen = strlen(decimalpoint); 113#else 114 char *decimalpoint; 115 static char *decimalpoint_cache; 116 static int dplen; 117 if (!(s0 = decimalpoint_cache)) { 118 s0 = localeconv()->decimal_point; |
93 if ((decimalpoint_cache = (char*)malloc(strlen(s0) + 1))) { | 119 if ((decimalpoint_cache = (char*)MALLOC(strlen(s0) + 1))) { |
94 strcpy(decimalpoint_cache, s0); 95 s0 = decimalpoint_cache; 96 } 97 dplen = strlen(s0); 98 } 99 decimalpoint = (char*)s0; 100#endif /*NO_LOCALE_CACHE*/ 101#else /*USE_LOCALE}{*/ --- 10 unchanged lines hidden (view full) --- 112 case FE_TOWARDZERO: Rounding = 0; break; 113 case FE_UPWARD: Rounding = 2; break; 114 case FE_DOWNWARD: Rounding = 3; 115 } 116#endif /*}}*/ 117#endif /*}*/ 118 119 sign = nz0 = nz = decpt = 0; | 120 strcpy(decimalpoint_cache, s0); 121 s0 = decimalpoint_cache; 122 } 123 dplen = strlen(s0); 124 } 125 decimalpoint = (char*)s0; 126#endif /*NO_LOCALE_CACHE*/ 127#else /*USE_LOCALE}{*/ --- 10 unchanged lines hidden (view full) --- 138 case FE_TOWARDZERO: Rounding = 0; break; 139 case FE_UPWARD: Rounding = 2; break; 140 case FE_DOWNWARD: Rounding = 3; 141 } 142#endif /*}}*/ 143#endif /*}*/ 144 145 sign = nz0 = nz = decpt = 0; |
120 dval(rv) = 0.; | 146 dval(&rv) = 0.; |
121 for(s = s00;;s++) switch(*s) { 122 case '-': 123 sign = 1; 124 /* no break */ 125 case '+': 126 if (*++s) 127 goto break2; 128 /* no break */ --- 15 unchanged lines hidden (view full) --- 144 { 145 static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI }; 146 Long exp; 147 ULong bits[2]; 148 switch(s[1]) { 149 case 'x': 150 case 'X': 151 { | 147 for(s = s00;;s++) switch(*s) { 148 case '-': 149 sign = 1; 150 /* no break */ 151 case '+': 152 if (*++s) 153 goto break2; 154 /* no break */ --- 15 unchanged lines hidden (view full) --- 170 { 171 static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI }; 172 Long exp; 173 ULong bits[2]; 174 switch(s[1]) { 175 case 'x': 176 case 'X': 177 { |
152#if defined(FE_DOWNWARD) && defined(FE_TONEAREST) && defined(FE_TOWARDZERO) && defined(FE_UPWARD) /*{{*/ | 178#ifdef Honor_FLT_ROUNDS |
153 FPI fpi1 = fpi; | 179 FPI fpi1 = fpi; |
154#ifdef Honor_FLT_ROUNDS /*{{*/ | |
155 fpi1.rounding = Rounding; | 180 fpi1.rounding = Rounding; |
156#else /*}{*/ 157 switch(fegetround()) { 158 case FE_TOWARDZERO: fpi1.rounding = 0; break; 159 case FE_UPWARD: fpi1.rounding = 2; break; 160 case FE_DOWNWARD: fpi1.rounding = 3; 161 } 162#endif /*}}*/ 163#else /*}{*/ | 181#else |
164#define fpi1 fpi | 182#define fpi1 fpi |
165#endif /*}}*/ | 183#endif |
166 switch((i = gethex(&s, &fpi1, &exp, &bb, sign)) & STRTOG_Retmask) { 167 case STRTOG_NoNumber: 168 s = s00; 169 sign = 0; 170 case STRTOG_Zero: 171 break; 172 default: 173 if (bb) { --- 108 unchanged lines hidden (view full) --- 282 if (!decpt) 283 switch(c) { 284 case 'i': 285 case 'I': 286 if (match(&s,"nf")) { 287 --s; 288 if (!match(&s,"inity")) 289 ++s; | 184 switch((i = gethex(&s, &fpi1, &exp, &bb, sign)) & STRTOG_Retmask) { 185 case STRTOG_NoNumber: 186 s = s00; 187 sign = 0; 188 case STRTOG_Zero: 189 break; 190 default: 191 if (bb) { --- 108 unchanged lines hidden (view full) --- 300 if (!decpt) 301 switch(c) { 302 case 'i': 303 case 'I': 304 if (match(&s,"nf")) { 305 --s; 306 if (!match(&s,"inity")) 307 ++s; |
290 word0(rv) = 0x7ff00000; 291 word1(rv) = 0; | 308 word0(&rv) = 0x7ff00000; 309 word1(&rv) = 0; |
292 goto ret; 293 } 294 break; 295 case 'n': 296 case 'N': 297 if (match(&s, "an")) { 298#ifndef No_Hex_NaN 299 if (*s == '(' /*)*/ 300 && hexnan(&s, &fpinan, bits) 301 == STRTOG_NaNbits) { | 310 goto ret; 311 } 312 break; 313 case 'n': 314 case 'N': 315 if (match(&s, "an")) { 316#ifndef No_Hex_NaN 317 if (*s == '(' /*)*/ 318 && hexnan(&s, &fpinan, bits) 319 == STRTOG_NaNbits) { |
302 word0(rv) = 0x7ff80000 | bits[1]; 303 word1(rv) = bits[0]; | 320 word0(&rv) = 0x7ff80000 | bits[1]; 321 word1(&rv) = bits[0]; |
304 } 305 else { 306#endif | 322 } 323 else { 324#endif |
307 word0(rv) = NAN_WORD0; 308 word1(rv) = NAN_WORD1; | 325 word0(&rv) = NAN_WORD0; 326 word1(&rv) = NAN_WORD1; |
309#ifndef No_Hex_NaN 310 } 311#endif 312 goto ret; 313 } 314 } 315#endif /* INFNAN_CHECK */ 316 ret0: --- 7 unchanged lines hidden (view full) --- 324 /* Now we have nd0 digits, starting at s0, followed by a 325 * decimal point, followed by nd-nd0 digits. The number we're 326 * after is the integer represented by those digits times 327 * 10**e */ 328 329 if (!nd0) 330 nd0 = nd; 331 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; | 327#ifndef No_Hex_NaN 328 } 329#endif 330 goto ret; 331 } 332 } 333#endif /* INFNAN_CHECK */ 334 ret0: --- 7 unchanged lines hidden (view full) --- 342 /* Now we have nd0 digits, starting at s0, followed by a 343 * decimal point, followed by nd-nd0 digits. The number we're 344 * after is the integer represented by those digits times 345 * 10**e */ 346 347 if (!nd0) 348 nd0 = nd; 349 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; |
332 dval(rv) = y; | 350 dval(&rv) = y; |
333 if (k > 9) { 334#ifdef SET_INEXACT 335 if (k > DBL_DIG) 336 oldinexact = get_inexact(); 337#endif | 351 if (k > 9) { 352#ifdef SET_INEXACT 353 if (k > DBL_DIG) 354 oldinexact = get_inexact(); 355#endif |
338 dval(rv) = tens[k - 9] * dval(rv) + z; | 356 dval(&rv) = tens[k - 9] * dval(&rv) + z; |
339 } 340 bd0 = 0; 341 if (nd <= DBL_DIG 342#ifndef RND_PRODQUOT 343#ifndef Honor_FLT_ROUNDS 344 && Flt_Rounds == 1 345#endif 346#endif 347 ) { 348 if (!e) 349 goto ret; | 357 } 358 bd0 = 0; 359 if (nd <= DBL_DIG 360#ifndef RND_PRODQUOT 361#ifndef Honor_FLT_ROUNDS 362 && Flt_Rounds == 1 363#endif 364#endif 365 ) { 366 if (!e) 367 goto ret; |
368#ifndef ROUND_BIASED_without_Round_Up |
|
350 if (e > 0) { 351 if (e <= Ten_pmax) { 352#ifdef VAX 353 goto vax_ovfl_check; 354#else 355#ifdef Honor_FLT_ROUNDS 356 /* round correctly FLT_ROUNDS = 2 or 3 */ 357 if (sign) { | 369 if (e > 0) { 370 if (e <= Ten_pmax) { 371#ifdef VAX 372 goto vax_ovfl_check; 373#else 374#ifdef Honor_FLT_ROUNDS 375 /* round correctly FLT_ROUNDS = 2 or 3 */ 376 if (sign) { |
358 rv = -rv; | 377 rv.d = -rv.d; |
359 sign = 0; 360 } 361#endif | 378 sign = 0; 379 } 380#endif |
362 /* rv = */ rounded_product(dval(rv), tens[e]); | 381 /* rv = */ rounded_product(dval(&rv), tens[e]); |
363 goto ret; 364#endif 365 } 366 i = DBL_DIG - nd; 367 if (e <= Ten_pmax + i) { 368 /* A fancier test would sometimes let us do 369 * this for larger i values. 370 */ 371#ifdef Honor_FLT_ROUNDS 372 /* round correctly FLT_ROUNDS = 2 or 3 */ 373 if (sign) { | 382 goto ret; 383#endif 384 } 385 i = DBL_DIG - nd; 386 if (e <= Ten_pmax + i) { 387 /* A fancier test would sometimes let us do 388 * this for larger i values. 389 */ 390#ifdef Honor_FLT_ROUNDS 391 /* round correctly FLT_ROUNDS = 2 or 3 */ 392 if (sign) { |
374 rv = -rv; | 393 rv.d = -rv.d; |
375 sign = 0; 376 } 377#endif 378 e -= i; | 394 sign = 0; 395 } 396#endif 397 e -= i; |
379 dval(rv) *= tens[i]; | 398 dval(&rv) *= tens[i]; |
380#ifdef VAX 381 /* VAX exponent range is so narrow we must 382 * worry about overflow here... 383 */ 384 vax_ovfl_check: | 399#ifdef VAX 400 /* VAX exponent range is so narrow we must 401 * worry about overflow here... 402 */ 403 vax_ovfl_check: |
385 word0(rv) -= P*Exp_msk1; 386 /* rv = */ rounded_product(dval(rv), tens[e]); 387 if ((word0(rv) & Exp_mask) | 404 word0(&rv) -= P*Exp_msk1; 405 /* rv = */ rounded_product(dval(&rv), tens[e]); 406 if ((word0(&rv) & Exp_mask) |
388 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) 389 goto ovfl; | 407 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) 408 goto ovfl; |
390 word0(rv) += P*Exp_msk1; | 409 word0(&rv) += P*Exp_msk1; |
391#else | 410#else |
392 /* rv = */ rounded_product(dval(rv), tens[e]); | 411 /* rv = */ rounded_product(dval(&rv), tens[e]); |
393#endif 394 goto ret; 395 } 396 } 397#ifndef Inaccurate_Divide 398 else if (e >= -Ten_pmax) { 399#ifdef Honor_FLT_ROUNDS 400 /* round correctly FLT_ROUNDS = 2 or 3 */ 401 if (sign) { | 412#endif 413 goto ret; 414 } 415 } 416#ifndef Inaccurate_Divide 417 else if (e >= -Ten_pmax) { 418#ifdef Honor_FLT_ROUNDS 419 /* round correctly FLT_ROUNDS = 2 or 3 */ 420 if (sign) { |
402 rv = -rv; | 421 rv.d = -rv.d; |
403 sign = 0; 404 } 405#endif | 422 sign = 0; 423 } 424#endif |
406 /* rv = */ rounded_quotient(dval(rv), tens[-e]); | 425 /* rv = */ rounded_quotient(dval(&rv), tens[-e]); |
407 goto ret; 408 } 409#endif | 426 goto ret; 427 } 428#endif |
429#endif /* ROUND_BIASED_without_Round_Up */ |
|
410 } 411 e1 += nd - k; 412 413#ifdef IEEE_Arith 414#ifdef SET_INEXACT 415 inexact = 1; 416 if (k <= DBL_DIG) 417 oldinexact = get_inexact(); --- 11 unchanged lines hidden (view full) --- 429 } 430#endif 431#endif /*IEEE_Arith*/ 432 433 /* Get starting approximation = rv * 10**e1 */ 434 435 if (e1 > 0) { 436 if ( (i = e1 & 15) !=0) | 430 } 431 e1 += nd - k; 432 433#ifdef IEEE_Arith 434#ifdef SET_INEXACT 435 inexact = 1; 436 if (k <= DBL_DIG) 437 oldinexact = get_inexact(); --- 11 unchanged lines hidden (view full) --- 449 } 450#endif 451#endif /*IEEE_Arith*/ 452 453 /* Get starting approximation = rv * 10**e1 */ 454 455 if (e1 > 0) { 456 if ( (i = e1 & 15) !=0) |
437 dval(rv) *= tens[i]; | 457 dval(&rv) *= tens[i]; |
438 if (e1 &= ~15) { 439 if (e1 > DBL_MAX_10_EXP) { 440 ovfl: | 458 if (e1 &= ~15) { 459 if (e1 > DBL_MAX_10_EXP) { 460 ovfl: |
441#ifndef NO_ERRNO 442 errno = ERANGE; 443#endif | |
444 /* Can't trust HUGE_VAL */ 445#ifdef IEEE_Arith 446#ifdef Honor_FLT_ROUNDS 447 switch(Rounding) { 448 case 0: /* toward 0 */ 449 case 3: /* toward -infinity */ | 461 /* Can't trust HUGE_VAL */ 462#ifdef IEEE_Arith 463#ifdef Honor_FLT_ROUNDS 464 switch(Rounding) { 465 case 0: /* toward 0 */ 466 case 3: /* toward -infinity */ |
450 word0(rv) = Big0; 451 word1(rv) = Big1; | 467 word0(&rv) = Big0; 468 word1(&rv) = Big1; |
452 break; 453 default: | 469 break; 470 default: |
454 word0(rv) = Exp_mask; 455 word1(rv) = 0; | 471 word0(&rv) = Exp_mask; 472 word1(&rv) = 0; |
456 } 457#else /*Honor_FLT_ROUNDS*/ | 473 } 474#else /*Honor_FLT_ROUNDS*/ |
458 word0(rv) = Exp_mask; 459 word1(rv) = 0; | 475 word0(&rv) = Exp_mask; 476 word1(&rv) = 0; |
460#endif /*Honor_FLT_ROUNDS*/ 461#ifdef SET_INEXACT 462 /* set overflow bit */ | 477#endif /*Honor_FLT_ROUNDS*/ 478#ifdef SET_INEXACT 479 /* set overflow bit */ |
463 dval(rv0) = 1e300; 464 dval(rv0) *= dval(rv0); | 480 dval(&rv0) = 1e300; 481 dval(&rv0) *= dval(&rv0); |
465#endif 466#else /*IEEE_Arith*/ | 482#endif 483#else /*IEEE_Arith*/ |
467 word0(rv) = Big0; 468 word1(rv) = Big1; | 484 word0(&rv) = Big0; 485 word1(&rv) = Big1; |
469#endif /*IEEE_Arith*/ | 486#endif /*IEEE_Arith*/ |
470 if (bd0) 471 goto retfree; | 487 range_err: 488 if (bd0) { 489 Bfree(bb); 490 Bfree(bd); 491 Bfree(bs); 492 Bfree(bd0); 493 Bfree(delta); 494 } 495#ifndef NO_ERRNO 496 errno = ERANGE; 497#endif |
472 goto ret; 473 } 474 e1 >>= 4; 475 for(j = 0; e1 > 1; j++, e1 >>= 1) 476 if (e1 & 1) | 498 goto ret; 499 } 500 e1 >>= 4; 501 for(j = 0; e1 > 1; j++, e1 >>= 1) 502 if (e1 & 1) |
477 dval(rv) *= bigtens[j]; | 503 dval(&rv) *= bigtens[j]; |
478 /* The last multiplication could overflow. */ | 504 /* The last multiplication could overflow. */ |
479 word0(rv) -= P*Exp_msk1; 480 dval(rv) *= bigtens[j]; 481 if ((z = word0(rv) & Exp_mask) | 505 word0(&rv) -= P*Exp_msk1; 506 dval(&rv) *= bigtens[j]; 507 if ((z = word0(&rv) & Exp_mask) |
482 > Exp_msk1*(DBL_MAX_EXP+Bias-P)) 483 goto ovfl; 484 if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { 485 /* set to largest number */ 486 /* (Can't trust DBL_MAX) */ | 508 > Exp_msk1*(DBL_MAX_EXP+Bias-P)) 509 goto ovfl; 510 if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { 511 /* set to largest number */ 512 /* (Can't trust DBL_MAX) */ |
487 word0(rv) = Big0; 488 word1(rv) = Big1; | 513 word0(&rv) = Big0; 514 word1(&rv) = Big1; |
489 } 490 else | 515 } 516 else |
491 word0(rv) += P*Exp_msk1; | 517 word0(&rv) += P*Exp_msk1; |
492 } 493 } 494 else if (e1 < 0) { 495 e1 = -e1; 496 if ( (i = e1 & 15) !=0) | 518 } 519 } 520 else if (e1 < 0) { 521 e1 = -e1; 522 if ( (i = e1 & 15) !=0) |
497 dval(rv) /= tens[i]; | 523 dval(&rv) /= tens[i]; |
498 if (e1 >>= 4) { 499 if (e1 >= 1 << n_bigtens) 500 goto undfl; 501#ifdef Avoid_Underflow 502 if (e1 & Scale_Bit) 503 scale = 2*P; 504 for(j = 0; e1 > 0; j++, e1 >>= 1) 505 if (e1 & 1) | 524 if (e1 >>= 4) { 525 if (e1 >= 1 << n_bigtens) 526 goto undfl; 527#ifdef Avoid_Underflow 528 if (e1 & Scale_Bit) 529 scale = 2*P; 530 for(j = 0; e1 > 0; j++, e1 >>= 1) 531 if (e1 & 1) |
506 dval(rv) *= tinytens[j]; 507 if (scale && (j = 2*P + 1 - ((word0(rv) & Exp_mask) | 532 dval(&rv) *= tinytens[j]; 533 if (scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask) |
508 >> Exp_shift)) > 0) { 509 /* scaled rv is denormal; zap j low bits */ 510 if (j >= 32) { | 534 >> Exp_shift)) > 0) { 535 /* scaled rv is denormal; zap j low bits */ 536 if (j >= 32) { |
511 word1(rv) = 0; | 537 word1(&rv) = 0; |
512 if (j >= 53) | 538 if (j >= 53) |
513 word0(rv) = (P+2)*Exp_msk1; | 539 word0(&rv) = (P+2)*Exp_msk1; |
514 else | 540 else |
515 word0(rv) &= 0xffffffff << j-32; | 541 word0(&rv) &= 0xffffffff << (j-32); |
516 } 517 else | 542 } 543 else |
518 word1(rv) &= 0xffffffff << j; | 544 word1(&rv) &= 0xffffffff << j; |
519 } 520#else 521 for(j = 0; e1 > 1; j++, e1 >>= 1) 522 if (e1 & 1) | 545 } 546#else 547 for(j = 0; e1 > 1; j++, e1 >>= 1) 548 if (e1 & 1) |
523 dval(rv) *= tinytens[j]; | 549 dval(&rv) *= tinytens[j]; |
524 /* The last multiplication could underflow. */ | 550 /* The last multiplication could underflow. */ |
525 dval(rv0) = dval(rv); 526 dval(rv) *= tinytens[j]; 527 if (!dval(rv)) { 528 dval(rv) = 2.*dval(rv0); 529 dval(rv) *= tinytens[j]; | 551 dval(&rv0) = dval(&rv); 552 dval(&rv) *= tinytens[j]; 553 if (!dval(&rv)) { 554 dval(&rv) = 2.*dval(&rv0); 555 dval(&rv) *= tinytens[j]; |
530#endif | 556#endif |
531 if (!dval(rv)) { | 557 if (!dval(&rv)) { |
532 undfl: | 558 undfl: |
533 dval(rv) = 0.; 534#ifndef NO_ERRNO 535 errno = ERANGE; 536#endif 537 if (bd0) 538 goto retfree; 539 goto ret; | 559 dval(&rv) = 0.; 560 goto range_err; |
540 } 541#ifndef Avoid_Underflow | 561 } 562#ifndef Avoid_Underflow |
542 word0(rv) = Tiny0; 543 word1(rv) = Tiny1; | 563 word0(&rv) = Tiny0; 564 word1(&rv) = Tiny1; |
544 /* The refinement below will clean 545 * this approximation up. 546 */ 547 } 548#endif 549 } 550 } 551 552 /* Now the hard part -- adjusting rv to the correct value.*/ 553 554 /* Put digits into bd: true value = bd * 10^e */ 555 556 bd0 = s2b(s0, nd0, nd, y, dplen); 557 558 for(;;) { 559 bd = Balloc(bd0->k); 560 Bcopy(bd, bd0); | 565 /* The refinement below will clean 566 * this approximation up. 567 */ 568 } 569#endif 570 } 571 } 572 573 /* Now the hard part -- adjusting rv to the correct value.*/ 574 575 /* Put digits into bd: true value = bd * 10^e */ 576 577 bd0 = s2b(s0, nd0, nd, y, dplen); 578 579 for(;;) { 580 bd = Balloc(bd0->k); 581 Bcopy(bd, bd0); |
561 bb = d2b(dval(rv), &bbe, &bbbits); /* rv = bb * 2^bbe */ | 582 bb = d2b(dval(&rv), &bbe, &bbbits); /* rv = bb * 2^bbe */ |
562 bs = i2b(1); 563 564 if (e >= 0) { 565 bb2 = bb5 = 0; 566 bd2 = bd5 = e; 567 } 568 else { 569 bb2 = bb5 = -e; --- 4 unchanged lines hidden (view full) --- 574 else 575 bd2 -= bbe; 576 bs2 = bb2; 577#ifdef Honor_FLT_ROUNDS 578 if (Rounding != 1) 579 bs2++; 580#endif 581#ifdef Avoid_Underflow | 583 bs = i2b(1); 584 585 if (e >= 0) { 586 bb2 = bb5 = 0; 587 bd2 = bd5 = e; 588 } 589 else { 590 bb2 = bb5 = -e; --- 4 unchanged lines hidden (view full) --- 595 else 596 bd2 -= bbe; 597 bs2 = bb2; 598#ifdef Honor_FLT_ROUNDS 599 if (Rounding != 1) 600 bs2++; 601#endif 602#ifdef Avoid_Underflow |
603 Lsb = LSB; 604 Lsb1 = 0; |
|
582 j = bbe - scale; 583 i = j + bbbits - 1; /* logb(rv) */ | 605 j = bbe - scale; 606 i = j + bbbits - 1; /* logb(rv) */ |
584 if (i < Emin) /* denormal */ 585 j += P - Emin; 586 else 587 j = P + 1 - bbbits; | 607 j = P + 1 - bbbits; 608 if (i < Emin) { /* denormal */ 609 i = Emin - i; 610 j -= i; 611 if (i < 32) 612 Lsb <<= i; 613 else 614 Lsb1 = Lsb << (i-32); 615 } |
588#else /*Avoid_Underflow*/ 589#ifdef Sudden_Underflow 590#ifdef IBM 591 j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3); 592#else 593 j = P + 1 - bbbits; 594#endif 595#else /*Sudden_Underflow*/ 596 j = bbe; | 616#else /*Avoid_Underflow*/ 617#ifdef Sudden_Underflow 618#ifdef IBM 619 j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3); 620#else 621 j = P + 1 - bbbits; 622#endif 623#else /*Sudden_Underflow*/ 624 j = bbe; |
597 i = j + bbbits - 1; /* logb(rv) */ | 625 i = j + bbbits - 1; /* logb(&rv) */ |
598 if (i < Emin) /* denormal */ 599 j += P - Emin; 600 else 601 j = P + 1 - bbbits; 602#endif /*Sudden_Underflow*/ 603#endif /*Avoid_Underflow*/ 604 bb2 += j; 605 bd2 += j; --- 34 unchanged lines hidden (view full) --- 640 /* exact */ 641#ifdef SET_INEXACT 642 inexact = 0; 643#endif 644 break; 645 } 646 if (Rounding) { 647 if (dsign) { | 626 if (i < Emin) /* denormal */ 627 j += P - Emin; 628 else 629 j = P + 1 - bbbits; 630#endif /*Sudden_Underflow*/ 631#endif /*Avoid_Underflow*/ 632 bb2 += j; 633 bd2 += j; --- 34 unchanged lines hidden (view full) --- 668 /* exact */ 669#ifdef SET_INEXACT 670 inexact = 0; 671#endif 672 break; 673 } 674 if (Rounding) { 675 if (dsign) { |
648 adj = 1.; | 676 dval(&adj) = 1.; |
649 goto apply_adj; 650 } 651 } 652 else if (!dsign) { | 677 goto apply_adj; 678 } 679 } 680 else if (!dsign) { |
653 adj = -1.; 654 if (!word1(rv) 655 && !(word0(rv) & Frac_mask)) { 656 y = word0(rv) & Exp_mask; | 681 dval(&adj) = -1.; 682 if (!word1(&rv) 683 && !(word0(&rv) & Frac_mask)) { 684 y = word0(&rv) & Exp_mask; |
657#ifdef Avoid_Underflow 658 if (!scale || y > 2*P*Exp_msk1) 659#else 660 if (y) 661#endif 662 { 663 delta = lshift(delta,Log2P); 664 if (cmp(delta, bs) <= 0) | 685#ifdef Avoid_Underflow 686 if (!scale || y > 2*P*Exp_msk1) 687#else 688 if (y) 689#endif 690 { 691 delta = lshift(delta,Log2P); 692 if (cmp(delta, bs) <= 0) |
665 adj = -0.5; | 693 dval(&adj) = -0.5; |
666 } 667 } 668 apply_adj: 669#ifdef Avoid_Underflow | 694 } 695 } 696 apply_adj: 697#ifdef Avoid_Underflow |
670 if (scale && (y = word0(rv) & Exp_mask) | 698 if (scale && (y = word0(&rv) & Exp_mask) |
671 <= 2*P*Exp_msk1) | 699 <= 2*P*Exp_msk1) |
672 word0(adj) += (2*P+1)*Exp_msk1 - y; | 700 word0(&adj) += (2*P+1)*Exp_msk1 - y; |
673#else 674#ifdef Sudden_Underflow | 701#else 702#ifdef Sudden_Underflow |
675 if ((word0(rv) & Exp_mask) <= | 703 if ((word0(&rv) & Exp_mask) <= |
676 P*Exp_msk1) { | 704 P*Exp_msk1) { |
677 word0(rv) += P*Exp_msk1; 678 dval(rv) += adj*ulp(dval(rv)); 679 word0(rv) -= P*Exp_msk1; | 705 word0(&rv) += P*Exp_msk1; 706 dval(&rv) += adj*ulp(&rv); 707 word0(&rv) -= P*Exp_msk1; |
680 } 681 else 682#endif /*Sudden_Underflow*/ 683#endif /*Avoid_Underflow*/ | 708 } 709 else 710#endif /*Sudden_Underflow*/ 711#endif /*Avoid_Underflow*/ |
684 dval(rv) += adj*ulp(dval(rv)); | 712 dval(&rv) += adj.d*ulp(&rv); |
685 } 686 break; 687 } | 713 } 714 break; 715 } |
688 adj = ratio(delta, bs); 689 if (adj < 1.) 690 adj = 1.; 691 if (adj <= 0x7ffffffe) { 692 /* adj = Rounding ? ceil(adj) : floor(adj); */ 693 y = adj; 694 if (y != adj) { | 716 dval(&adj) = ratio(delta, bs); 717 if (adj.d < 1.) 718 dval(&adj) = 1.; 719 if (adj.d <= 0x7ffffffe) { 720 /* dval(&adj) = Rounding ? ceil(&adj) : floor(&adj); */ 721 y = adj.d; 722 if (y != adj.d) { |
695 if (!((Rounding>>1) ^ dsign)) 696 y++; | 723 if (!((Rounding>>1) ^ dsign)) 724 y++; |
697 adj = y; | 725 dval(&adj) = y; |
698 } 699 } 700#ifdef Avoid_Underflow | 726 } 727 } 728#ifdef Avoid_Underflow |
701 if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1) 702 word0(adj) += (2*P+1)*Exp_msk1 - y; | 729 if (scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) 730 word0(&adj) += (2*P+1)*Exp_msk1 - y; |
703#else 704#ifdef Sudden_Underflow | 731#else 732#ifdef Sudden_Underflow |
705 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { 706 word0(rv) += P*Exp_msk1; 707 adj *= ulp(dval(rv)); | 733 if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) { 734 word0(&rv) += P*Exp_msk1; 735 dval(&adj) *= ulp(&rv); |
708 if (dsign) | 736 if (dsign) |
709 dval(rv) += adj; | 737 dval(&rv) += adj; |
710 else | 738 else |
711 dval(rv) -= adj; 712 word0(rv) -= P*Exp_msk1; | 739 dval(&rv) -= adj; 740 word0(&rv) -= P*Exp_msk1; |
713 goto cont; 714 } 715#endif /*Sudden_Underflow*/ 716#endif /*Avoid_Underflow*/ | 741 goto cont; 742 } 743#endif /*Sudden_Underflow*/ 744#endif /*Avoid_Underflow*/ |
717 adj *= ulp(dval(rv)); | 745 dval(&adj) *= ulp(&rv); |
718 if (dsign) { | 746 if (dsign) { |
719 if (word0(rv) == Big0 && word1(rv) == Big1) | 747 if (word0(&rv) == Big0 && word1(&rv) == Big1) |
720 goto ovfl; | 748 goto ovfl; |
721 dval(rv) += adj; | 749 dval(&rv) += adj.d; |
722 } 723 else | 750 } 751 else |
724 dval(rv) -= adj; | 752 dval(&rv) -= adj.d; |
725 goto cont; 726 } 727#endif /*Honor_FLT_ROUNDS*/ 728 729 if (i < 0) { 730 /* Error is less than half an ulp -- check for 731 * special case of mantissa a power of two. 732 */ | 753 goto cont; 754 } 755#endif /*Honor_FLT_ROUNDS*/ 756 757 if (i < 0) { 758 /* Error is less than half an ulp -- check for 759 * special case of mantissa a power of two. 760 */ |
733 if (dsign || word1(rv) || word0(rv) & Bndry_mask | 761 if (dsign || word1(&rv) || word0(&rv) & Bndry_mask |
734#ifdef IEEE_Arith 735#ifdef Avoid_Underflow | 762#ifdef IEEE_Arith 763#ifdef Avoid_Underflow |
736 || (word0(rv) & Exp_mask) <= (2*P+1)*Exp_msk1 | 764 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1 |
737#else | 765#else |
738 || (word0(rv) & Exp_mask) <= Exp_msk1 | 766 || (word0(&rv) & Exp_mask) <= Exp_msk1 |
739#endif 740#endif 741 ) { 742#ifdef SET_INEXACT 743 if (!delta->x[0] && delta->wds <= 1) 744 inexact = 0; 745#endif 746 break; --- 8 unchanged lines hidden (view full) --- 755 delta = lshift(delta,Log2P); 756 if (cmp(delta, bs) > 0) 757 goto drop_down; 758 break; 759 } 760 if (i == 0) { 761 /* exactly half-way between */ 762 if (dsign) { | 767#endif 768#endif 769 ) { 770#ifdef SET_INEXACT 771 if (!delta->x[0] && delta->wds <= 1) 772 inexact = 0; 773#endif 774 break; --- 8 unchanged lines hidden (view full) --- 783 delta = lshift(delta,Log2P); 784 if (cmp(delta, bs) > 0) 785 goto drop_down; 786 break; 787 } 788 if (i == 0) { 789 /* exactly half-way between */ 790 if (dsign) { |
763 if ((word0(rv) & Bndry_mask1) == Bndry_mask1 764 && word1(rv) == ( | 791 if ((word0(&rv) & Bndry_mask1) == Bndry_mask1 792 && word1(&rv) == ( |
765#ifdef Avoid_Underflow | 793#ifdef Avoid_Underflow |
766 (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1) | 794 (scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) |
767 ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) : 768#endif 769 0xffffffff)) { 770 /*boundary case -- increment exponent*/ | 795 ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) : 796#endif 797 0xffffffff)) { 798 /*boundary case -- increment exponent*/ |
771 word0(rv) = (word0(rv) & Exp_mask) | 799 if (word0(&rv) == Big0 && word1(&rv) == Big1) 800 goto ovfl; 801 word0(&rv) = (word0(&rv) & Exp_mask) |
772 + Exp_msk1 773#ifdef IBM 774 | Exp_msk1 >> 4 775#endif 776 ; | 802 + Exp_msk1 803#ifdef IBM 804 | Exp_msk1 >> 4 805#endif 806 ; |
777 word1(rv) = 0; | 807 word1(&rv) = 0; |
778#ifdef Avoid_Underflow 779 dsign = 0; 780#endif 781 break; 782 } 783 } | 808#ifdef Avoid_Underflow 809 dsign = 0; 810#endif 811 break; 812 } 813 } |
784 else if (!(word0(rv) & Bndry_mask) && !word1(rv)) { | 814 else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) { |
785 drop_down: 786 /* boundary case -- decrement exponent */ 787#ifdef Sudden_Underflow /*{{*/ | 815 drop_down: 816 /* boundary case -- decrement exponent */ 817#ifdef Sudden_Underflow /*{{*/ |
788 L = word0(rv) & Exp_mask; | 818 L = word0(&rv) & Exp_mask; |
789#ifdef IBM 790 if (L < Exp_msk1) 791#else 792#ifdef Avoid_Underflow 793 if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1)) 794#else 795 if (L <= Exp_msk1) 796#endif /*Avoid_Underflow*/ 797#endif /*IBM*/ 798 goto undfl; 799 L -= Exp_msk1; 800#else /*Sudden_Underflow}{*/ 801#ifdef Avoid_Underflow 802 if (scale) { | 819#ifdef IBM 820 if (L < Exp_msk1) 821#else 822#ifdef Avoid_Underflow 823 if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1)) 824#else 825 if (L <= Exp_msk1) 826#endif /*Avoid_Underflow*/ 827#endif /*IBM*/ 828 goto undfl; 829 L -= Exp_msk1; 830#else /*Sudden_Underflow}{*/ 831#ifdef Avoid_Underflow 832 if (scale) { |
803 L = word0(rv) & Exp_mask; | 833 L = word0(&rv) & Exp_mask; |
804 if (L <= (2*P+1)*Exp_msk1) { 805 if (L > (P+2)*Exp_msk1) 806 /* round even ==> */ 807 /* accept rv */ 808 break; 809 /* rv = smallest denormal */ 810 goto undfl; 811 } 812 } 813#endif /*Avoid_Underflow*/ | 834 if (L <= (2*P+1)*Exp_msk1) { 835 if (L > (P+2)*Exp_msk1) 836 /* round even ==> */ 837 /* accept rv */ 838 break; 839 /* rv = smallest denormal */ 840 goto undfl; 841 } 842 } 843#endif /*Avoid_Underflow*/ |
814 L = (word0(rv) & Exp_mask) - Exp_msk1; | 844 L = (word0(&rv) & Exp_mask) - Exp_msk1; |
815#endif /*Sudden_Underflow}}*/ | 845#endif /*Sudden_Underflow}}*/ |
816 word0(rv) = L | Bndry_mask1; 817 word1(rv) = 0xffffffff; | 846 word0(&rv) = L | Bndry_mask1; 847 word1(&rv) = 0xffffffff; |
818#ifdef IBM 819 goto cont; 820#else 821 break; 822#endif 823 } 824#ifndef ROUND_BIASED | 848#ifdef IBM 849 goto cont; 850#else 851 break; 852#endif 853 } 854#ifndef ROUND_BIASED |
825 if (!(word1(rv) & LSB)) | 855#ifdef Avoid_Underflow 856 if (Lsb1) { 857 if (!(word0(&rv) & Lsb1)) 858 break; 859 } 860 else if (!(word1(&rv) & Lsb)) |
826 break; | 861 break; |
862#else 863 if (!(word1(&rv) & LSB)) 864 break; |
|
827#endif | 865#endif |
866#endif |
|
828 if (dsign) | 867 if (dsign) |
829 dval(rv) += ulp(dval(rv)); | 868#ifdef Avoid_Underflow 869 dval(&rv) += sulp(&rv, scale); 870#else 871 dval(&rv) += ulp(&rv); 872#endif |
830#ifndef ROUND_BIASED 831 else { | 873#ifndef ROUND_BIASED 874 else { |
832 dval(rv) -= ulp(dval(rv)); | 875#ifdef Avoid_Underflow 876 dval(&rv) -= sulp(&rv, scale); 877#else 878 dval(&rv) -= ulp(&rv); 879#endif |
833#ifndef Sudden_Underflow | 880#ifndef Sudden_Underflow |
834 if (!dval(rv)) | 881 if (!dval(&rv)) |
835 goto undfl; 836#endif 837 } 838#ifdef Avoid_Underflow 839 dsign = 1 - dsign; 840#endif 841#endif 842 break; 843 } 844 if ((aadj = ratio(delta, bs)) <= 2.) { 845 if (dsign) | 882 goto undfl; 883#endif 884 } 885#ifdef Avoid_Underflow 886 dsign = 1 - dsign; 887#endif 888#endif 889 break; 890 } 891 if ((aadj = ratio(delta, bs)) <= 2.) { 892 if (dsign) |
846 aadj = aadj1 = 1.; 847 else if (word1(rv) || word0(rv) & Bndry_mask) { | 893 aadj = dval(&aadj1) = 1.; 894 else if (word1(&rv) || word0(&rv) & Bndry_mask) { |
848#ifndef Sudden_Underflow | 895#ifndef Sudden_Underflow |
849 if (word1(rv) == Tiny1 && !word0(rv)) | 896 if (word1(&rv) == Tiny1 && !word0(&rv)) |
850 goto undfl; 851#endif 852 aadj = 1.; | 897 goto undfl; 898#endif 899 aadj = 1.; |
853 aadj1 = -1.; | 900 dval(&aadj1) = -1.; |
854 } 855 else { 856 /* special case -- power of FLT_RADIX to be */ 857 /* rounded down... */ 858 859 if (aadj < 2./FLT_RADIX) 860 aadj = 1./FLT_RADIX; 861 else 862 aadj *= 0.5; | 901 } 902 else { 903 /* special case -- power of FLT_RADIX to be */ 904 /* rounded down... */ 905 906 if (aadj < 2./FLT_RADIX) 907 aadj = 1./FLT_RADIX; 908 else 909 aadj *= 0.5; |
863 aadj1 = -aadj; | 910 dval(&aadj1) = -aadj; |
864 } 865 } 866 else { 867 aadj *= 0.5; | 911 } 912 } 913 else { 914 aadj *= 0.5; |
868 aadj1 = dsign ? aadj : -aadj; | 915 dval(&aadj1) = dsign ? aadj : -aadj; |
869#ifdef Check_FLT_ROUNDS 870 switch(Rounding) { 871 case 2: /* towards +infinity */ | 916#ifdef Check_FLT_ROUNDS 917 switch(Rounding) { 918 case 2: /* towards +infinity */ |
872 aadj1 -= 0.5; | 919 dval(&aadj1) -= 0.5; |
873 break; 874 case 0: /* towards 0 */ 875 case 3: /* towards -infinity */ | 920 break; 921 case 0: /* towards 0 */ 922 case 3: /* towards -infinity */ |
876 aadj1 += 0.5; | 923 dval(&aadj1) += 0.5; |
877 } 878#else 879 if (Flt_Rounds == 0) | 924 } 925#else 926 if (Flt_Rounds == 0) |
880 aadj1 += 0.5; | 927 dval(&aadj1) += 0.5; |
881#endif /*Check_FLT_ROUNDS*/ 882 } | 928#endif /*Check_FLT_ROUNDS*/ 929 } |
883 y = word0(rv) & Exp_mask; | 930 y = word0(&rv) & Exp_mask; |
884 885 /* Check for overflow */ 886 887 if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { | 931 932 /* Check for overflow */ 933 934 if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { |
888 dval(rv0) = dval(rv); 889 word0(rv) -= P*Exp_msk1; 890 adj = aadj1 * ulp(dval(rv)); 891 dval(rv) += adj; 892 if ((word0(rv) & Exp_mask) >= | 935 dval(&rv0) = dval(&rv); 936 word0(&rv) -= P*Exp_msk1; 937 dval(&adj) = dval(&aadj1) * ulp(&rv); 938 dval(&rv) += dval(&adj); 939 if ((word0(&rv) & Exp_mask) >= |
893 Exp_msk1*(DBL_MAX_EXP+Bias-P)) { | 940 Exp_msk1*(DBL_MAX_EXP+Bias-P)) { |
894 if (word0(rv0) == Big0 && word1(rv0) == Big1) | 941 if (word0(&rv0) == Big0 && word1(&rv0) == Big1) |
895 goto ovfl; | 942 goto ovfl; |
896 word0(rv) = Big0; 897 word1(rv) = Big1; | 943 word0(&rv) = Big0; 944 word1(&rv) = Big1; |
898 goto cont; 899 } 900 else | 945 goto cont; 946 } 947 else |
901 word0(rv) += P*Exp_msk1; | 948 word0(&rv) += P*Exp_msk1; |
902 } 903 else { 904#ifdef Avoid_Underflow 905 if (scale && y <= 2*P*Exp_msk1) { 906 if (aadj <= 0x7fffffff) { 907 if ((z = aadj) <= 0) 908 z = 1; 909 aadj = z; | 949 } 950 else { 951#ifdef Avoid_Underflow 952 if (scale && y <= 2*P*Exp_msk1) { 953 if (aadj <= 0x7fffffff) { 954 if ((z = aadj) <= 0) 955 z = 1; 956 aadj = z; |
910 aadj1 = dsign ? aadj : -aadj; | 957 dval(&aadj1) = dsign ? aadj : -aadj; |
911 } | 958 } |
912 word0(aadj1) += (2*P+1)*Exp_msk1 - y; | 959 word0(&aadj1) += (2*P+1)*Exp_msk1 - y; |
913 } | 960 } |
914 adj = aadj1 * ulp(dval(rv)); 915 dval(rv) += adj; | 961 dval(&adj) = dval(&aadj1) * ulp(&rv); 962 dval(&rv) += dval(&adj); |
916#else 917#ifdef Sudden_Underflow | 963#else 964#ifdef Sudden_Underflow |
918 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { 919 dval(rv0) = dval(rv); 920 word0(rv) += P*Exp_msk1; 921 adj = aadj1 * ulp(dval(rv)); 922 dval(rv) += adj; | 965 if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) { 966 dval(&rv0) = dval(&rv); 967 word0(&rv) += P*Exp_msk1; 968 dval(&adj) = dval(&aadj1) * ulp(&rv); 969 dval(&rv) += adj; |
923#ifdef IBM | 970#ifdef IBM |
924 if ((word0(rv) & Exp_mask) < P*Exp_msk1) | 971 if ((word0(&rv) & Exp_mask) < P*Exp_msk1) |
925#else | 972#else |
926 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) | 973 if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) |
927#endif 928 { | 974#endif 975 { |
929 if (word0(rv0) == Tiny0 930 && word1(rv0) == Tiny1) | 976 if (word0(&rv0) == Tiny0 977 && word1(&rv0) == Tiny1) |
931 goto undfl; | 978 goto undfl; |
932 word0(rv) = Tiny0; 933 word1(rv) = Tiny1; | 979 word0(&rv) = Tiny0; 980 word1(&rv) = Tiny1; |
934 goto cont; 935 } 936 else | 981 goto cont; 982 } 983 else |
937 word0(rv) -= P*Exp_msk1; | 984 word0(&rv) -= P*Exp_msk1; |
938 } 939 else { | 985 } 986 else { |
940 adj = aadj1 * ulp(dval(rv)); 941 dval(rv) += adj; | 987 dval(&adj) = dval(&aadj1) * ulp(&rv); 988 dval(&rv) += adj; |
942 } 943#else /*Sudden_Underflow*/ | 989 } 990#else /*Sudden_Underflow*/ |
944 /* Compute adj so that the IEEE rounding rules will 945 * correctly round rv + adj in some half-way cases. 946 * If rv * ulp(rv) is denormalized (i.e., | 991 /* Compute dval(&adj) so that the IEEE rounding rules will 992 * correctly round rv + dval(&adj) in some half-way cases. 993 * If rv * ulp(&rv) is denormalized (i.e., |
947 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid 948 * trouble from bits lost to denormalization; 949 * example: 1.2e-307 . 950 */ 951 if (y <= (P-1)*Exp_msk1 && aadj > 1.) { | 994 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid 995 * trouble from bits lost to denormalization; 996 * example: 1.2e-307 . 997 */ 998 if (y <= (P-1)*Exp_msk1 && aadj > 1.) { |
952 aadj1 = (double)(int)(aadj + 0.5); | 999 dval(&aadj1) = (double)(int)(aadj + 0.5); |
953 if (!dsign) | 1000 if (!dsign) |
954 aadj1 = -aadj1; | 1001 dval(&aadj1) = -dval(&aadj1); |
955 } | 1002 } |
956 adj = aadj1 * ulp(dval(rv)); 957 dval(rv) += adj; | 1003 dval(&adj) = dval(&aadj1) * ulp(&rv); 1004 dval(&rv) += adj; |
958#endif /*Sudden_Underflow*/ 959#endif /*Avoid_Underflow*/ 960 } | 1005#endif /*Sudden_Underflow*/ 1006#endif /*Avoid_Underflow*/ 1007 } |
961 z = word0(rv) & Exp_mask; | 1008 z = word0(&rv) & Exp_mask; |
962#ifndef SET_INEXACT 963#ifdef Avoid_Underflow 964 if (!scale) 965#endif 966 if (y == z) { 967 /* Can we stop now? */ 968 L = (Long)aadj; 969 aadj -= L; 970 /* The tolerances below are conservative. */ | 1009#ifndef SET_INEXACT 1010#ifdef Avoid_Underflow 1011 if (!scale) 1012#endif 1013 if (y == z) { 1014 /* Can we stop now? */ 1015 L = (Long)aadj; 1016 aadj -= L; 1017 /* The tolerances below are conservative. */ |
971 if (dsign || word1(rv) || word0(rv) & Bndry_mask) { | 1018 if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) { |
972 if (aadj < .4999999 || aadj > .5000001) 973 break; 974 } 975 else if (aadj < .4999999/FLT_RADIX) 976 break; 977 } 978#endif 979 cont: 980 Bfree(bb); 981 Bfree(bd); 982 Bfree(bs); 983 Bfree(delta); 984 } | 1019 if (aadj < .4999999 || aadj > .5000001) 1020 break; 1021 } 1022 else if (aadj < .4999999/FLT_RADIX) 1023 break; 1024 } 1025#endif 1026 cont: 1027 Bfree(bb); 1028 Bfree(bd); 1029 Bfree(bs); 1030 Bfree(delta); 1031 } |
1032 Bfree(bb); 1033 Bfree(bd); 1034 Bfree(bs); 1035 Bfree(bd0); 1036 Bfree(delta); |
|
985#ifdef SET_INEXACT 986 if (inexact) { 987 if (!oldinexact) { | 1037#ifdef SET_INEXACT 1038 if (inexact) { 1039 if (!oldinexact) { |
988 word0(rv0) = Exp_1 + (70 << Exp_shift); 989 word1(rv0) = 0; 990 dval(rv0) += 1.; | 1040 word0(&rv0) = Exp_1 + (70 << Exp_shift); 1041 word1(&rv0) = 0; 1042 dval(&rv0) += 1.; |
991 } 992 } 993 else if (!oldinexact) 994 clear_inexact(); 995#endif 996#ifdef Avoid_Underflow 997 if (scale) { | 1043 } 1044 } 1045 else if (!oldinexact) 1046 clear_inexact(); 1047#endif 1048#ifdef Avoid_Underflow 1049 if (scale) { |
998 word0(rv0) = Exp_1 - 2*P*Exp_msk1; 999 word1(rv0) = 0; 1000 dval(rv) *= dval(rv0); | 1050 word0(&rv0) = Exp_1 - 2*P*Exp_msk1; 1051 word1(&rv0) = 0; 1052 dval(&rv) *= dval(&rv0); |
1001#ifndef NO_ERRNO 1002 /* try to avoid the bug of testing an 8087 register value */ 1003#ifdef IEEE_Arith | 1053#ifndef NO_ERRNO 1054 /* try to avoid the bug of testing an 8087 register value */ 1055#ifdef IEEE_Arith |
1004 if (!(word0(rv) & Exp_mask)) | 1056 if (!(word0(&rv) & Exp_mask)) |
1005#else | 1057#else |
1006 if (word0(rv) == 0 && word1(rv) == 0) | 1058 if (word0(&rv) == 0 && word1(&rv) == 0) |
1007#endif 1008 errno = ERANGE; 1009#endif 1010 } 1011#endif /* Avoid_Underflow */ 1012#ifdef SET_INEXACT | 1059#endif 1060 errno = ERANGE; 1061#endif 1062 } 1063#endif /* Avoid_Underflow */ 1064#ifdef SET_INEXACT |
1013 if (inexact && !(word0(rv) & Exp_mask)) { | 1065 if (inexact && !(word0(&rv) & Exp_mask)) { |
1014 /* set underflow bit */ | 1066 /* set underflow bit */ |
1015 dval(rv0) = 1e-300; 1016 dval(rv0) *= dval(rv0); | 1067 dval(&rv0) = 1e-300; 1068 dval(&rv0) *= dval(&rv0); |
1017 } 1018#endif | 1069 } 1070#endif |
1019 retfree: 1020 Bfree(bb); 1021 Bfree(bd); 1022 Bfree(bs); 1023 Bfree(bd0); 1024 Bfree(delta); | |
1025 ret: 1026 if (se) 1027 *se = (char *)s; | 1071 ret: 1072 if (se) 1073 *se = (char *)s; |
1028 return sign ? -dval(rv) : dval(rv); | 1074 return sign ? -dval(&rv) : dval(&rv); |
1029 } 1030 | 1075 } 1076 |