Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /**************************************************************** | 1 /**************************************************************** |
| 2 * | 2 * |
| 3 * The author of this software is David M. Gay. | 3 * The author of this software is David M. Gay. |
| 4 * | 4 * |
| 5 * Copyright (c) 1991, 2000, 2001 by Lucent Technologies. | 5 * Copyright (c) 1991, 2000, 2001 by Lucent Technologies. |
| 6 * | 6 * |
| 7 * Permission to use, copy, modify, and distribute this software for any | 7 * Permission to use, copy, modify, and distribute this software for any |
| 8 * purpose without fee is hereby granted, provided that this entire notice | 8 * purpose without fee is hereby granted, provided that this entire notice |
| 9 * is included in all copies of any software which is or includes a copy | 9 * is included in all copies of any software which is or includes a copy |
| 10 * or modification of this software and in all copies of the supporting | 10 * or modification of this software and in all copies of the supporting |
| (...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 645 #endif | 645 #endif |
| 646 } | 646 } |
| 647 while(++i < wds); | 647 while(++i < wds); |
| 648 if (carry) { | 648 if (carry) { |
| 649 if (wds >= b->maxwds) { | 649 if (wds >= b->maxwds) { |
| 650 b1 = Balloc(b->k+1); | 650 b1 = Balloc(b->k+1); |
| 651 Bcopy(b1, b); | 651 Bcopy(b1, b); |
| 652 Bfree(b); | 652 Bfree(b); |
| 653 b = b1; | 653 b = b1; |
| 654 } | 654 } |
| 655 » » b->x[wds++] = carry; | 655 » » b->x[wds++] = (ULong)carry; |
| 656 b->wds = wds; | 656 b->wds = wds; |
| 657 } | 657 } |
| 658 return b; | 658 return b; |
| 659 } | 659 } |
| 660 | 660 |
| 661 static Bigint * | 661 static Bigint * |
| 662 s2b | 662 s2b |
| 663 #ifdef KR_headers | 663 #ifdef KR_headers |
| 664 (s, nd0, nd, y9, dplen) CONST char *s; int nd0, nd, dplen; ULong y9; | 664 (s, nd0, nd, y9, dplen) CONST char *s; int nd0, nd, dplen; ULong y9; |
| 665 #else | 665 #else |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 840 if (y) { | 840 if (y) { |
| 841 x = xa; | 841 x = xa; |
| 842 xc = xc0; | 842 xc = xc0; |
| 843 carry = 0; | 843 carry = 0; |
| 844 do { | 844 do { |
| 845 z = *x++ * (ULLong)y + *xc + carry; | 845 z = *x++ * (ULLong)y + *xc + carry; |
| 846 carry = z >> 32; | 846 carry = z >> 32; |
| 847 *xc++ = z & FFFFFFFF; | 847 *xc++ = z & FFFFFFFF; |
| 848 } | 848 } |
| 849 while(x < xae); | 849 while(x < xae); |
| 850 » » » *xc = carry; | 850 » » » *xc = (ULong)carry; |
| 851 } | 851 } |
| 852 } | 852 } |
| 853 #else | 853 #else |
| 854 #ifdef Pack_32 | 854 #ifdef Pack_32 |
| 855 for(; xb < xbe; xb++, xc0++) { | 855 for(; xb < xbe; xb++, xc0++) { |
| 856 if (y = *xb & 0xffff) { | 856 if (y = *xb & 0xffff) { |
| 857 x = xa; | 857 x = xa; |
| 858 xc = xc0; | 858 xc = xc0; |
| 859 carry = 0; | 859 carry = 0; |
| 860 do { | 860 do { |
| (...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1504 | 1504 |
| 1505 static void | 1505 static void |
| 1506 #ifdef KR_headers | 1506 #ifdef KR_headers |
| 1507 htinit(h, s, inc) unsigned char *h; unsigned char *s; int inc; | 1507 htinit(h, s, inc) unsigned char *h; unsigned char *s; int inc; |
| 1508 #else | 1508 #else |
| 1509 htinit(unsigned char *h, unsigned char *s, int inc) | 1509 htinit(unsigned char *h, unsigned char *s, int inc) |
| 1510 #endif | 1510 #endif |
| 1511 { | 1511 { |
| 1512 int i, j; | 1512 int i, j; |
| 1513 for(i = 0; (j = s[i]) !=0; i++) | 1513 for(i = 0; (j = s[i]) !=0; i++) |
| 1514 » » h[j] = i + inc; | 1514 » » h[j] = (unsigned char)(i + inc); |
| 1515 } | 1515 } |
| 1516 | 1516 |
| 1517 static void | 1517 static void |
| 1518 #ifdef KR_headers | 1518 #ifdef KR_headers |
| 1519 hexdig_init() | 1519 hexdig_init() |
| 1520 #else | 1520 #else |
| 1521 hexdig_init(void) | 1521 hexdig_init(void) |
| 1522 #endif | 1522 #endif |
| 1523 { | 1523 { |
| 1524 #define USC (unsigned char *) | 1524 #define USC (unsigned char *) |
| (...skipping 1771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3296 word1(&rv) = Big1; | 3296 word1(&rv) = Big1; |
| 3297 goto cont; | 3297 goto cont; |
| 3298 } | 3298 } |
| 3299 else | 3299 else |
| 3300 word0(&rv) += P*Exp_msk1; | 3300 word0(&rv) += P*Exp_msk1; |
| 3301 } | 3301 } |
| 3302 else { | 3302 else { |
| 3303 #ifdef Avoid_Underflow | 3303 #ifdef Avoid_Underflow |
| 3304 if (bc.scale && y <= 2*P*Exp_msk1) { | 3304 if (bc.scale && y <= 2*P*Exp_msk1) { |
| 3305 if (aadj <= 0x7fffffff) { | 3305 if (aadj <= 0x7fffffff) { |
| 3306 » » » » » if ((z = aadj) <= 0) | 3306 » » » » » if ((z = (ULong)aadj) <= 0) |
| 3307 z = 1; | 3307 z = 1; |
| 3308 aadj = z; | 3308 aadj = z; |
| 3309 aadj1 = bc.dsign ? aadj : -aadj; | 3309 aadj1 = bc.dsign ? aadj : -aadj; |
| 3310 } | 3310 } |
| 3311 dval(&aadj2) = aadj1; | 3311 dval(&aadj2) = aadj1; |
| 3312 word0(&aadj2) += (2*P+1)*Exp_msk1 - y; | 3312 word0(&aadj2) += (2*P+1)*Exp_msk1 - y; |
| 3313 aadj1 = dval(&aadj2); | 3313 aadj1 = dval(&aadj2); |
| 3314 } | 3314 } |
| 3315 adj.d = aadj1 * ulp(&rv); | 3315 adj.d = aadj1 * ulp(&rv); |
| 3316 dval(&rv) += adj.d; | 3316 dval(&rv) += adj.d; |
| (...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3852 goto no_digits; | 3852 goto no_digits; |
| 3853 goto fast_failed; | 3853 goto fast_failed; |
| 3854 } | 3854 } |
| 3855 #ifndef No_leftright | 3855 #ifndef No_leftright |
| 3856 if (leftright) { | 3856 if (leftright) { |
| 3857 /* Use Steele & White method of only | 3857 /* Use Steele & White method of only |
| 3858 * generating digits needed. | 3858 * generating digits needed. |
| 3859 */ | 3859 */ |
| 3860 dval(&eps) = 0.5/tens[ilim-1] - dval(&eps); | 3860 dval(&eps) = 0.5/tens[ilim-1] - dval(&eps); |
| 3861 for(i = 0;;) { | 3861 for(i = 0;;) { |
| 3862 » » » » L = dval(&u); | 3862 » » » » L = (long)dval(&u); |
| 3863 dval(&u) -= L; | 3863 dval(&u) -= L; |
| 3864 » » » » *s++ = '0' + (int)L; | 3864 » » » » *s++ = '0' + (char)L; |
| 3865 if (dval(&u) < dval(&eps)) | 3865 if (dval(&u) < dval(&eps)) |
| 3866 goto ret1; | 3866 goto ret1; |
| 3867 if (1. - dval(&u) < dval(&eps)) | 3867 if (1. - dval(&u) < dval(&eps)) |
| 3868 goto bump_up; | 3868 goto bump_up; |
| 3869 if (++i >= ilim) | 3869 if (++i >= ilim) |
| 3870 break; | 3870 break; |
| 3871 dval(&eps) *= 10.; | 3871 dval(&eps) *= 10.; |
| 3872 dval(&u) *= 10.; | 3872 dval(&u) *= 10.; |
| 3873 } | 3873 } |
| 3874 } | 3874 } |
| 3875 else { | 3875 else { |
| 3876 #endif | 3876 #endif |
| 3877 /* Generate ilim digits, then fix them up. */ | 3877 /* Generate ilim digits, then fix them up. */ |
| 3878 dval(&eps) *= tens[ilim-1]; | 3878 dval(&eps) *= tens[ilim-1]; |
| 3879 for(i = 1;; i++, dval(&u) *= 10.) { | 3879 for(i = 1;; i++, dval(&u) *= 10.) { |
| 3880 L = (Long)(dval(&u)); | 3880 L = (Long)(dval(&u)); |
| 3881 if (!(dval(&u) -= L)) | 3881 if (!(dval(&u) -= L)) |
| 3882 ilim = i; | 3882 ilim = i; |
| 3883 » » » » *s++ = '0' + (int)L; | 3883 » » » » *s++ = '0' + (char)L; |
| 3884 if (i == ilim) { | 3884 if (i == ilim) { |
| 3885 if (dval(&u) > 0.5 + dval(&eps)) | 3885 if (dval(&u) > 0.5 + dval(&eps)) |
| 3886 goto bump_up; | 3886 goto bump_up; |
| 3887 else if (dval(&u) < 0.5 - dval(&eps)) { | 3887 else if (dval(&u) < 0.5 - dval(&eps)) { |
| 3888 while(*--s == '0') {} | 3888 while(*--s == '0') {} |
| 3889 s++; | 3889 s++; |
| 3890 goto ret1; | 3890 goto ret1; |
| 3891 } | 3891 } |
| 3892 break; | 3892 break; |
| 3893 } | 3893 } |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 3916 for(i = 1; i <= k + 1; i++, dval(&u) *= 10.) { | 3916 for(i = 1; i <= k + 1; i++, dval(&u) *= 10.) { |
| 3917 L = (Long)(dval(&u) / ds); | 3917 L = (Long)(dval(&u) / ds); |
| 3918 dval(&u) -= L*ds; | 3918 dval(&u) -= L*ds; |
| 3919 #ifdef Check_FLT_ROUNDS | 3919 #ifdef Check_FLT_ROUNDS |
| 3920 /* If FLT_ROUNDS == 2, L will usually be high by 1 */ | 3920 /* If FLT_ROUNDS == 2, L will usually be high by 1 */ |
| 3921 if (dval(&u) < 0) { | 3921 if (dval(&u) < 0) { |
| 3922 L--; | 3922 L--; |
| 3923 dval(&u) += ds; | 3923 dval(&u) += ds; |
| 3924 } | 3924 } |
| 3925 #endif | 3925 #endif |
| 3926 » » » *s++ = '0' + (int)L; | 3926 » » » *s++ = '0' + (char)L; |
| 3927 if (!dval(&u)) { | 3927 if (!dval(&u)) { |
| 3928 #ifdef SET_INEXACT | 3928 #ifdef SET_INEXACT |
| 3929 inexact = 0; | 3929 inexact = 0; |
| 3930 #endif | 3930 #endif |
| 3931 break; | 3931 break; |
| 3932 } | 3932 } |
| 3933 if (i == ilim) { | 3933 if (i == ilim) { |
| 3934 #ifdef Honor_FLT_ROUNDS | 3934 #ifdef Honor_FLT_ROUNDS |
| 3935 if (mode > 1) | 3935 if (mode > 1) |
| 3936 switch(Rounding) { | 3936 switch(Rounding) { |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4094 #endif | 4094 #endif |
| 4095 ) { | 4095 ) { |
| 4096 if (dig == '9') | 4096 if (dig == '9') |
| 4097 goto round_9_up; | 4097 goto round_9_up; |
| 4098 if (j > 0) | 4098 if (j > 0) |
| 4099 dig++; | 4099 dig++; |
| 4100 #ifdef SET_INEXACT | 4100 #ifdef SET_INEXACT |
| 4101 else if (!b->x[0] && b->wds <= 1) | 4101 else if (!b->x[0] && b->wds <= 1) |
| 4102 inexact = 0; | 4102 inexact = 0; |
| 4103 #endif | 4103 #endif |
| 4104 » » » » *s++ = dig; | 4104 » » » » *s++ = (char)dig; |
| 4105 goto ret; | 4105 goto ret; |
| 4106 } | 4106 } |
| 4107 #endif | 4107 #endif |
| 4108 if (j < 0 || (j == 0 && mode != 1 | 4108 if (j < 0 || (j == 0 && mode != 1 |
| 4109 #ifndef ROUND_BIASED | 4109 #ifndef ROUND_BIASED |
| 4110 && !(word1(&u) & 1) | 4110 && !(word1(&u) & 1) |
| 4111 #endif | 4111 #endif |
| 4112 )) { | 4112 )) { |
| 4113 if (!b->x[0] && b->wds <= 1) { | 4113 if (!b->x[0] && b->wds <= 1) { |
| 4114 #ifdef SET_INEXACT | 4114 #ifdef SET_INEXACT |
| 4115 inexact = 0; | 4115 inexact = 0; |
| 4116 #endif | 4116 #endif |
| 4117 goto accept_dig; | 4117 goto accept_dig; |
| 4118 } | 4118 } |
| 4119 #ifdef Honor_FLT_ROUNDS | 4119 #ifdef Honor_FLT_ROUNDS |
| 4120 if (mode > 1) | 4120 if (mode > 1) |
| 4121 switch(Rounding) { | 4121 switch(Rounding) { |
| 4122 case 0: goto accept_dig; | 4122 case 0: goto accept_dig; |
| 4123 case 2: goto keep_dig; | 4123 case 2: goto keep_dig; |
| 4124 } | 4124 } |
| 4125 #endif /*Honor_FLT_ROUNDS*/ | 4125 #endif /*Honor_FLT_ROUNDS*/ |
| 4126 if (j1 > 0) { | 4126 if (j1 > 0) { |
| 4127 b = lshift(b, 1); | 4127 b = lshift(b, 1); |
| 4128 j1 = cmp(b, S); | 4128 j1 = cmp(b, S); |
| 4129 if ((j1 > 0 || (j1 == 0 && dig & 1)) | 4129 if ((j1 > 0 || (j1 == 0 && dig & 1)) |
| 4130 && dig++ == '9') | 4130 && dig++ == '9') |
| 4131 goto round_9_up; | 4131 goto round_9_up; |
| 4132 } | 4132 } |
| 4133 accept_dig: | 4133 accept_dig: |
| 4134 » » » » *s++ = dig; | 4134 » » » » *s++ = (char)dig; |
| 4135 goto ret; | 4135 goto ret; |
| 4136 } | 4136 } |
| 4137 if (j1 > 0) { | 4137 if (j1 > 0) { |
| 4138 #ifdef Honor_FLT_ROUNDS | 4138 #ifdef Honor_FLT_ROUNDS |
| 4139 if (!Rounding) | 4139 if (!Rounding) |
| 4140 goto accept_dig; | 4140 goto accept_dig; |
| 4141 #endif | 4141 #endif |
| 4142 if (dig == '9') { /* possible if i == 1 */ | 4142 if (dig == '9') { /* possible if i == 1 */ |
| 4143 round_9_up: | 4143 round_9_up: |
| 4144 *s++ = '9'; | 4144 *s++ = '9'; |
| 4145 goto roundoff; | 4145 goto roundoff; |
| 4146 } | 4146 } |
| 4147 » » » » *s++ = dig + 1; | 4147 » » » » *s++ = (char)dig + 1; |
|
scottmg
2014/09/25 06:44:16
(man this code is frightening)
this seems like it
Peter Kasting
2014/09/25 08:31:22
What's even worse is that we have multiple copies
| |
| 4148 goto ret; | 4148 goto ret; |
| 4149 } | 4149 } |
| 4150 #ifdef Honor_FLT_ROUNDS | 4150 #ifdef Honor_FLT_ROUNDS |
| 4151 keep_dig: | 4151 keep_dig: |
| 4152 #endif | 4152 #endif |
| 4153 » » » *s++ = dig; | 4153 » » » *s++ = (char)dig; |
| 4154 if (i == ilim) | 4154 if (i == ilim) |
| 4155 break; | 4155 break; |
| 4156 b = multadd(b, 10, 0); | 4156 b = multadd(b, 10, 0); |
| 4157 if (mlo == mhi) | 4157 if (mlo == mhi) |
| 4158 mlo = mhi = multadd(mhi, 10, 0); | 4158 mlo = mhi = multadd(mhi, 10, 0); |
| 4159 else { | 4159 else { |
| 4160 mlo = multadd(mlo, 10, 0); | 4160 mlo = multadd(mlo, 10, 0); |
| 4161 mhi = multadd(mhi, 10, 0); | 4161 mhi = multadd(mhi, 10, 0); |
| 4162 } | 4162 } |
| 4163 } | 4163 } |
| 4164 } | 4164 } |
| 4165 else | 4165 else |
| 4166 for(i = 1;; i++) { | 4166 for(i = 1;; i++) { |
| 4167 » » » *s++ = dig = quorem(b,S) + '0'; | 4167 » » » dig = quorem(b,S) + '0'; |
| 4168 » » » *s++ = (char)dig; | |
| 4168 if (!b->x[0] && b->wds <= 1) { | 4169 if (!b->x[0] && b->wds <= 1) { |
| 4169 #ifdef SET_INEXACT | 4170 #ifdef SET_INEXACT |
| 4170 inexact = 0; | 4171 inexact = 0; |
| 4171 #endif | 4172 #endif |
| 4172 goto ret; | 4173 goto ret; |
| 4173 } | 4174 } |
| 4174 if (i >= ilim) | 4175 if (i >= ilim) |
| 4175 break; | 4176 break; |
| 4176 b = multadd(b, 10, 0); | 4177 b = multadd(b, 10, 0); |
| 4177 } | 4178 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4224 #endif | 4225 #endif |
| 4225 Bfree(b); | 4226 Bfree(b); |
| 4226 *s = 0; | 4227 *s = 0; |
| 4227 *decpt = k + 1; | 4228 *decpt = k + 1; |
| 4228 if (rve) | 4229 if (rve) |
| 4229 *rve = s; | 4230 *rve = s; |
| 4230 return s0; | 4231 return s0; |
| 4231 } | 4232 } |
| 4232 | 4233 |
| 4233 } // namespace dmg_fp | 4234 } // namespace dmg_fp |
| OLD | NEW |