strtod.c revision 1.13 1 1.13 joerg /* $NetBSD: strtod.c,v 1.13 2013/04/19 10:41:53 joerg Exp $ */
2 1.1 kleink
3 1.1 kleink /****************************************************************
4 1.1 kleink
5 1.1 kleink The author of this software is David M. Gay.
6 1.1 kleink
7 1.1 kleink Copyright (C) 1998-2001 by Lucent Technologies
8 1.1 kleink All Rights Reserved
9 1.1 kleink
10 1.1 kleink Permission to use, copy, modify, and distribute this software and
11 1.1 kleink its documentation for any purpose and without fee is hereby
12 1.1 kleink granted, provided that the above copyright notice appear in all
13 1.1 kleink copies and that both that the copyright notice and this
14 1.1 kleink permission notice and warranty disclaimer appear in supporting
15 1.1 kleink documentation, and that the name of Lucent or any of its entities
16 1.1 kleink not be used in advertising or publicity pertaining to
17 1.1 kleink distribution of the software without specific, written prior
18 1.1 kleink permission.
19 1.1 kleink
20 1.1 kleink LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
21 1.1 kleink INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
22 1.1 kleink IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
23 1.1 kleink SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
24 1.1 kleink WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
25 1.1 kleink IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
26 1.1 kleink ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
27 1.1 kleink THIS SOFTWARE.
28 1.1 kleink
29 1.1 kleink ****************************************************************/
30 1.1 kleink
31 1.1 kleink /* Please send bug reports to David M. Gay (dmg at acm dot org,
32 1.1 kleink * with " at " changed at "@" and " dot " changed to "."). */
33 1.1 kleink
34 1.12 joerg #include "namespace.h"
35 1.1 kleink #include "gdtoaimp.h"
36 1.1 kleink #ifndef NO_FENV_H
37 1.1 kleink #include <fenv.h>
38 1.1 kleink #endif
39 1.1 kleink
40 1.1 kleink #ifdef USE_LOCALE
41 1.12 joerg #include <locale.h>
42 1.12 joerg #include "setlocale_local.h"
43 1.1 kleink #endif
44 1.1 kleink
45 1.1 kleink #ifdef IEEE_Arith
46 1.1 kleink #ifndef NO_IEEE_Scale
47 1.1 kleink #define Avoid_Underflow
48 1.1 kleink #undef tinytens
49 1.6 christos /* The factor of 2^106 in tinytens[4] helps us avoid setting the underflow */
50 1.1 kleink /* flag unnecessarily. It leads to a song and dance at the end of strtod. */
51 1.1 kleink static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
52 1.6 christos 9007199254740992.*9007199254740992.e-256
53 1.1 kleink };
54 1.1 kleink #endif
55 1.1 kleink #endif
56 1.1 kleink
57 1.1 kleink #ifdef Honor_FLT_ROUNDS
58 1.1 kleink #undef Check_FLT_ROUNDS
59 1.1 kleink #define Check_FLT_ROUNDS
60 1.1 kleink #else
61 1.1 kleink #define Rounding Flt_Rounds
62 1.1 kleink #endif
63 1.1 kleink
64 1.3 kleink #ifndef __HAVE_LONG_DOUBLE
65 1.3 kleink __strong_alias(_strtold, strtod)
66 1.3 kleink __weak_alias(strtold, _strtold)
67 1.12 joerg __strong_alias(_strtold_l, strtod_l)
68 1.12 joerg __weak_alias(strtold_l, _strtold_l)
69 1.3 kleink #endif
70 1.3 kleink
71 1.6 christos #ifdef Avoid_Underflow /*{*/
72 1.6 christos static double
73 1.6 christos sulp
74 1.6 christos #ifdef KR_headers
75 1.6 christos (x, scale) U *x; int scale;
76 1.6 christos #else
77 1.6 christos (U *x, int scale)
78 1.6 christos #endif
79 1.6 christos {
80 1.6 christos U u;
81 1.6 christos double rv;
82 1.6 christos int i;
83 1.6 christos
84 1.6 christos rv = ulp(x);
85 1.6 christos if (!scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)
86 1.6 christos return rv; /* Is there an example where i <= 0 ? */
87 1.6 christos word0(&u) = Exp_1 + (i << Exp_shift);
88 1.6 christos word1(&u) = 0;
89 1.6 christos return rv * u.d;
90 1.6 christos }
91 1.6 christos #endif /*}*/
92 1.6 christos
93 1.12 joerg static double
94 1.12 joerg _int_strtod_l(CONST char *s00, char **se, locale_t loc)
95 1.1 kleink {
96 1.1 kleink #ifdef Avoid_Underflow
97 1.1 kleink int scale;
98 1.1 kleink #endif
99 1.10 he #ifdef INFNAN_CHECK
100 1.10 he int decpt;
101 1.10 he #endif
102 1.10 he int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
103 1.1 kleink e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
104 1.1 kleink CONST char *s, *s0, *s1;
105 1.6 christos double aadj;
106 1.1 kleink Long L;
107 1.6 christos U adj, aadj1, rv, rv0;
108 1.1 kleink ULong y, z;
109 1.4 mrg Bigint *bb = NULL, *bb1, *bd0;
110 1.2 kleink Bigint *bd = NULL, *bs = NULL, *delta = NULL; /* pacify gcc */
111 1.6 christos #ifdef Avoid_Underflow
112 1.6 christos ULong Lsb, Lsb1;
113 1.6 christos #endif
114 1.1 kleink #ifdef SET_INEXACT
115 1.1 kleink int inexact, oldinexact;
116 1.1 kleink #endif
117 1.6 christos #ifdef USE_LOCALE /*{{*/
118 1.12 joerg char *decimalpoint = localeconv_l(loc)->decimal_point;
119 1.6 christos size_t dplen = strlen(decimalpoint);
120 1.6 christos #endif /*USE_LOCALE}}*/
121 1.6 christos
122 1.6 christos #ifdef Honor_FLT_ROUNDS /*{*/
123 1.6 christos int Rounding;
124 1.6 christos #ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
125 1.6 christos Rounding = Flt_Rounds;
126 1.6 christos #else /*}{*/
127 1.6 christos Rounding = 1;
128 1.6 christos switch(fegetround()) {
129 1.6 christos case FE_TOWARDZERO: Rounding = 0; break;
130 1.6 christos case FE_UPWARD: Rounding = 2; break;
131 1.6 christos case FE_DOWNWARD: Rounding = 3;
132 1.6 christos }
133 1.6 christos #endif /*}}*/
134 1.6 christos #endif /*}*/
135 1.1 kleink
136 1.10 he #ifdef INFNAN_CHECK
137 1.10 he decpt = 0;
138 1.10 he #endif
139 1.10 he sign = nz0 = nz = 0;
140 1.6 christos dval(&rv) = 0.;
141 1.1 kleink for(s = s00;;s++) switch(*s) {
142 1.1 kleink case '-':
143 1.1 kleink sign = 1;
144 1.2 kleink /* FALLTHROUGH */
145 1.1 kleink case '+':
146 1.1 kleink if (*++s)
147 1.1 kleink goto break2;
148 1.2 kleink /* FALLTHROUGH */
149 1.1 kleink case 0:
150 1.1 kleink goto ret0;
151 1.1 kleink case '\t':
152 1.1 kleink case '\n':
153 1.1 kleink case '\v':
154 1.1 kleink case '\f':
155 1.1 kleink case '\r':
156 1.1 kleink case ' ':
157 1.1 kleink continue;
158 1.1 kleink default:
159 1.1 kleink goto break2;
160 1.1 kleink }
161 1.1 kleink break2:
162 1.1 kleink if (*s == '0') {
163 1.6 christos #ifndef NO_HEX_FP /*{*/
164 1.1 kleink {
165 1.1 kleink static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI };
166 1.2 kleink Long expt;
167 1.1 kleink ULong bits[2];
168 1.1 kleink switch(s[1]) {
169 1.1 kleink case 'x':
170 1.1 kleink case 'X':
171 1.1 kleink {
172 1.6 christos #ifdef Honor_FLT_ROUNDS
173 1.1 kleink FPI fpi1 = fpi;
174 1.6 christos fpi1.rounding = Rounding;
175 1.1 kleink #else
176 1.1 kleink #define fpi1 fpi
177 1.1 kleink #endif
178 1.13 joerg switch((i = gethex(&s, &fpi1, &expt, &bb, sign, loc)) & STRTOG_Retmask) {
179 1.1 kleink case STRTOG_NoNumber:
180 1.1 kleink s = s00;
181 1.1 kleink sign = 0;
182 1.2 kleink /* FALLTHROUGH */
183 1.1 kleink case STRTOG_Zero:
184 1.1 kleink break;
185 1.1 kleink default:
186 1.1 kleink if (bb) {
187 1.1 kleink copybits(bits, fpi.nbits, bb);
188 1.1 kleink Bfree(bb);
189 1.1 kleink }
190 1.2 kleink ULtod((/* LINTED */(U*)&rv)->L, bits, expt, i);
191 1.1 kleink }}
192 1.1 kleink goto ret;
193 1.1 kleink }
194 1.1 kleink }
195 1.6 christos #endif /*}*/
196 1.1 kleink nz0 = 1;
197 1.1 kleink while(*++s == '0') ;
198 1.1 kleink if (!*s)
199 1.1 kleink goto ret;
200 1.1 kleink }
201 1.1 kleink s0 = s;
202 1.1 kleink y = z = 0;
203 1.1 kleink for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
204 1.1 kleink if (nd < 9)
205 1.1 kleink y = 10*y + c - '0';
206 1.1 kleink else if (nd < 16)
207 1.1 kleink z = 10*z + c - '0';
208 1.1 kleink nd0 = nd;
209 1.1 kleink #ifdef USE_LOCALE
210 1.6 christos if (c == *decimalpoint) {
211 1.6 christos for(i = 1; decimalpoint[i]; ++i)
212 1.6 christos if (s[i] != decimalpoint[i])
213 1.6 christos goto dig_done;
214 1.6 christos s += i;
215 1.6 christos c = *s;
216 1.1 kleink #else
217 1.6 christos if (c == '.') {
218 1.6 christos c = *++s;
219 1.1 kleink #endif
220 1.10 he #ifdef INFNAN_CHECK
221 1.1 kleink decpt = 1;
222 1.10 he #endif
223 1.1 kleink if (!nd) {
224 1.1 kleink for(; c == '0'; c = *++s)
225 1.1 kleink nz++;
226 1.1 kleink if (c > '0' && c <= '9') {
227 1.1 kleink s0 = s;
228 1.1 kleink nf += nz;
229 1.1 kleink nz = 0;
230 1.1 kleink goto have_dig;
231 1.1 kleink }
232 1.1 kleink goto dig_done;
233 1.1 kleink }
234 1.1 kleink for(; c >= '0' && c <= '9'; c = *++s) {
235 1.1 kleink have_dig:
236 1.1 kleink nz++;
237 1.1 kleink if (c -= '0') {
238 1.1 kleink nf += nz;
239 1.1 kleink for(i = 1; i < nz; i++)
240 1.1 kleink if (nd++ < 9)
241 1.1 kleink y *= 10;
242 1.1 kleink else if (nd <= DBL_DIG + 1)
243 1.1 kleink z *= 10;
244 1.1 kleink if (nd++ < 9)
245 1.1 kleink y = 10*y + c;
246 1.1 kleink else if (nd <= DBL_DIG + 1)
247 1.1 kleink z = 10*z + c;
248 1.1 kleink nz = 0;
249 1.1 kleink }
250 1.1 kleink }
251 1.6 christos }/*}*/
252 1.1 kleink dig_done:
253 1.1 kleink e = 0;
254 1.1 kleink if (c == 'e' || c == 'E') {
255 1.1 kleink if (!nd && !nz && !nz0) {
256 1.1 kleink goto ret0;
257 1.1 kleink }
258 1.1 kleink s00 = s;
259 1.1 kleink esign = 0;
260 1.1 kleink switch(c = *++s) {
261 1.1 kleink case '-':
262 1.1 kleink esign = 1;
263 1.2 kleink /* FALLTHROUGH */
264 1.1 kleink case '+':
265 1.1 kleink c = *++s;
266 1.1 kleink }
267 1.1 kleink if (c >= '0' && c <= '9') {
268 1.1 kleink while(c == '0')
269 1.1 kleink c = *++s;
270 1.1 kleink if (c > '0' && c <= '9') {
271 1.1 kleink L = c - '0';
272 1.1 kleink s1 = s;
273 1.1 kleink while((c = *++s) >= '0' && c <= '9')
274 1.1 kleink L = 10*L + c - '0';
275 1.1 kleink if (s - s1 > 8 || L > 19999)
276 1.1 kleink /* Avoid confusion from exponents
277 1.1 kleink * so large that e might overflow.
278 1.1 kleink */
279 1.1 kleink e = 19999; /* safe for 16 bit ints */
280 1.1 kleink else
281 1.1 kleink e = (int)L;
282 1.1 kleink if (esign)
283 1.1 kleink e = -e;
284 1.1 kleink }
285 1.1 kleink else
286 1.1 kleink e = 0;
287 1.1 kleink }
288 1.1 kleink else
289 1.1 kleink s = s00;
290 1.1 kleink }
291 1.1 kleink if (!nd) {
292 1.1 kleink if (!nz && !nz0) {
293 1.1 kleink #ifdef INFNAN_CHECK
294 1.1 kleink /* Check for Nan and Infinity */
295 1.1 kleink ULong bits[2];
296 1.1 kleink static FPI fpinan = /* only 52 explicit bits */
297 1.1 kleink { 52, 1-1023-53+1, 2046-1023-53+1, 1, SI };
298 1.1 kleink if (!decpt)
299 1.1 kleink switch(c) {
300 1.1 kleink case 'i':
301 1.1 kleink case 'I':
302 1.1 kleink if (match(&s,"nf")) {
303 1.1 kleink --s;
304 1.1 kleink if (!match(&s,"inity"))
305 1.1 kleink ++s;
306 1.6 christos word0(&rv) = 0x7ff00000;
307 1.6 christos word1(&rv) = 0;
308 1.1 kleink goto ret;
309 1.1 kleink }
310 1.1 kleink break;
311 1.1 kleink case 'n':
312 1.1 kleink case 'N':
313 1.1 kleink if (match(&s, "an")) {
314 1.1 kleink #ifndef No_Hex_NaN
315 1.1 kleink if (*s == '(' /*)*/
316 1.1 kleink && hexnan(&s, &fpinan, bits)
317 1.1 kleink == STRTOG_NaNbits) {
318 1.6 christos word0(&rv) = 0x7ff00000 | bits[1];
319 1.6 christos word1(&rv) = bits[0];
320 1.1 kleink }
321 1.1 kleink else {
322 1.1 kleink #endif
323 1.6 christos word0(&rv) = NAN_WORD0;
324 1.6 christos word1(&rv) = NAN_WORD1;
325 1.1 kleink #ifndef No_Hex_NaN
326 1.1 kleink }
327 1.1 kleink #endif
328 1.1 kleink goto ret;
329 1.1 kleink }
330 1.1 kleink }
331 1.1 kleink #endif /* INFNAN_CHECK */
332 1.1 kleink ret0:
333 1.1 kleink s = s00;
334 1.1 kleink sign = 0;
335 1.1 kleink }
336 1.1 kleink goto ret;
337 1.1 kleink }
338 1.1 kleink e1 = e -= nf;
339 1.1 kleink
340 1.1 kleink /* Now we have nd0 digits, starting at s0, followed by a
341 1.1 kleink * decimal point, followed by nd-nd0 digits. The number we're
342 1.1 kleink * after is the integer represented by those digits times
343 1.1 kleink * 10**e */
344 1.1 kleink
345 1.1 kleink if (!nd0)
346 1.1 kleink nd0 = nd;
347 1.1 kleink k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
348 1.6 christos dval(&rv) = y;
349 1.1 kleink if (k > 9) {
350 1.1 kleink #ifdef SET_INEXACT
351 1.1 kleink if (k > DBL_DIG)
352 1.1 kleink oldinexact = get_inexact();
353 1.1 kleink #endif
354 1.6 christos dval(&rv) = tens[k - 9] * dval(&rv) + z;
355 1.1 kleink }
356 1.1 kleink bd0 = 0;
357 1.1 kleink if (nd <= DBL_DIG
358 1.1 kleink #ifndef RND_PRODQUOT
359 1.1 kleink #ifndef Honor_FLT_ROUNDS
360 1.1 kleink && Flt_Rounds == 1
361 1.1 kleink #endif
362 1.1 kleink #endif
363 1.1 kleink ) {
364 1.1 kleink if (!e)
365 1.1 kleink goto ret;
366 1.6 christos #ifndef ROUND_BIASED_without_Round_Up
367 1.1 kleink if (e > 0) {
368 1.1 kleink if (e <= Ten_pmax) {
369 1.1 kleink #ifdef VAX
370 1.1 kleink goto vax_ovfl_check;
371 1.1 kleink #else
372 1.1 kleink #ifdef Honor_FLT_ROUNDS
373 1.1 kleink /* round correctly FLT_ROUNDS = 2 or 3 */
374 1.1 kleink if (sign) {
375 1.6 christos rv.d = -rv.d;
376 1.1 kleink sign = 0;
377 1.1 kleink }
378 1.1 kleink #endif
379 1.6 christos /* rv = */ rounded_product(dval(&rv), tens[e]);
380 1.1 kleink goto ret;
381 1.1 kleink #endif
382 1.1 kleink }
383 1.1 kleink i = DBL_DIG - nd;
384 1.1 kleink if (e <= Ten_pmax + i) {
385 1.1 kleink /* A fancier test would sometimes let us do
386 1.1 kleink * this for larger i values.
387 1.1 kleink */
388 1.1 kleink #ifdef Honor_FLT_ROUNDS
389 1.1 kleink /* round correctly FLT_ROUNDS = 2 or 3 */
390 1.1 kleink if (sign) {
391 1.6 christos rv.d = -rv.d;
392 1.1 kleink sign = 0;
393 1.1 kleink }
394 1.1 kleink #endif
395 1.1 kleink e -= i;
396 1.6 christos dval(&rv) *= tens[i];
397 1.1 kleink #ifdef VAX
398 1.1 kleink /* VAX exponent range is so narrow we must
399 1.1 kleink * worry about overflow here...
400 1.1 kleink */
401 1.1 kleink vax_ovfl_check:
402 1.6 christos word0(&rv) -= P*Exp_msk1;
403 1.6 christos /* rv = */ rounded_product(dval(&rv), tens[e]);
404 1.6 christos if ((word0(&rv) & Exp_mask)
405 1.1 kleink > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
406 1.1 kleink goto ovfl;
407 1.6 christos word0(&rv) += P*Exp_msk1;
408 1.1 kleink #else
409 1.6 christos /* rv = */ rounded_product(dval(&rv), tens[e]);
410 1.1 kleink #endif
411 1.1 kleink goto ret;
412 1.1 kleink }
413 1.1 kleink }
414 1.1 kleink #ifndef Inaccurate_Divide
415 1.1 kleink else if (e >= -Ten_pmax) {
416 1.1 kleink #ifdef Honor_FLT_ROUNDS
417 1.1 kleink /* round correctly FLT_ROUNDS = 2 or 3 */
418 1.1 kleink if (sign) {
419 1.6 christos rv.d = -rv.d;
420 1.1 kleink sign = 0;
421 1.1 kleink }
422 1.1 kleink #endif
423 1.6 christos /* rv = */ rounded_quotient(dval(&rv), tens[-e]);
424 1.1 kleink goto ret;
425 1.1 kleink }
426 1.1 kleink #endif
427 1.6 christos #endif /* ROUND_BIASED_without_Round_Up */
428 1.1 kleink }
429 1.1 kleink e1 += nd - k;
430 1.1 kleink
431 1.1 kleink #ifdef IEEE_Arith
432 1.1 kleink #ifdef SET_INEXACT
433 1.1 kleink inexact = 1;
434 1.1 kleink if (k <= DBL_DIG)
435 1.1 kleink oldinexact = get_inexact();
436 1.1 kleink #endif
437 1.1 kleink #ifdef Avoid_Underflow
438 1.1 kleink scale = 0;
439 1.1 kleink #endif
440 1.1 kleink #ifdef Honor_FLT_ROUNDS
441 1.6 christos if (Rounding >= 2) {
442 1.1 kleink if (sign)
443 1.6 christos Rounding = Rounding == 2 ? 0 : 2;
444 1.1 kleink else
445 1.6 christos if (Rounding != 2)
446 1.6 christos Rounding = 0;
447 1.1 kleink }
448 1.1 kleink #endif
449 1.1 kleink #endif /*IEEE_Arith*/
450 1.1 kleink
451 1.1 kleink /* Get starting approximation = rv * 10**e1 */
452 1.1 kleink
453 1.1 kleink if (e1 > 0) {
454 1.1 kleink if ( (i = e1 & 15) !=0)
455 1.6 christos dval(&rv) *= tens[i];
456 1.1 kleink if (e1 &= ~15) {
457 1.1 kleink if (e1 > DBL_MAX_10_EXP) {
458 1.1 kleink ovfl:
459 1.1 kleink /* Can't trust HUGE_VAL */
460 1.1 kleink #ifdef IEEE_Arith
461 1.1 kleink #ifdef Honor_FLT_ROUNDS
462 1.6 christos switch(Rounding) {
463 1.1 kleink case 0: /* toward 0 */
464 1.1 kleink case 3: /* toward -infinity */
465 1.6 christos word0(&rv) = Big0;
466 1.6 christos word1(&rv) = Big1;
467 1.1 kleink break;
468 1.1 kleink default:
469 1.6 christos word0(&rv) = Exp_mask;
470 1.6 christos word1(&rv) = 0;
471 1.1 kleink }
472 1.1 kleink #else /*Honor_FLT_ROUNDS*/
473 1.6 christos word0(&rv) = Exp_mask;
474 1.6 christos word1(&rv) = 0;
475 1.1 kleink #endif /*Honor_FLT_ROUNDS*/
476 1.1 kleink #ifdef SET_INEXACT
477 1.1 kleink /* set overflow bit */
478 1.6 christos dval(&rv0) = 1e300;
479 1.6 christos dval(&rv0) *= dval(&rv0);
480 1.1 kleink #endif
481 1.1 kleink #else /*IEEE_Arith*/
482 1.6 christos word0(&rv) = Big0;
483 1.6 christos word1(&rv) = Big1;
484 1.1 kleink #endif /*IEEE_Arith*/
485 1.6 christos range_err:
486 1.6 christos if (bd0) {
487 1.6 christos Bfree(bb);
488 1.6 christos Bfree(bd);
489 1.6 christos Bfree(bs);
490 1.6 christos Bfree(bd0);
491 1.6 christos Bfree(delta);
492 1.6 christos }
493 1.6 christos #ifndef NO_ERRNO
494 1.6 christos errno = ERANGE;
495 1.6 christos #endif
496 1.1 kleink goto ret;
497 1.1 kleink }
498 1.2 kleink e1 = (unsigned int)e1 >> 4;
499 1.2 kleink for(j = 0; e1 > 1; j++, e1 = (unsigned int)e1 >> 1)
500 1.1 kleink if (e1 & 1)
501 1.6 christos dval(&rv) *= bigtens[j];
502 1.1 kleink /* The last multiplication could overflow. */
503 1.6 christos word0(&rv) -= P*Exp_msk1;
504 1.6 christos dval(&rv) *= bigtens[j];
505 1.6 christos if ((z = word0(&rv) & Exp_mask)
506 1.1 kleink > Exp_msk1*(DBL_MAX_EXP+Bias-P))
507 1.1 kleink goto ovfl;
508 1.1 kleink if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
509 1.1 kleink /* set to largest number */
510 1.1 kleink /* (Can't trust DBL_MAX) */
511 1.6 christos word0(&rv) = Big0;
512 1.6 christos word1(&rv) = Big1;
513 1.1 kleink }
514 1.1 kleink else
515 1.6 christos word0(&rv) += P*Exp_msk1;
516 1.1 kleink }
517 1.1 kleink }
518 1.1 kleink else if (e1 < 0) {
519 1.1 kleink e1 = -e1;
520 1.1 kleink if ( (i = e1 & 15) !=0)
521 1.6 christos dval(&rv) /= tens[i];
522 1.1 kleink if (e1 >>= 4) {
523 1.1 kleink if (e1 >= 1 << n_bigtens)
524 1.1 kleink goto undfl;
525 1.1 kleink #ifdef Avoid_Underflow
526 1.1 kleink if (e1 & Scale_Bit)
527 1.1 kleink scale = 2*P;
528 1.2 kleink for(j = 0; e1 > 0; j++, e1 = (unsigned int)e1 >> 1)
529 1.1 kleink if (e1 & 1)
530 1.6 christos dval(&rv) *= tinytens[j];
531 1.6 christos if (scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
532 1.1 kleink >> Exp_shift)) > 0) {
533 1.1 kleink /* scaled rv is denormal; zap j low bits */
534 1.1 kleink if (j >= 32) {
535 1.6 christos word1(&rv) = 0;
536 1.1 kleink if (j >= 53)
537 1.6 christos word0(&rv) = (P+2)*Exp_msk1;
538 1.1 kleink else
539 1.11 christos word0(&rv) &= 0xffffffffU << (j-32);
540 1.1 kleink }
541 1.1 kleink else
542 1.11 christos word1(&rv) &= 0xffffffffU << j;
543 1.1 kleink }
544 1.1 kleink #else
545 1.10 he for(j = 0; e1 > 1; j++, e1 = (unsigned int)e1 >> 1)
546 1.1 kleink if (e1 & 1)
547 1.6 christos dval(&rv) *= tinytens[j];
548 1.1 kleink /* The last multiplication could underflow. */
549 1.6 christos dval(&rv0) = dval(&rv);
550 1.6 christos dval(&rv) *= tinytens[j];
551 1.6 christos if (!dval(&rv)) {
552 1.6 christos dval(&rv) = 2.*dval(&rv0);
553 1.6 christos dval(&rv) *= tinytens[j];
554 1.1 kleink #endif
555 1.6 christos if (!dval(&rv)) {
556 1.1 kleink undfl:
557 1.6 christos dval(&rv) = 0.;
558 1.6 christos goto range_err;
559 1.1 kleink }
560 1.1 kleink #ifndef Avoid_Underflow
561 1.6 christos word0(&rv) = Tiny0;
562 1.6 christos word1(&rv) = Tiny1;
563 1.1 kleink /* The refinement below will clean
564 1.1 kleink * this approximation up.
565 1.1 kleink */
566 1.1 kleink }
567 1.1 kleink #endif
568 1.1 kleink }
569 1.1 kleink }
570 1.1 kleink
571 1.1 kleink /* Now the hard part -- adjusting rv to the correct value.*/
572 1.1 kleink
573 1.1 kleink /* Put digits into bd: true value = bd * 10^e */
574 1.1 kleink
575 1.6 christos bd0 = s2b(s0, nd0, nd, y, dplen);
576 1.5 christos if (bd0 == NULL)
577 1.5 christos goto ovfl;
578 1.1 kleink
579 1.1 kleink for(;;) {
580 1.1 kleink bd = Balloc(bd0->k);
581 1.5 christos if (bd == NULL)
582 1.5 christos goto ovfl;
583 1.1 kleink Bcopy(bd, bd0);
584 1.6 christos bb = d2b(dval(&rv), &bbe, &bbbits); /* rv = bb * 2^bbe */
585 1.5 christos if (bb == NULL)
586 1.5 christos goto ovfl;
587 1.1 kleink bs = i2b(1);
588 1.5 christos if (bs == NULL)
589 1.5 christos goto ovfl;
590 1.1 kleink
591 1.1 kleink if (e >= 0) {
592 1.1 kleink bb2 = bb5 = 0;
593 1.1 kleink bd2 = bd5 = e;
594 1.1 kleink }
595 1.1 kleink else {
596 1.1 kleink bb2 = bb5 = -e;
597 1.1 kleink bd2 = bd5 = 0;
598 1.1 kleink }
599 1.1 kleink if (bbe >= 0)
600 1.1 kleink bb2 += bbe;
601 1.1 kleink else
602 1.1 kleink bd2 -= bbe;
603 1.1 kleink bs2 = bb2;
604 1.1 kleink #ifdef Honor_FLT_ROUNDS
605 1.6 christos if (Rounding != 1)
606 1.1 kleink bs2++;
607 1.1 kleink #endif
608 1.1 kleink #ifdef Avoid_Underflow
609 1.6 christos Lsb = LSB;
610 1.6 christos Lsb1 = 0;
611 1.1 kleink j = bbe - scale;
612 1.1 kleink i = j + bbbits - 1; /* logb(rv) */
613 1.6 christos j = P + 1 - bbbits;
614 1.6 christos if (i < Emin) { /* denormal */
615 1.6 christos i = Emin - i;
616 1.6 christos j -= i;
617 1.6 christos if (i < 32)
618 1.6 christos Lsb <<= i;
619 1.6 christos else
620 1.6 christos Lsb1 = Lsb << (i-32);
621 1.6 christos }
622 1.1 kleink #else /*Avoid_Underflow*/
623 1.1 kleink #ifdef Sudden_Underflow
624 1.1 kleink #ifdef IBM
625 1.1 kleink j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
626 1.1 kleink #else
627 1.1 kleink j = P + 1 - bbbits;
628 1.1 kleink #endif
629 1.1 kleink #else /*Sudden_Underflow*/
630 1.1 kleink j = bbe;
631 1.6 christos i = j + bbbits - 1; /* logb(&rv) */
632 1.1 kleink if (i < Emin) /* denormal */
633 1.1 kleink j += P - Emin;
634 1.1 kleink else
635 1.1 kleink j = P + 1 - bbbits;
636 1.1 kleink #endif /*Sudden_Underflow*/
637 1.1 kleink #endif /*Avoid_Underflow*/
638 1.1 kleink bb2 += j;
639 1.1 kleink bd2 += j;
640 1.1 kleink #ifdef Avoid_Underflow
641 1.1 kleink bd2 += scale;
642 1.1 kleink #endif
643 1.1 kleink i = bb2 < bd2 ? bb2 : bd2;
644 1.1 kleink if (i > bs2)
645 1.1 kleink i = bs2;
646 1.1 kleink if (i > 0) {
647 1.1 kleink bb2 -= i;
648 1.1 kleink bd2 -= i;
649 1.1 kleink bs2 -= i;
650 1.1 kleink }
651 1.1 kleink if (bb5 > 0) {
652 1.1 kleink bs = pow5mult(bs, bb5);
653 1.5 christos if (bs == NULL)
654 1.5 christos goto ovfl;
655 1.1 kleink bb1 = mult(bs, bb);
656 1.5 christos if (bb1 == NULL)
657 1.5 christos goto ovfl;
658 1.1 kleink Bfree(bb);
659 1.1 kleink bb = bb1;
660 1.1 kleink }
661 1.5 christos if (bb2 > 0) {
662 1.1 kleink bb = lshift(bb, bb2);
663 1.5 christos if (bb == NULL)
664 1.5 christos goto ovfl;
665 1.5 christos }
666 1.5 christos if (bd5 > 0) {
667 1.1 kleink bd = pow5mult(bd, bd5);
668 1.5 christos if (bd == NULL)
669 1.5 christos goto ovfl;
670 1.5 christos }
671 1.5 christos if (bd2 > 0) {
672 1.1 kleink bd = lshift(bd, bd2);
673 1.5 christos if (bd == NULL)
674 1.5 christos goto ovfl;
675 1.5 christos }
676 1.5 christos if (bs2 > 0) {
677 1.1 kleink bs = lshift(bs, bs2);
678 1.5 christos if (bs == NULL)
679 1.5 christos goto ovfl;
680 1.5 christos }
681 1.1 kleink delta = diff(bb, bd);
682 1.5 christos if (delta == NULL)
683 1.5 christos goto ovfl;
684 1.1 kleink dsign = delta->sign;
685 1.1 kleink delta->sign = 0;
686 1.1 kleink i = cmp(delta, bs);
687 1.1 kleink #ifdef Honor_FLT_ROUNDS
688 1.6 christos if (Rounding != 1) {
689 1.1 kleink if (i < 0) {
690 1.1 kleink /* Error is less than an ulp */
691 1.1 kleink if (!delta->x[0] && delta->wds <= 1) {
692 1.1 kleink /* exact */
693 1.1 kleink #ifdef SET_INEXACT
694 1.1 kleink inexact = 0;
695 1.1 kleink #endif
696 1.1 kleink break;
697 1.1 kleink }
698 1.6 christos if (Rounding) {
699 1.1 kleink if (dsign) {
700 1.6 christos dval(&adj) = 1.;
701 1.1 kleink goto apply_adj;
702 1.1 kleink }
703 1.1 kleink }
704 1.1 kleink else if (!dsign) {
705 1.6 christos dval(&adj) = -1.;
706 1.6 christos if (!word1(&rv)
707 1.6 christos && !(word0(&rv) & Frac_mask)) {
708 1.6 christos y = word0(&rv) & Exp_mask;
709 1.1 kleink #ifdef Avoid_Underflow
710 1.1 kleink if (!scale || y > 2*P*Exp_msk1)
711 1.1 kleink #else
712 1.1 kleink if (y)
713 1.1 kleink #endif
714 1.1 kleink {
715 1.1 kleink delta = lshift(delta,Log2P);
716 1.1 kleink if (cmp(delta, bs) <= 0)
717 1.6 christos dval(&adj) = -0.5;
718 1.1 kleink }
719 1.1 kleink }
720 1.1 kleink apply_adj:
721 1.1 kleink #ifdef Avoid_Underflow
722 1.6 christos if (scale && (y = word0(&rv) & Exp_mask)
723 1.1 kleink <= 2*P*Exp_msk1)
724 1.6 christos word0(&adj) += (2*P+1)*Exp_msk1 - y;
725 1.1 kleink #else
726 1.1 kleink #ifdef Sudden_Underflow
727 1.6 christos if ((word0(&rv) & Exp_mask) <=
728 1.1 kleink P*Exp_msk1) {
729 1.6 christos word0(&rv) += P*Exp_msk1;
730 1.6 christos dval(&rv) += adj*ulp(&rv);
731 1.6 christos word0(&rv) -= P*Exp_msk1;
732 1.1 kleink }
733 1.1 kleink else
734 1.1 kleink #endif /*Sudden_Underflow*/
735 1.1 kleink #endif /*Avoid_Underflow*/
736 1.6 christos dval(&rv) += adj.d*ulp(&rv);
737 1.1 kleink }
738 1.1 kleink break;
739 1.1 kleink }
740 1.6 christos dval(&adj) = ratio(delta, bs);
741 1.6 christos if (adj.d < 1.)
742 1.6 christos dval(&adj) = 1.;
743 1.6 christos if (adj.d <= 0x7ffffffe) {
744 1.6 christos /* dval(&adj) = Rounding ? ceil(&adj) : floor(&adj); */
745 1.6 christos y = adj.d;
746 1.6 christos if (y != adj.d) {
747 1.6 christos if (!((Rounding>>1) ^ dsign))
748 1.1 kleink y++;
749 1.6 christos dval(&adj) = y;
750 1.1 kleink }
751 1.1 kleink }
752 1.1 kleink #ifdef Avoid_Underflow
753 1.6 christos if (scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
754 1.6 christos word0(&adj) += (2*P+1)*Exp_msk1 - y;
755 1.1 kleink #else
756 1.1 kleink #ifdef Sudden_Underflow
757 1.6 christos if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
758 1.6 christos word0(&rv) += P*Exp_msk1;
759 1.6 christos dval(&adj) *= ulp(&rv);
760 1.1 kleink if (dsign)
761 1.6 christos dval(&rv) += adj;
762 1.1 kleink else
763 1.6 christos dval(&rv) -= adj;
764 1.6 christos word0(&rv) -= P*Exp_msk1;
765 1.1 kleink goto cont;
766 1.1 kleink }
767 1.1 kleink #endif /*Sudden_Underflow*/
768 1.1 kleink #endif /*Avoid_Underflow*/
769 1.6 christos dval(&adj) *= ulp(&rv);
770 1.6 christos if (dsign) {
771 1.6 christos if (word0(&rv) == Big0 && word1(&rv) == Big1)
772 1.6 christos goto ovfl;
773 1.6 christos dval(&rv) += adj.d;
774 1.6 christos }
775 1.1 kleink else
776 1.6 christos dval(&rv) -= adj.d;
777 1.1 kleink goto cont;
778 1.1 kleink }
779 1.1 kleink #endif /*Honor_FLT_ROUNDS*/
780 1.1 kleink
781 1.1 kleink if (i < 0) {
782 1.1 kleink /* Error is less than half an ulp -- check for
783 1.1 kleink * special case of mantissa a power of two.
784 1.1 kleink */
785 1.6 christos if (dsign || word1(&rv) || word0(&rv) & Bndry_mask
786 1.1 kleink #ifdef IEEE_Arith
787 1.1 kleink #ifdef Avoid_Underflow
788 1.6 christos || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
789 1.1 kleink #else
790 1.6 christos || (word0(&rv) & Exp_mask) <= Exp_msk1
791 1.1 kleink #endif
792 1.1 kleink #endif
793 1.1 kleink ) {
794 1.1 kleink #ifdef SET_INEXACT
795 1.1 kleink if (!delta->x[0] && delta->wds <= 1)
796 1.1 kleink inexact = 0;
797 1.1 kleink #endif
798 1.1 kleink break;
799 1.1 kleink }
800 1.1 kleink if (!delta->x[0] && delta->wds <= 1) {
801 1.1 kleink /* exact result */
802 1.1 kleink #ifdef SET_INEXACT
803 1.1 kleink inexact = 0;
804 1.1 kleink #endif
805 1.1 kleink break;
806 1.1 kleink }
807 1.1 kleink delta = lshift(delta,Log2P);
808 1.1 kleink if (cmp(delta, bs) > 0)
809 1.1 kleink goto drop_down;
810 1.1 kleink break;
811 1.1 kleink }
812 1.1 kleink if (i == 0) {
813 1.1 kleink /* exactly half-way between */
814 1.1 kleink if (dsign) {
815 1.6 christos if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
816 1.6 christos && word1(&rv) == (
817 1.1 kleink #ifdef Avoid_Underflow
818 1.6 christos (scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
819 1.1 kleink ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
820 1.1 kleink #endif
821 1.1 kleink 0xffffffff)) {
822 1.1 kleink /*boundary case -- increment exponent*/
823 1.6 christos if (word0(&rv) == Big0 && word1(&rv) == Big1)
824 1.6 christos goto ovfl;
825 1.6 christos word0(&rv) = (word0(&rv) & Exp_mask)
826 1.1 kleink + Exp_msk1
827 1.1 kleink #ifdef IBM
828 1.1 kleink | Exp_msk1 >> 4
829 1.1 kleink #endif
830 1.1 kleink ;
831 1.6 christos word1(&rv) = 0;
832 1.1 kleink #ifdef Avoid_Underflow
833 1.1 kleink dsign = 0;
834 1.1 kleink #endif
835 1.1 kleink break;
836 1.1 kleink }
837 1.1 kleink }
838 1.6 christos else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
839 1.1 kleink drop_down:
840 1.1 kleink /* boundary case -- decrement exponent */
841 1.1 kleink #ifdef Sudden_Underflow /*{{*/
842 1.6 christos L = word0(&rv) & Exp_mask;
843 1.1 kleink #ifdef IBM
844 1.1 kleink if (L < Exp_msk1)
845 1.1 kleink #else
846 1.1 kleink #ifdef Avoid_Underflow
847 1.1 kleink if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
848 1.1 kleink #else
849 1.1 kleink if (L <= Exp_msk1)
850 1.1 kleink #endif /*Avoid_Underflow*/
851 1.1 kleink #endif /*IBM*/
852 1.1 kleink goto undfl;
853 1.1 kleink L -= Exp_msk1;
854 1.1 kleink #else /*Sudden_Underflow}{*/
855 1.1 kleink #ifdef Avoid_Underflow
856 1.1 kleink if (scale) {
857 1.6 christos L = word0(&rv) & Exp_mask;
858 1.1 kleink if (L <= (2*P+1)*Exp_msk1) {
859 1.1 kleink if (L > (P+2)*Exp_msk1)
860 1.1 kleink /* round even ==> */
861 1.1 kleink /* accept rv */
862 1.1 kleink break;
863 1.1 kleink /* rv = smallest denormal */
864 1.1 kleink goto undfl;
865 1.1 kleink }
866 1.1 kleink }
867 1.1 kleink #endif /*Avoid_Underflow*/
868 1.6 christos L = (word0(&rv) & Exp_mask) - Exp_msk1;
869 1.6 christos #endif /*Sudden_Underflow}}*/
870 1.6 christos word0(&rv) = L | Bndry_mask1;
871 1.6 christos word1(&rv) = 0xffffffff;
872 1.1 kleink #ifdef IBM
873 1.1 kleink goto cont;
874 1.1 kleink #else
875 1.1 kleink break;
876 1.1 kleink #endif
877 1.1 kleink }
878 1.1 kleink #ifndef ROUND_BIASED
879 1.6 christos #ifdef Avoid_Underflow
880 1.6 christos if (Lsb1) {
881 1.6 christos if (!(word0(&rv) & Lsb1))
882 1.6 christos break;
883 1.6 christos }
884 1.6 christos else if (!(word1(&rv) & Lsb))
885 1.6 christos break;
886 1.6 christos #else
887 1.6 christos if (!(word1(&rv) & LSB))
888 1.1 kleink break;
889 1.1 kleink #endif
890 1.6 christos #endif
891 1.1 kleink if (dsign)
892 1.6 christos #ifdef Avoid_Underflow
893 1.6 christos dval(&rv) += sulp(&rv, scale);
894 1.6 christos #else
895 1.6 christos dval(&rv) += ulp(&rv);
896 1.6 christos #endif
897 1.1 kleink #ifndef ROUND_BIASED
898 1.1 kleink else {
899 1.6 christos #ifdef Avoid_Underflow
900 1.6 christos dval(&rv) -= sulp(&rv, scale);
901 1.6 christos #else
902 1.6 christos dval(&rv) -= ulp(&rv);
903 1.6 christos #endif
904 1.1 kleink #ifndef Sudden_Underflow
905 1.6 christos if (!dval(&rv))
906 1.1 kleink goto undfl;
907 1.1 kleink #endif
908 1.1 kleink }
909 1.1 kleink #ifdef Avoid_Underflow
910 1.1 kleink dsign = 1 - dsign;
911 1.1 kleink #endif
912 1.1 kleink #endif
913 1.1 kleink break;
914 1.1 kleink }
915 1.1 kleink if ((aadj = ratio(delta, bs)) <= 2.) {
916 1.1 kleink if (dsign)
917 1.6 christos aadj = dval(&aadj1) = 1.;
918 1.6 christos else if (word1(&rv) || word0(&rv) & Bndry_mask) {
919 1.1 kleink #ifndef Sudden_Underflow
920 1.6 christos if (word1(&rv) == Tiny1 && !word0(&rv))
921 1.1 kleink goto undfl;
922 1.1 kleink #endif
923 1.1 kleink aadj = 1.;
924 1.6 christos dval(&aadj1) = -1.;
925 1.1 kleink }
926 1.1 kleink else {
927 1.1 kleink /* special case -- power of FLT_RADIX to be */
928 1.1 kleink /* rounded down... */
929 1.1 kleink
930 1.1 kleink if (aadj < 2./FLT_RADIX)
931 1.1 kleink aadj = 1./FLT_RADIX;
932 1.1 kleink else
933 1.1 kleink aadj *= 0.5;
934 1.6 christos dval(&aadj1) = -aadj;
935 1.1 kleink }
936 1.1 kleink }
937 1.1 kleink else {
938 1.1 kleink aadj *= 0.5;
939 1.6 christos dval(&aadj1) = dsign ? aadj : -aadj;
940 1.1 kleink #ifdef Check_FLT_ROUNDS
941 1.11 christos /* CONSTCOND */
942 1.1 kleink switch(Rounding) {
943 1.1 kleink case 2: /* towards +infinity */
944 1.6 christos dval(&aadj1) -= 0.5;
945 1.1 kleink break;
946 1.1 kleink case 0: /* towards 0 */
947 1.1 kleink case 3: /* towards -infinity */
948 1.6 christos dval(&aadj1) += 0.5;
949 1.1 kleink }
950 1.1 kleink #else
951 1.10 he /* CONSTCOND */
952 1.1 kleink if (Flt_Rounds == 0)
953 1.6 christos dval(&aadj1) += 0.5;
954 1.1 kleink #endif /*Check_FLT_ROUNDS*/
955 1.1 kleink }
956 1.6 christos y = word0(&rv) & Exp_mask;
957 1.1 kleink
958 1.1 kleink /* Check for overflow */
959 1.1 kleink
960 1.1 kleink if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
961 1.6 christos dval(&rv0) = dval(&rv);
962 1.6 christos word0(&rv) -= P*Exp_msk1;
963 1.6 christos dval(&adj) = dval(&aadj1) * ulp(&rv);
964 1.6 christos dval(&rv) += dval(&adj);
965 1.6 christos if ((word0(&rv) & Exp_mask) >=
966 1.1 kleink Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
967 1.6 christos if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
968 1.1 kleink goto ovfl;
969 1.6 christos word0(&rv) = Big0;
970 1.6 christos word1(&rv) = Big1;
971 1.1 kleink goto cont;
972 1.1 kleink }
973 1.1 kleink else
974 1.6 christos word0(&rv) += P*Exp_msk1;
975 1.1 kleink }
976 1.1 kleink else {
977 1.1 kleink #ifdef Avoid_Underflow
978 1.1 kleink if (scale && y <= 2*P*Exp_msk1) {
979 1.1 kleink if (aadj <= 0x7fffffff) {
980 1.2 kleink if ((z = aadj) == 0)
981 1.1 kleink z = 1;
982 1.1 kleink aadj = z;
983 1.6 christos dval(&aadj1) = dsign ? aadj : -aadj;
984 1.1 kleink }
985 1.6 christos word0(&aadj1) += (2*P+1)*Exp_msk1 - y;
986 1.1 kleink }
987 1.6 christos dval(&adj) = dval(&aadj1) * ulp(&rv);
988 1.6 christos dval(&rv) += dval(&adj);
989 1.1 kleink #else
990 1.1 kleink #ifdef Sudden_Underflow
991 1.6 christos if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
992 1.6 christos dval(&rv0) = dval(&rv);
993 1.6 christos word0(&rv) += P*Exp_msk1;
994 1.6 christos dval(&adj) = dval(&aadj1) * ulp(&rv);
995 1.8 he dval(&rv) += dval(&adj);
996 1.1 kleink #ifdef IBM
997 1.6 christos if ((word0(&rv) & Exp_mask) < P*Exp_msk1)
998 1.1 kleink #else
999 1.6 christos if ((word0(&rv) & Exp_mask) <= P*Exp_msk1)
1000 1.1 kleink #endif
1001 1.1 kleink {
1002 1.6 christos if (word0(&rv0) == Tiny0
1003 1.6 christos && word1(&rv0) == Tiny1)
1004 1.1 kleink goto undfl;
1005 1.6 christos word0(&rv) = Tiny0;
1006 1.6 christos word1(&rv) = Tiny1;
1007 1.1 kleink goto cont;
1008 1.1 kleink }
1009 1.1 kleink else
1010 1.6 christos word0(&rv) -= P*Exp_msk1;
1011 1.1 kleink }
1012 1.1 kleink else {
1013 1.6 christos dval(&adj) = dval(&aadj1) * ulp(&rv);
1014 1.8 he dval(&rv) += dval(&adj);
1015 1.1 kleink }
1016 1.1 kleink #else /*Sudden_Underflow*/
1017 1.6 christos /* Compute dval(&adj) so that the IEEE rounding rules will
1018 1.6 christos * correctly round rv + dval(&adj) in some half-way cases.
1019 1.6 christos * If rv * ulp(&rv) is denormalized (i.e.,
1020 1.1 kleink * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
1021 1.1 kleink * trouble from bits lost to denormalization;
1022 1.1 kleink * example: 1.2e-307 .
1023 1.1 kleink */
1024 1.1 kleink if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
1025 1.6 christos dval(&aadj1) = (double)(int)(aadj + 0.5);
1026 1.1 kleink if (!dsign)
1027 1.6 christos dval(&aadj1) = -dval(&aadj1);
1028 1.1 kleink }
1029 1.6 christos dval(&adj) = dval(&aadj1) * ulp(&rv);
1030 1.6 christos dval(&rv) += adj;
1031 1.1 kleink #endif /*Sudden_Underflow*/
1032 1.1 kleink #endif /*Avoid_Underflow*/
1033 1.1 kleink }
1034 1.6 christos z = word0(&rv) & Exp_mask;
1035 1.1 kleink #ifndef SET_INEXACT
1036 1.1 kleink #ifdef Avoid_Underflow
1037 1.1 kleink if (!scale)
1038 1.1 kleink #endif
1039 1.1 kleink if (y == z) {
1040 1.1 kleink /* Can we stop now? */
1041 1.1 kleink L = (Long)aadj;
1042 1.1 kleink aadj -= L;
1043 1.1 kleink /* The tolerances below are conservative. */
1044 1.6 christos if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
1045 1.1 kleink if (aadj < .4999999 || aadj > .5000001)
1046 1.1 kleink break;
1047 1.1 kleink }
1048 1.1 kleink else if (aadj < .4999999/FLT_RADIX)
1049 1.1 kleink break;
1050 1.1 kleink }
1051 1.1 kleink #endif
1052 1.1 kleink cont:
1053 1.1 kleink Bfree(bb);
1054 1.1 kleink Bfree(bd);
1055 1.1 kleink Bfree(bs);
1056 1.1 kleink Bfree(delta);
1057 1.1 kleink }
1058 1.6 christos Bfree(bb);
1059 1.6 christos Bfree(bd);
1060 1.6 christos Bfree(bs);
1061 1.6 christos Bfree(bd0);
1062 1.6 christos Bfree(delta);
1063 1.1 kleink #ifdef SET_INEXACT
1064 1.1 kleink if (inexact) {
1065 1.1 kleink if (!oldinexact) {
1066 1.6 christos word0(&rv0) = Exp_1 + (70 << Exp_shift);
1067 1.6 christos word1(&rv0) = 0;
1068 1.6 christos dval(&rv0) += 1.;
1069 1.1 kleink }
1070 1.1 kleink }
1071 1.1 kleink else if (!oldinexact)
1072 1.1 kleink clear_inexact();
1073 1.1 kleink #endif
1074 1.1 kleink #ifdef Avoid_Underflow
1075 1.1 kleink if (scale) {
1076 1.6 christos word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
1077 1.6 christos word1(&rv0) = 0;
1078 1.6 christos dval(&rv) *= dval(&rv0);
1079 1.1 kleink #ifndef NO_ERRNO
1080 1.1 kleink /* try to avoid the bug of testing an 8087 register value */
1081 1.6 christos #ifdef IEEE_Arith
1082 1.6 christos if (!(word0(&rv) & Exp_mask))
1083 1.6 christos #else
1084 1.6 christos if (word0(&rv) == 0 && word1(&rv) == 0)
1085 1.6 christos #endif
1086 1.1 kleink errno = ERANGE;
1087 1.1 kleink #endif
1088 1.1 kleink }
1089 1.1 kleink #endif /* Avoid_Underflow */
1090 1.1 kleink #ifdef SET_INEXACT
1091 1.6 christos if (inexact && !(word0(&rv) & Exp_mask)) {
1092 1.1 kleink /* set underflow bit */
1093 1.6 christos dval(&rv0) = 1e-300;
1094 1.6 christos dval(&rv0) *= dval(&rv0);
1095 1.1 kleink }
1096 1.1 kleink #endif
1097 1.1 kleink ret:
1098 1.1 kleink if (se)
1099 1.2 kleink *se = __UNCONST(s);
1100 1.6 christos return sign ? -dval(&rv) : dval(&rv);
1101 1.1 kleink }
1102 1.1 kleink
1103 1.12 joerg double
1104 1.12 joerg strtod(CONST char *s, char **sp)
1105 1.12 joerg {
1106 1.12 joerg return _int_strtod_l(s, sp, *_current_locale());
1107 1.12 joerg }
1108 1.12 joerg
1109 1.12 joerg #ifdef __weak_alias
1110 1.12 joerg __weak_alias(strtod_l, _strtod_l)
1111 1.12 joerg #endif
1112 1.12 joerg
1113 1.12 joerg double
1114 1.12 joerg strtod_l(CONST char *s, char **sp, locale_t loc)
1115 1.12 joerg {
1116 1.12 joerg if (loc == NULL)
1117 1.12 joerg loc = _C_locale;
1118 1.12 joerg return _int_strtod_l(s, sp, loc);
1119 1.12 joerg }
1120