Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(398)

Side by Side Diff: src/third_party/dtoa/dtoa.c

Issue 3172008: Fix strict aliasing rule violations in dtoa.c. (Closed)
Patch Set: Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/platform-posix.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 #define CONST const 263 #define CONST const
264 #endif 264 #endif
265 #endif 265 #endif
266 266
267 #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1 267 #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
268 Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined. 268 Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
269 #endif 269 #endif
270 270
271 typedef union { double d; ULong L[2]; } U; 271 typedef union { double d; ULong L[2]; } U;
272 272
273 #ifdef YES_ALIAS
274 #define dval(x) x
275 #ifdef IEEE_8087 273 #ifdef IEEE_8087
276 #define word0(x) ((ULong *)&x)[1] 274 #define word0(x) (x).L[1]
277 #define word1(x) ((ULong *)&x)[0] 275 #define word1(x) (x).L[0]
278 #else 276 #else
279 #define word0(x) ((ULong *)&x)[0] 277 #define word0(x) (x).L[0]
280 #define word1(x) ((ULong *)&x)[1] 278 #define word1(x) (x).L[1]
281 #endif 279 #endif
282 #else 280 #define dval(x) (x).d
283 #ifdef IEEE_8087
284 #define word0(x) ((U*)&x)->L[1]
285 #define word1(x) ((U*)&x)->L[0]
286 #else
287 #define word0(x) ((U*)&x)->L[0]
288 #define word1(x) ((U*)&x)->L[1]
289 #endif
290 #define dval(x) ((U*)&x)->d
291 #endif
292 281
293 /* The following definition of Storeinc is appropriate for MIPS processors. 282 /* The following definition of Storeinc is appropriate for MIPS processors.
294 * An alternative that might be better on some machines is 283 * An alternative that might be better on some machines is
295 * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) 284 * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
296 */ 285 */
297 #if defined(IEEE_8087) + defined(VAX) 286 #if defined(IEEE_8087) + defined(VAX)
298 #define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \ 287 #define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
299 ((unsigned short *)a)[0] = (unsigned short)c, a++) 288 ((unsigned short *)a)[0] = (unsigned short)c, a++)
300 #else 289 #else
301 #define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \ 290 #define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 #endif 1090 #endif
1102 while(!*--xc) 1091 while(!*--xc)
1103 wa--; 1092 wa--;
1104 c->wds = wa; 1093 c->wds = wa;
1105 return c; 1094 return c;
1106 } 1095 }
1107 1096
1108 static double 1097 static double
1109 ulp 1098 ulp
1110 #ifdef KR_headers 1099 #ifdef KR_headers
1111 » (x) double x; 1100 » (dx) double dx;
1112 #else 1101 #else
1113 » (double x) 1102 » (double dx)
1114 #endif 1103 #endif
1115 { 1104 {
1116 register Long L; 1105 register Long L;
1117 » double a; 1106 U x, a;
1107
1108 dval(x) = dx;
1118 1109
1119 L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; 1110 L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
1120 #ifndef Avoid_Underflow 1111 #ifndef Avoid_Underflow
1121 #ifndef Sudden_Underflow 1112 #ifndef Sudden_Underflow
1122 if (L > 0) { 1113 if (L > 0) {
1123 #endif 1114 #endif
1124 #endif 1115 #endif
1125 #ifdef IBM 1116 #ifdef IBM
1126 L |= Exp_msk1 >> 4; 1117 L |= Exp_msk1 >> 4;
1127 #endif 1118 #endif
(...skipping 22 matching lines...) Expand all
1150 static double 1141 static double
1151 b2d 1142 b2d
1152 #ifdef KR_headers 1143 #ifdef KR_headers
1153 (a, e) Bigint *a; int *e; 1144 (a, e) Bigint *a; int *e;
1154 #else 1145 #else
1155 (Bigint *a, int *e) 1146 (Bigint *a, int *e)
1156 #endif 1147 #endif
1157 { 1148 {
1158 ULong *xa, *xa0, w, y, z; 1149 ULong *xa, *xa0, w, y, z;
1159 int k; 1150 int k;
1160 » double d; 1151 » U d;
1161 #ifdef VAX 1152 #ifdef VAX
1162 ULong d0, d1; 1153 ULong d0, d1;
1163 #else 1154 #else
1164 #define d0 word0(d) 1155 #define d0 word0(d)
1165 #define d1 word1(d) 1156 #define d1 word1(d)
1166 #endif 1157 #endif
1167 1158
1168 xa0 = a->x; 1159 xa0 = a->x;
1169 xa = xa0 + a->wds; 1160 xa = xa0 + a->wds;
1170 y = *--xa; 1161 y = *--xa;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1213 #else 1204 #else
1214 #undef d0 1205 #undef d0
1215 #undef d1 1206 #undef d1
1216 #endif 1207 #endif
1217 return dval(d); 1208 return dval(d);
1218 } 1209 }
1219 1210
1220 static Bigint * 1211 static Bigint *
1221 d2b 1212 d2b
1222 #ifdef KR_headers 1213 #ifdef KR_headers
1223 » (d, e, bits) double d; int *e, *bits; 1214 » (dd, e, bits) double dd; int *e, *bits;
1224 #else 1215 #else
1225 » (double d, int *e, int *bits) 1216 » (double dd, int *e, int *bits)
1226 #endif 1217 #endif
1227 { 1218 {
1228 Bigint *b; 1219 Bigint *b;
1229 int de, k; 1220 int de, k;
1230 ULong *x, y, z; 1221 ULong *x, y, z;
1231 #ifndef Sudden_Underflow 1222 #ifndef Sudden_Underflow
1232 int i; 1223 int i;
1233 #endif 1224 #endif
1234 #ifdef VAX 1225 #ifdef VAX
1235 ULong d0, d1; 1226 ULong d0, d1;
1236 d0 = word0(d) >> 16 | word0(d) << 16; 1227 d0 = word0(d) >> 16 | word0(d) << 16;
1237 d1 = word1(d) >> 16 | word1(d) << 16; 1228 d1 = word1(d) >> 16 | word1(d) << 16;
1238 #else 1229 #else
1230 U d;
1231 dval(d) = dd;
1239 #define d0 word0(d) 1232 #define d0 word0(d)
1240 #define d1 word1(d) 1233 #define d1 word1(d)
1241 #endif 1234 #endif
1242 1235
1243 #ifdef Pack_32 1236 #ifdef Pack_32
1244 b = Balloc(1); 1237 b = Balloc(1);
1245 #else 1238 #else
1246 b = Balloc(2); 1239 b = Balloc(2);
1247 #endif 1240 #endif
1248 x = b->x; 1241 x = b->x;
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1361 #undef d1 1354 #undef d1
1362 1355
1363 static double 1356 static double
1364 ratio 1357 ratio
1365 #ifdef KR_headers 1358 #ifdef KR_headers
1366 (a, b) Bigint *a, *b; 1359 (a, b) Bigint *a, *b;
1367 #else 1360 #else
1368 (Bigint *a, Bigint *b) 1361 (Bigint *a, Bigint *b)
1369 #endif 1362 #endif
1370 { 1363 {
1371 » double da, db; 1364 » U da, db;
1372 int k, ka, kb; 1365 int k, ka, kb;
1373 1366
1374 dval(da) = b2d(a, &ka); 1367 dval(da) = b2d(a, &ka);
1375 dval(db) = b2d(b, &kb); 1368 dval(db) = b2d(b, &kb);
1376 #ifdef Pack_32 1369 #ifdef Pack_32
1377 k = ka - kb + 32*(a->wds - b->wds); 1370 k = ka - kb + 32*(a->wds - b->wds);
1378 #else 1371 #else
1379 k = ka - kb + 16*(a->wds - b->wds); 1372 k = ka - kb + 16*(a->wds - b->wds);
1380 #endif 1373 #endif
1381 #ifdef IBM 1374 #ifdef IBM
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
1535 #else 1528 #else
1536 (CONST char *s00, char **se) 1529 (CONST char *s00, char **se)
1537 #endif 1530 #endif
1538 { 1531 {
1539 #ifdef Avoid_Underflow 1532 #ifdef Avoid_Underflow
1540 int scale; 1533 int scale;
1541 #endif 1534 #endif
1542 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, 1535 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
1543 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; 1536 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
1544 CONST char *s, *s0, *s1; 1537 CONST char *s, *s0, *s1;
1545 » double aadj, aadj1, adj, rv, rv0; 1538 double aadj;
1539 » U aadj1, adj, rv, rv0;
1546 Long L; 1540 Long L;
1547 ULong y, z; 1541 ULong y, z;
1548 Bigint *bb = NULL, *bb1, *bd = NULL, *bd0, *bs = NULL, *delta = NULL; 1542 Bigint *bb = NULL, *bb1, *bd = NULL, *bd0, *bs = NULL, *delta = NULL;
1549 #ifdef SET_INEXACT 1543 #ifdef SET_INEXACT
1550 int inexact, oldinexact; 1544 int inexact, oldinexact;
1551 #endif 1545 #endif
1552 #ifdef Honor_FLT_ROUNDS 1546 #ifdef Honor_FLT_ROUNDS
1553 int rounding; 1547 int rounding;
1554 #endif 1548 #endif
1555 #ifdef USE_LOCALE 1549 #ifdef USE_LOCALE
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after
2035 /* Error is less than an ulp */ 2029 /* Error is less than an ulp */
2036 if (!delta->x[0] && delta->wds <= 1) { 2030 if (!delta->x[0] && delta->wds <= 1) {
2037 /* exact */ 2031 /* exact */
2038 #ifdef SET_INEXACT 2032 #ifdef SET_INEXACT
2039 inexact = 0; 2033 inexact = 0;
2040 #endif 2034 #endif
2041 break; 2035 break;
2042 } 2036 }
2043 if (rounding) { 2037 if (rounding) {
2044 if (dsign) { 2038 if (dsign) {
2045 » » » » » » adj = 1.; 2039 » » » » » » dval(adj) = 1.;
2046 goto apply_adj; 2040 goto apply_adj;
2047 } 2041 }
2048 } 2042 }
2049 else if (!dsign) { 2043 else if (!dsign) {
2050 » » » » » adj = -1.; 2044 » » » » » dval(adj) = -1.;
2051 if (!word1(rv) 2045 if (!word1(rv)
2052 && !(word0(rv) & Frac_mask)) { 2046 && !(word0(rv) & Frac_mask)) {
2053 y = word0(rv) & Exp_mask; 2047 y = word0(rv) & Exp_mask;
2054 #ifdef Avoid_Underflow 2048 #ifdef Avoid_Underflow
2055 if (!scale || y > 2*P*Exp_msk1) 2049 if (!scale || y > 2*P*Exp_msk1)
2056 #else 2050 #else
2057 if (y) 2051 if (y)
2058 #endif 2052 #endif
2059 { 2053 {
2060 delta = lshift(delta,Log2P); 2054 delta = lshift(delta,Log2P);
2061 if (cmp(delta, bs) <= 0) 2055 if (cmp(delta, bs) <= 0)
2062 » » » » » » » adj = -0.5; 2056 » » » » » » » dval(adj) = -0.5;
2063 } 2057 }
2064 } 2058 }
2065 apply_adj: 2059 apply_adj:
2066 #ifdef Avoid_Underflow 2060 #ifdef Avoid_Underflow
2067 if (scale && (y = word0(rv) & Exp_mask) 2061 if (scale && (y = word0(rv) & Exp_mask)
2068 <= 2*P*Exp_msk1) 2062 <= 2*P*Exp_msk1)
2069 word0(adj) += (2*P+1)*Exp_msk1 - y; 2063 word0(adj) += (2*P+1)*Exp_msk1 - y;
2070 #else 2064 #else
2071 #ifdef Sudden_Underflow 2065 #ifdef Sudden_Underflow
2072 if ((word0(rv) & Exp_mask) <= 2066 if ((word0(rv) & Exp_mask) <=
2073 P*Exp_msk1) { 2067 P*Exp_msk1) {
2074 word0(rv) += P*Exp_msk1; 2068 word0(rv) += P*Exp_msk1;
2075 » » » » » » dval(rv) += adj*ulp(dval(rv)); 2069 » » » » » » dval(rv) += dval(adj)*ulp(dval(r v));
2076 word0(rv) -= P*Exp_msk1; 2070 word0(rv) -= P*Exp_msk1;
2077 } 2071 }
2078 else 2072 else
2079 #endif /*Sudden_Underflow*/ 2073 #endif /*Sudden_Underflow*/
2080 #endif /*Avoid_Underflow*/ 2074 #endif /*Avoid_Underflow*/
2081 » » » » » dval(rv) += adj*ulp(dval(rv)); 2075 » » » » » dval(rv) += dval(adj)*ulp(dval(rv));
2082 } 2076 }
2083 break; 2077 break;
2084 } 2078 }
2085 » » » adj = ratio(delta, bs); 2079 » » » dval(adj) = ratio(delta, bs);
2086 » » » if (adj < 1.) 2080 » » » if (dval(adj) < 1.)
2087 » » » » adj = 1.; 2081 » » » » dval(adj) = 1.;
2088 » » » if (adj <= 0x7ffffffe) { 2082 » » » if (dval(adj) <= 0x7ffffffe) {
2089 /* adj = rounding ? ceil(adj) : floor(adj); */ 2083 /* adj = rounding ? ceil(adj) : floor(adj); */
2090 » » » » y = adj; 2084 » » » » y = dval(adj);
2091 » » » » if (y != adj) { 2085 » » » » if (y != dval(adj)) {
2092 if (!((rounding>>1) ^ dsign)) 2086 if (!((rounding>>1) ^ dsign))
2093 y++; 2087 y++;
2094 » » » » » adj = y; 2088 » » » » » dval(adj) = y;
2095 } 2089 }
2096 } 2090 }
2097 #ifdef Avoid_Underflow 2091 #ifdef Avoid_Underflow
2098 if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1) 2092 if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
2099 word0(adj) += (2*P+1)*Exp_msk1 - y; 2093 word0(adj) += (2*P+1)*Exp_msk1 - y;
2100 #else 2094 #else
2101 #ifdef Sudden_Underflow 2095 #ifdef Sudden_Underflow
2102 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { 2096 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
2103 word0(rv) += P*Exp_msk1; 2097 word0(rv) += P*Exp_msk1;
2104 » » » » adj *= ulp(dval(rv)); 2098 » » » » dval(adj) *= ulp(dval(rv));
2105 if (dsign) 2099 if (dsign)
2106 » » » » » dval(rv) += adj; 2100 » » » » » dval(rv) += dval(adj);
2107 else 2101 else
2108 » » » » » dval(rv) -= adj; 2102 » » » » » dval(rv) -= dval(adj);
2109 word0(rv) -= P*Exp_msk1; 2103 word0(rv) -= P*Exp_msk1;
2110 goto cont; 2104 goto cont;
2111 } 2105 }
2112 #endif /*Sudden_Underflow*/ 2106 #endif /*Sudden_Underflow*/
2113 #endif /*Avoid_Underflow*/ 2107 #endif /*Avoid_Underflow*/
2114 » » » adj *= ulp(dval(rv)); 2108 » » » dval(adj) *= ulp(dval(rv));
2115 if (dsign) 2109 if (dsign)
2116 » » » » dval(rv) += adj; 2110 » » » » dval(rv) += dval(adj);
2117 else 2111 else
2118 » » » » dval(rv) -= adj; 2112 » » » » dval(rv) -= dval(adj);
2119 goto cont; 2113 goto cont;
2120 } 2114 }
2121 #endif /*Honor_FLT_ROUNDS*/ 2115 #endif /*Honor_FLT_ROUNDS*/
2122 2116
2123 if (i < 0) { 2117 if (i < 0) {
2124 /* Error is less than half an ulp -- check for 2118 /* Error is less than half an ulp -- check for
2125 * special case of mantissa a power of two. 2119 * special case of mantissa a power of two.
2126 */ 2120 */
2127 if (dsign || word1(rv) || word0(rv) & Bndry_mask 2121 if (dsign || word1(rv) || word0(rv) & Bndry_mask
2128 #ifdef IEEE_Arith 2122 #ifdef IEEE_Arith
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
2230 #endif 2224 #endif
2231 } 2225 }
2232 #ifdef Avoid_Underflow 2226 #ifdef Avoid_Underflow
2233 dsign = 1 - dsign; 2227 dsign = 1 - dsign;
2234 #endif 2228 #endif
2235 #endif 2229 #endif
2236 break; 2230 break;
2237 } 2231 }
2238 if ((aadj = ratio(delta, bs)) <= 2.) { 2232 if ((aadj = ratio(delta, bs)) <= 2.) {
2239 if (dsign) 2233 if (dsign)
2240 » » » » aadj = aadj1 = 1.; 2234 aadj = dval(aadj1) = 1.;
2241 else if (word1(rv) || word0(rv) & Bndry_mask) { 2235 else if (word1(rv) || word0(rv) & Bndry_mask) {
2242 #ifndef Sudden_Underflow 2236 #ifndef Sudden_Underflow
2243 if (word1(rv) == Tiny1 && !word0(rv)) 2237 if (word1(rv) == Tiny1 && !word0(rv))
2244 goto undfl; 2238 goto undfl;
2245 #endif 2239 #endif
2246 aadj = 1.; 2240 aadj = 1.;
2247 » » » » aadj1 = -1.; 2241 » » » » dval(aadj1) = -1.;
2248 } 2242 }
2249 else { 2243 else {
2250 /* special case -- power of FLT_RADIX to be */ 2244 /* special case -- power of FLT_RADIX to be */
2251 /* rounded down... */ 2245 /* rounded down... */
2252 2246
2253 if (aadj < 2./FLT_RADIX) 2247 if (aadj < 2./FLT_RADIX)
2254 aadj = 1./FLT_RADIX; 2248 aadj = 1./FLT_RADIX;
2255 else 2249 else
2256 aadj *= 0.5; 2250 aadj *= 0.5;
2257 » » » » aadj1 = -aadj; 2251 » » » » dval(aadj1) = -aadj;
2258 } 2252 }
2259 } 2253 }
2260 else { 2254 else {
2261 aadj *= 0.5; 2255 aadj *= 0.5;
2262 » » » aadj1 = dsign ? aadj : -aadj; 2256 » » » dval(aadj1) = dsign ? aadj : -aadj;
2263 #ifdef Check_FLT_ROUNDS 2257 #ifdef Check_FLT_ROUNDS
2264 switch(Rounding) { 2258 switch(Rounding) {
2265 case 2: /* towards +infinity */ 2259 case 2: /* towards +infinity */
2266 » » » » » aadj1 -= 0.5; 2260 » » » » » dval(aadj1) -= 0.5;
2267 break; 2261 break;
2268 case 0: /* towards 0 */ 2262 case 0: /* towards 0 */
2269 case 3: /* towards -infinity */ 2263 case 3: /* towards -infinity */
2270 » » » » » aadj1 += 0.5; 2264 » » » » » dval(aadj1) += 0.5;
2271 } 2265 }
2272 #else 2266 #else
2273 if (Flt_Rounds == 0) 2267 if (Flt_Rounds == 0)
2274 » » » » aadj1 += 0.5; 2268 » » » » dval(aadj1) += 0.5;
2275 #endif /*Check_FLT_ROUNDS*/ 2269 #endif /*Check_FLT_ROUNDS*/
2276 } 2270 }
2277 y = word0(rv) & Exp_mask; 2271 y = word0(rv) & Exp_mask;
2278 2272
2279 /* Check for overflow */ 2273 /* Check for overflow */
2280 2274
2281 if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { 2275 if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
2282 dval(rv0) = dval(rv); 2276 dval(rv0) = dval(rv);
2283 word0(rv) -= P*Exp_msk1; 2277 word0(rv) -= P*Exp_msk1;
2284 » » » adj = aadj1 * ulp(dval(rv)); 2278 » » » dval(adj) = dval(aadj1) * ulp(dval(rv));
2285 » » » dval(rv) += adj; 2279 » » » dval(rv) += dval(adj);
2286 if ((word0(rv) & Exp_mask) >= 2280 if ((word0(rv) & Exp_mask) >=
2287 Exp_msk1*(DBL_MAX_EXP+Bias-P)) { 2281 Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
2288 if (word0(rv0) == Big0 && word1(rv0) == Big1) 2282 if (word0(rv0) == Big0 && word1(rv0) == Big1)
2289 goto ovfl; 2283 goto ovfl;
2290 word0(rv) = Big0; 2284 word0(rv) = Big0;
2291 word1(rv) = Big1; 2285 word1(rv) = Big1;
2292 goto cont; 2286 goto cont;
2293 } 2287 }
2294 else 2288 else
2295 word0(rv) += P*Exp_msk1; 2289 word0(rv) += P*Exp_msk1;
2296 } 2290 }
2297 else { 2291 else {
2298 #ifdef Avoid_Underflow 2292 #ifdef Avoid_Underflow
2299 if (scale && y <= 2*P*Exp_msk1) { 2293 if (scale && y <= 2*P*Exp_msk1) {
2300 if (aadj <= 0x7fffffff) { 2294 if (aadj <= 0x7fffffff) {
2301 if ((z = aadj) <= 0) 2295 if ((z = aadj) <= 0)
2302 z = 1; 2296 z = 1;
2303 aadj = z; 2297 aadj = z;
2304 » » » » » aadj1 = dsign ? aadj : -aadj; 2298 » » » » » dval(aadj1) = dsign ? aadj : -aadj;
2305 } 2299 }
2306 word0(aadj1) += (2*P+1)*Exp_msk1 - y; 2300 word0(aadj1) += (2*P+1)*Exp_msk1 - y;
2307 } 2301 }
2308 » » » adj = aadj1 * ulp(dval(rv)); 2302 » » » dval(adj) = dval(aadj1) * ulp(dval(rv));
2309 » » » dval(rv) += adj; 2303 » » » dval(rv) += dval(adj);
2310 #else 2304 #else
2311 #ifdef Sudden_Underflow 2305 #ifdef Sudden_Underflow
2312 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { 2306 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
2313 dval(rv0) = dval(rv); 2307 dval(rv0) = dval(rv);
2314 word0(rv) += P*Exp_msk1; 2308 word0(rv) += P*Exp_msk1;
2315 » » » » adj = aadj1 * ulp(dval(rv)); 2309 » » » » dval(adj) = dval(aadj1) * ulp(dval(rv));
2316 » » » » dval(rv) += adj; 2310 » » » » dval(rv) += dval(adj);
2317 #ifdef IBM 2311 #ifdef IBM
2318 if ((word0(rv) & Exp_mask) < P*Exp_msk1) 2312 if ((word0(rv) & Exp_mask) < P*Exp_msk1)
2319 #else 2313 #else
2320 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) 2314 if ((word0(rv) & Exp_mask) <= P*Exp_msk1)
2321 #endif 2315 #endif
2322 { 2316 {
2323 if (word0(rv0) == Tiny0 2317 if (word0(rv0) == Tiny0
2324 && word1(rv0) == Tiny1) 2318 && word1(rv0) == Tiny1)
2325 goto undfl; 2319 goto undfl;
2326 word0(rv) = Tiny0; 2320 word0(rv) = Tiny0;
2327 word1(rv) = Tiny1; 2321 word1(rv) = Tiny1;
2328 goto cont; 2322 goto cont;
2329 } 2323 }
2330 else 2324 else
2331 word0(rv) -= P*Exp_msk1; 2325 word0(rv) -= P*Exp_msk1;
2332 } 2326 }
2333 else { 2327 else {
2334 » » » » adj = aadj1 * ulp(dval(rv)); 2328 » » » » dval(adj) = dval(aadj1) * ulp(dval(rv));
2335 » » » » dval(rv) += adj; 2329 » » » » dval(rv) += dval(adj);
2336 } 2330 }
2337 #else /*Sudden_Underflow*/ 2331 #else /*Sudden_Underflow*/
2338 /* Compute adj so that the IEEE rounding rules will 2332 /* Compute adj so that the IEEE rounding rules will
2339 * correctly round rv + adj in some half-way cases. 2333 * correctly round rv + adj in some half-way cases.
2340 * If rv * ulp(rv) is denormalized (i.e., 2334 * If rv * ulp(rv) is denormalized (i.e.,
2341 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid 2335 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
2342 * trouble from bits lost to denormalization; 2336 * trouble from bits lost to denormalization;
2343 * example: 1.2e-307 . 2337 * example: 1.2e-307 .
2344 */ 2338 */
2345 if (y <= (P-1)*Exp_msk1 && aadj > 1.) { 2339 if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
2346 » » » » aadj1 = (double)(int)(aadj + 0.5); 2340 » » » » dval(aadj1) = (double)(int)(aadj + 0.5);
2347 if (!dsign) 2341 if (!dsign)
2348 » » » » » aadj1 = -aadj1; 2342 » » » » » dval(aadj1) = -dval(aadj1);
2349 } 2343 }
2350 » » » adj = aadj1 * ulp(dval(rv)); 2344 » » » dval(adj) = dval(aadj1) * ulp(dval(rv));
2351 » » » dval(rv) += adj; 2345 » » » dval(rv) += dval(adj);
2352 #endif /*Sudden_Underflow*/ 2346 #endif /*Sudden_Underflow*/
2353 #endif /*Avoid_Underflow*/ 2347 #endif /*Avoid_Underflow*/
2354 } 2348 }
2355 z = word0(rv) & Exp_mask; 2349 z = word0(rv) & Exp_mask;
2356 #ifndef SET_INEXACT 2350 #ifndef SET_INEXACT
2357 #ifdef Avoid_Underflow 2351 #ifdef Avoid_Underflow
2358 if (!scale) 2352 if (!scale)
2359 #endif 2353 #endif
2360 if (y == z) { 2354 if (y == z) {
2361 /* Can we stop now? */ 2355 /* Can we stop now? */
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
2631 * guarantee that the floating-point calculation has given 2625 * guarantee that the floating-point calculation has given
2632 * the correctly rounded result. For k requested digits and 2626 * the correctly rounded result. For k requested digits and
2633 * "uniformly" distributed input, the probability is 2627 * "uniformly" distributed input, the probability is
2634 * something like 10^(k-15) that we must resort to the Long 2628 * something like 10^(k-15) that we must resort to the Long
2635 * calculation. 2629 * calculation.
2636 */ 2630 */
2637 2631
2638 char * 2632 char *
2639 dtoa 2633 dtoa
2640 #ifdef KR_headers 2634 #ifdef KR_headers
2641 » (d, mode, ndigits, decpt, sign, rve) 2635 » (dd, mode, ndigits, decpt, sign, rve)
2642 » double d; int mode, ndigits, *decpt, *sign; char **rve; 2636 » double dd; int mode, ndigits, *decpt, *sign; char **rve;
2643 #else 2637 #else
2644 » (double d, int mode, int ndigits, int *decpt, int *sign, char **rve) 2638 » (double dd, int mode, int ndigits, int *decpt, int *sign, char **rve)
2645 #endif 2639 #endif
2646 { 2640 {
2647 /* Arguments ndigits, decpt, sign are similar to those 2641 /* Arguments ndigits, decpt, sign are similar to those
2648 of ecvt and fcvt; trailing zeros are suppressed from 2642 of ecvt and fcvt; trailing zeros are suppressed from
2649 the returned string. If not null, *rve is set to point 2643 the returned string. If not null, *rve is set to point
2650 to the end of the return value. If d is +-Infinity or NaN, 2644 to the end of the return value. If d is +-Infinity or NaN,
2651 then *decpt is set to 9999. 2645 then *decpt is set to 9999.
2652 2646
2653 mode: 2647 mode:
2654 0 ==> shortest string that yields d when read in 2648 0 ==> shortest string that yields d when read in
(...skipping 25 matching lines...) Expand all
2680 2674
2681 int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, 2675 int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
2682 j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, 2676 j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
2683 spec_case, try_quick, bias_round_up; 2677 spec_case, try_quick, bias_round_up;
2684 Long L; 2678 Long L;
2685 #ifndef Sudden_Underflow 2679 #ifndef Sudden_Underflow
2686 int denorm; 2680 int denorm;
2687 ULong x; 2681 ULong x;
2688 #endif 2682 #endif
2689 Bigint *b, *b1, *delta, *mlo, *mhi, *S; 2683 Bigint *b, *b1, *delta, *mlo, *mhi, *S;
2690 » double d2, ds, eps; 2684 double ds;
2685 » U d2, eps;
2691 char *s, *s0; 2686 char *s, *s0;
2692 #ifdef Honor_FLT_ROUNDS 2687 #ifdef Honor_FLT_ROUNDS
2693 int rounding; 2688 int rounding;
2694 #endif 2689 #endif
2695 #ifdef SET_INEXACT 2690 #ifdef SET_INEXACT
2696 int inexact, oldinexact; 2691 int inexact, oldinexact;
2697 #endif 2692 #endif
2693 U d;
2694 dval(d) = dd;
2698 2695
2699 /* In mode 2 and 3 we bias rounding up when there are ties. */ 2696 /* In mode 2 and 3 we bias rounding up when there are ties. */
2700 bias_round_up = mode == 2 || mode == 3; 2697 bias_round_up = mode == 2 || mode == 3;
2701 2698
2702 ilim = ilim1 = 0; /* to avoid Google3 compiler warnings */ 2699 ilim = ilim1 = 0; /* to avoid Google3 compiler warnings */
2703 2700
2704 #ifndef MULTIPLE_THREADS 2701 #ifndef MULTIPLE_THREADS
2705 if (dtoa_result) { 2702 if (dtoa_result) {
2706 freedtoa(dtoa_result); 2703 freedtoa(dtoa_result);
2707 dtoa_result = 0; 2704 dtoa_result = 0;
(...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after
3325 Bfree(b); 3322 Bfree(b);
3326 *s = 0; 3323 *s = 0;
3327 *decpt = k + 1; 3324 *decpt = k + 1;
3328 if (rve) 3325 if (rve)
3329 *rve = s; 3326 *rve = s;
3330 return s0; 3327 return s0;
3331 } 3328 }
3332 #ifdef __cplusplus 3329 #ifdef __cplusplus
3333 } 3330 }
3334 #endif 3331 #endif
OLDNEW
« no previous file with comments | « src/platform-posix.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698