strtod.c revision 1.18.6.1 1 1.18.6.1 martin /* $NetBSD: strtod.c,v 1.18.6.1 2024/07/20 15:03:06 martin 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.16 christos int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign,
100 1.1 kleink e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
101 1.1 kleink CONST char *s, *s0, *s1;
102 1.6 christos double aadj;
103 1.1 kleink Long L;
104 1.6 christos U adj, aadj1, rv, rv0;
105 1.1 kleink ULong y, z;
106 1.4 mrg Bigint *bb = NULL, *bb1, *bd0;
107 1.2 kleink Bigint *bd = NULL, *bs = NULL, *delta = NULL; /* pacify gcc */
108 1.6 christos #ifdef Avoid_Underflow
109 1.6 christos ULong Lsb, Lsb1;
110 1.6 christos #endif
111 1.1 kleink #ifdef SET_INEXACT
112 1.1 kleink int inexact, oldinexact;
113 1.1 kleink #endif
114 1.6 christos #ifdef USE_LOCALE /*{{*/
115 1.12 joerg char *decimalpoint = localeconv_l(loc)->decimal_point;
116 1.6 christos size_t dplen = strlen(decimalpoint);
117 1.6 christos #endif /*USE_LOCALE}}*/
118 1.6 christos
119 1.6 christos #ifdef Honor_FLT_ROUNDS /*{*/
120 1.6 christos int Rounding;
121 1.6 christos #ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
122 1.6 christos Rounding = Flt_Rounds;
123 1.6 christos #else /*}{*/
124 1.6 christos Rounding = 1;
125 1.6 christos switch(fegetround()) {
126 1.6 christos case FE_TOWARDZERO: Rounding = 0; break;
127 1.6 christos case FE_UPWARD: Rounding = 2; break;
128 1.6 christos case FE_DOWNWARD: Rounding = 3;
129 1.6 christos }
130 1.6 christos #endif /*}}*/
131 1.6 christos #endif /*}*/
132 1.1 kleink
133 1.16 christos sign = nz0 = nz = decpt = 0;
134 1.6 christos dval(&rv) = 0.;
135 1.1 kleink for(s = s00;;s++) switch(*s) {
136 1.1 kleink case '-':
137 1.1 kleink sign = 1;
138 1.2 kleink /* FALLTHROUGH */
139 1.1 kleink case '+':
140 1.1 kleink if (*++s)
141 1.1 kleink goto break2;
142 1.2 kleink /* FALLTHROUGH */
143 1.1 kleink case 0:
144 1.1 kleink goto ret0;
145 1.1 kleink case '\t':
146 1.1 kleink case '\n':
147 1.1 kleink case '\v':
148 1.1 kleink case '\f':
149 1.1 kleink case '\r':
150 1.1 kleink case ' ':
151 1.1 kleink continue;
152 1.1 kleink default:
153 1.1 kleink goto break2;
154 1.1 kleink }
155 1.1 kleink break2:
156 1.1 kleink if (*s == '0') {
157 1.6 christos #ifndef NO_HEX_FP /*{*/
158 1.1 kleink {
159 1.15 riastrad static CONST FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI };
160 1.2 kleink Long expt;
161 1.1 kleink ULong bits[2];
162 1.1 kleink switch(s[1]) {
163 1.1 kleink case 'x':
164 1.1 kleink case 'X':
165 1.1 kleink {
166 1.6 christos #ifdef Honor_FLT_ROUNDS
167 1.1 kleink FPI fpi1 = fpi;
168 1.6 christos fpi1.rounding = Rounding;
169 1.1 kleink #else
170 1.1 kleink #define fpi1 fpi
171 1.1 kleink #endif
172 1.13 joerg switch((i = gethex(&s, &fpi1, &expt, &bb, sign, loc)) & STRTOG_Retmask) {
173 1.1 kleink case STRTOG_NoNumber:
174 1.1 kleink s = s00;
175 1.1 kleink sign = 0;
176 1.2 kleink /* FALLTHROUGH */
177 1.1 kleink case STRTOG_Zero:
178 1.1 kleink break;
179 1.1 kleink default:
180 1.1 kleink if (bb) {
181 1.1 kleink copybits(bits, fpi.nbits, bb);
182 1.1 kleink Bfree(bb);
183 1.1 kleink }
184 1.2 kleink ULtod((/* LINTED */(U*)&rv)->L, bits, expt, i);
185 1.1 kleink }}
186 1.1 kleink goto ret;
187 1.1 kleink }
188 1.1 kleink }
189 1.6 christos #endif /*}*/
190 1.1 kleink nz0 = 1;
191 1.1 kleink while(*++s == '0') ;
192 1.1 kleink if (!*s)
193 1.1 kleink goto ret;
194 1.1 kleink }
195 1.1 kleink s0 = s;
196 1.1 kleink y = z = 0;
197 1.1 kleink for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
198 1.1 kleink if (nd < 9)
199 1.1 kleink y = 10*y + c - '0';
200 1.16 christos else if (nd < DBL_DIG + 2)
201 1.1 kleink z = 10*z + c - '0';
202 1.1 kleink nd0 = nd;
203 1.1 kleink #ifdef USE_LOCALE
204 1.6 christos if (c == *decimalpoint) {
205 1.6 christos for(i = 1; decimalpoint[i]; ++i)
206 1.6 christos if (s[i] != decimalpoint[i])
207 1.6 christos goto dig_done;
208 1.6 christos s += i;
209 1.6 christos c = *s;
210 1.1 kleink #else
211 1.6 christos if (c == '.') {
212 1.6 christos c = *++s;
213 1.1 kleink #endif
214 1.1 kleink decpt = 1;
215 1.1 kleink if (!nd) {
216 1.1 kleink for(; c == '0'; c = *++s)
217 1.1 kleink nz++;
218 1.1 kleink if (c > '0' && c <= '9') {
219 1.1 kleink s0 = s;
220 1.1 kleink nf += nz;
221 1.1 kleink nz = 0;
222 1.1 kleink goto have_dig;
223 1.1 kleink }
224 1.1 kleink goto dig_done;
225 1.1 kleink }
226 1.1 kleink for(; c >= '0' && c <= '9'; c = *++s) {
227 1.1 kleink have_dig:
228 1.1 kleink nz++;
229 1.1 kleink if (c -= '0') {
230 1.1 kleink nf += nz;
231 1.1 kleink for(i = 1; i < nz; i++)
232 1.1 kleink if (nd++ < 9)
233 1.1 kleink y *= 10;
234 1.16 christos else if (nd <= DBL_DIG + 2)
235 1.1 kleink z *= 10;
236 1.1 kleink if (nd++ < 9)
237 1.1 kleink y = 10*y + c;
238 1.16 christos else if (nd <= DBL_DIG + 2)
239 1.1 kleink z = 10*z + c;
240 1.1 kleink nz = 0;
241 1.1 kleink }
242 1.1 kleink }
243 1.6 christos }/*}*/
244 1.1 kleink dig_done:
245 1.1 kleink e = 0;
246 1.1 kleink if (c == 'e' || c == 'E') {
247 1.1 kleink if (!nd && !nz && !nz0) {
248 1.1 kleink goto ret0;
249 1.1 kleink }
250 1.1 kleink s00 = s;
251 1.1 kleink esign = 0;
252 1.1 kleink switch(c = *++s) {
253 1.1 kleink case '-':
254 1.1 kleink esign = 1;
255 1.2 kleink /* FALLTHROUGH */
256 1.1 kleink case '+':
257 1.1 kleink c = *++s;
258 1.1 kleink }
259 1.1 kleink if (c >= '0' && c <= '9') {
260 1.1 kleink while(c == '0')
261 1.1 kleink c = *++s;
262 1.1 kleink if (c > '0' && c <= '9') {
263 1.1 kleink L = c - '0';
264 1.1 kleink s1 = s;
265 1.1 kleink while((c = *++s) >= '0' && c <= '9')
266 1.1 kleink L = 10*L + c - '0';
267 1.1 kleink if (s - s1 > 8 || L > 19999)
268 1.1 kleink /* Avoid confusion from exponents
269 1.1 kleink * so large that e might overflow.
270 1.1 kleink */
271 1.1 kleink e = 19999; /* safe for 16 bit ints */
272 1.1 kleink else
273 1.1 kleink e = (int)L;
274 1.1 kleink if (esign)
275 1.1 kleink e = -e;
276 1.1 kleink }
277 1.1 kleink else
278 1.1 kleink e = 0;
279 1.1 kleink }
280 1.1 kleink else
281 1.1 kleink s = s00;
282 1.1 kleink }
283 1.1 kleink if (!nd) {
284 1.1 kleink if (!nz && !nz0) {
285 1.1 kleink #ifdef INFNAN_CHECK
286 1.1 kleink /* Check for Nan and Infinity */
287 1.1 kleink ULong bits[2];
288 1.15 riastrad static CONST FPI fpinan = /* only 52 explicit bits */
289 1.1 kleink { 52, 1-1023-53+1, 2046-1023-53+1, 1, SI };
290 1.1 kleink if (!decpt)
291 1.1 kleink switch(c) {
292 1.1 kleink case 'i':
293 1.1 kleink case 'I':
294 1.1 kleink if (match(&s,"nf")) {
295 1.1 kleink --s;
296 1.1 kleink if (!match(&s,"inity"))
297 1.1 kleink ++s;
298 1.6 christos word0(&rv) = 0x7ff00000;
299 1.6 christos word1(&rv) = 0;
300 1.1 kleink goto ret;
301 1.1 kleink }
302 1.1 kleink break;
303 1.1 kleink case 'n':
304 1.1 kleink case 'N':
305 1.1 kleink if (match(&s, "an")) {
306 1.1 kleink #ifndef No_Hex_NaN
307 1.1 kleink if (*s == '(' /*)*/
308 1.1 kleink && hexnan(&s, &fpinan, bits)
309 1.1 kleink == STRTOG_NaNbits) {
310 1.6 christos word0(&rv) = 0x7ff00000 | bits[1];
311 1.6 christos word1(&rv) = bits[0];
312 1.1 kleink }
313 1.1 kleink else {
314 1.1 kleink #endif
315 1.6 christos word0(&rv) = NAN_WORD0;
316 1.6 christos word1(&rv) = NAN_WORD1;
317 1.1 kleink #ifndef No_Hex_NaN
318 1.1 kleink }
319 1.1 kleink #endif
320 1.1 kleink goto ret;
321 1.1 kleink }
322 1.1 kleink }
323 1.1 kleink #endif /* INFNAN_CHECK */
324 1.1 kleink ret0:
325 1.1 kleink s = s00;
326 1.1 kleink sign = 0;
327 1.1 kleink }
328 1.1 kleink goto ret;
329 1.1 kleink }
330 1.1 kleink e1 = e -= nf;
331 1.1 kleink
332 1.1 kleink /* Now we have nd0 digits, starting at s0, followed by a
333 1.1 kleink * decimal point, followed by nd-nd0 digits. The number we're
334 1.1 kleink * after is the integer represented by those digits times
335 1.1 kleink * 10**e */
336 1.1 kleink
337 1.1 kleink if (!nd0)
338 1.1 kleink nd0 = nd;
339 1.16 christos k = nd < DBL_DIG + 2 ? nd : DBL_DIG + 2;
340 1.6 christos dval(&rv) = y;
341 1.1 kleink if (k > 9) {
342 1.1 kleink #ifdef SET_INEXACT
343 1.1 kleink if (k > DBL_DIG)
344 1.1 kleink oldinexact = get_inexact();
345 1.1 kleink #endif
346 1.6 christos dval(&rv) = tens[k - 9] * dval(&rv) + z;
347 1.1 kleink }
348 1.1 kleink bd0 = 0;
349 1.1 kleink if (nd <= DBL_DIG
350 1.1 kleink #ifndef RND_PRODQUOT
351 1.1 kleink #ifndef Honor_FLT_ROUNDS
352 1.1 kleink && Flt_Rounds == 1
353 1.1 kleink #endif
354 1.1 kleink #endif
355 1.1 kleink ) {
356 1.1 kleink if (!e)
357 1.1 kleink goto ret;
358 1.6 christos #ifndef ROUND_BIASED_without_Round_Up
359 1.1 kleink if (e > 0) {
360 1.1 kleink if (e <= Ten_pmax) {
361 1.1 kleink #ifdef VAX
362 1.1 kleink goto vax_ovfl_check;
363 1.1 kleink #else
364 1.1 kleink #ifdef Honor_FLT_ROUNDS
365 1.1 kleink /* round correctly FLT_ROUNDS = 2 or 3 */
366 1.1 kleink if (sign) {
367 1.6 christos rv.d = -rv.d;
368 1.1 kleink sign = 0;
369 1.1 kleink }
370 1.1 kleink #endif
371 1.6 christos /* rv = */ rounded_product(dval(&rv), tens[e]);
372 1.1 kleink goto ret;
373 1.1 kleink #endif
374 1.1 kleink }
375 1.1 kleink i = DBL_DIG - nd;
376 1.1 kleink if (e <= Ten_pmax + i) {
377 1.1 kleink /* A fancier test would sometimes let us do
378 1.1 kleink * this for larger i values.
379 1.1 kleink */
380 1.1 kleink #ifdef Honor_FLT_ROUNDS
381 1.1 kleink /* round correctly FLT_ROUNDS = 2 or 3 */
382 1.1 kleink if (sign) {
383 1.6 christos rv.d = -rv.d;
384 1.1 kleink sign = 0;
385 1.1 kleink }
386 1.1 kleink #endif
387 1.1 kleink e -= i;
388 1.6 christos dval(&rv) *= tens[i];
389 1.1 kleink #ifdef VAX
390 1.1 kleink /* VAX exponent range is so narrow we must
391 1.1 kleink * worry about overflow here...
392 1.1 kleink */
393 1.1 kleink vax_ovfl_check:
394 1.6 christos word0(&rv) -= P*Exp_msk1;
395 1.6 christos /* rv = */ rounded_product(dval(&rv), tens[e]);
396 1.6 christos if ((word0(&rv) & Exp_mask)
397 1.1 kleink > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
398 1.1 kleink goto ovfl;
399 1.6 christos word0(&rv) += P*Exp_msk1;
400 1.1 kleink #else
401 1.6 christos /* rv = */ rounded_product(dval(&rv), tens[e]);
402 1.1 kleink #endif
403 1.1 kleink goto ret;
404 1.1 kleink }
405 1.1 kleink }
406 1.1 kleink #ifndef Inaccurate_Divide
407 1.1 kleink else if (e >= -Ten_pmax) {
408 1.1 kleink #ifdef Honor_FLT_ROUNDS
409 1.1 kleink /* round correctly FLT_ROUNDS = 2 or 3 */
410 1.1 kleink if (sign) {
411 1.6 christos rv.d = -rv.d;
412 1.1 kleink sign = 0;
413 1.1 kleink }
414 1.1 kleink #endif
415 1.6 christos /* rv = */ rounded_quotient(dval(&rv), tens[-e]);
416 1.1 kleink goto ret;
417 1.1 kleink }
418 1.1 kleink #endif
419 1.6 christos #endif /* ROUND_BIASED_without_Round_Up */
420 1.1 kleink }
421 1.1 kleink e1 += nd - k;
422 1.1 kleink
423 1.1 kleink #ifdef IEEE_Arith
424 1.1 kleink #ifdef SET_INEXACT
425 1.1 kleink inexact = 1;
426 1.1 kleink if (k <= DBL_DIG)
427 1.1 kleink oldinexact = get_inexact();
428 1.1 kleink #endif
429 1.1 kleink #ifdef Avoid_Underflow
430 1.1 kleink scale = 0;
431 1.1 kleink #endif
432 1.1 kleink #ifdef Honor_FLT_ROUNDS
433 1.6 christos if (Rounding >= 2) {
434 1.1 kleink if (sign)
435 1.6 christos Rounding = Rounding == 2 ? 0 : 2;
436 1.1 kleink else
437 1.6 christos if (Rounding != 2)
438 1.6 christos Rounding = 0;
439 1.1 kleink }
440 1.1 kleink #endif
441 1.1 kleink #endif /*IEEE_Arith*/
442 1.1 kleink
443 1.1 kleink /* Get starting approximation = rv * 10**e1 */
444 1.1 kleink
445 1.1 kleink if (e1 > 0) {
446 1.1 kleink if ( (i = e1 & 15) !=0)
447 1.6 christos dval(&rv) *= tens[i];
448 1.1 kleink if (e1 &= ~15) {
449 1.1 kleink if (e1 > DBL_MAX_10_EXP) {
450 1.1 kleink ovfl:
451 1.1 kleink /* Can't trust HUGE_VAL */
452 1.1 kleink #ifdef IEEE_Arith
453 1.1 kleink #ifdef Honor_FLT_ROUNDS
454 1.6 christos switch(Rounding) {
455 1.1 kleink case 0: /* toward 0 */
456 1.1 kleink case 3: /* toward -infinity */
457 1.6 christos word0(&rv) = Big0;
458 1.6 christos word1(&rv) = Big1;
459 1.1 kleink break;
460 1.1 kleink default:
461 1.6 christos word0(&rv) = Exp_mask;
462 1.6 christos word1(&rv) = 0;
463 1.1 kleink }
464 1.1 kleink #else /*Honor_FLT_ROUNDS*/
465 1.6 christos word0(&rv) = Exp_mask;
466 1.6 christos word1(&rv) = 0;
467 1.1 kleink #endif /*Honor_FLT_ROUNDS*/
468 1.1 kleink #ifdef SET_INEXACT
469 1.1 kleink /* set overflow bit */
470 1.6 christos dval(&rv0) = 1e300;
471 1.6 christos dval(&rv0) *= dval(&rv0);
472 1.1 kleink #endif
473 1.1 kleink #else /*IEEE_Arith*/
474 1.6 christos word0(&rv) = Big0;
475 1.6 christos word1(&rv) = Big1;
476 1.1 kleink #endif /*IEEE_Arith*/
477 1.6 christos range_err:
478 1.6 christos if (bd0) {
479 1.6 christos Bfree(bb);
480 1.6 christos Bfree(bd);
481 1.6 christos Bfree(bs);
482 1.6 christos Bfree(bd0);
483 1.6 christos Bfree(delta);
484 1.6 christos }
485 1.6 christos #ifndef NO_ERRNO
486 1.6 christos errno = ERANGE;
487 1.6 christos #endif
488 1.1 kleink goto ret;
489 1.1 kleink }
490 1.2 kleink e1 = (unsigned int)e1 >> 4;
491 1.2 kleink for(j = 0; e1 > 1; j++, e1 = (unsigned int)e1 >> 1)
492 1.1 kleink if (e1 & 1)
493 1.6 christos dval(&rv) *= bigtens[j];
494 1.1 kleink /* The last multiplication could overflow. */
495 1.6 christos word0(&rv) -= P*Exp_msk1;
496 1.6 christos dval(&rv) *= bigtens[j];
497 1.6 christos if ((z = word0(&rv) & Exp_mask)
498 1.1 kleink > Exp_msk1*(DBL_MAX_EXP+Bias-P))
499 1.1 kleink goto ovfl;
500 1.1 kleink if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
501 1.1 kleink /* set to largest number */
502 1.1 kleink /* (Can't trust DBL_MAX) */
503 1.6 christos word0(&rv) = Big0;
504 1.6 christos word1(&rv) = Big1;
505 1.1 kleink }
506 1.1 kleink else
507 1.6 christos word0(&rv) += P*Exp_msk1;
508 1.1 kleink }
509 1.1 kleink }
510 1.1 kleink else if (e1 < 0) {
511 1.1 kleink e1 = -e1;
512 1.1 kleink if ( (i = e1 & 15) !=0)
513 1.6 christos dval(&rv) /= tens[i];
514 1.1 kleink if (e1 >>= 4) {
515 1.1 kleink if (e1 >= 1 << n_bigtens)
516 1.1 kleink goto undfl;
517 1.1 kleink #ifdef Avoid_Underflow
518 1.1 kleink if (e1 & Scale_Bit)
519 1.1 kleink scale = 2*P;
520 1.2 kleink for(j = 0; e1 > 0; j++, e1 = (unsigned int)e1 >> 1)
521 1.1 kleink if (e1 & 1)
522 1.6 christos dval(&rv) *= tinytens[j];
523 1.6 christos if (scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
524 1.1 kleink >> Exp_shift)) > 0) {
525 1.1 kleink /* scaled rv is denormal; zap j low bits */
526 1.1 kleink if (j >= 32) {
527 1.6 christos word1(&rv) = 0;
528 1.1 kleink if (j >= 53)
529 1.6 christos word0(&rv) = (P+2)*Exp_msk1;
530 1.1 kleink else
531 1.11 christos word0(&rv) &= 0xffffffffU << (j-32);
532 1.1 kleink }
533 1.1 kleink else
534 1.11 christos word1(&rv) &= 0xffffffffU << j;
535 1.1 kleink }
536 1.1 kleink #else
537 1.10 he for(j = 0; e1 > 1; j++, e1 = (unsigned int)e1 >> 1)
538 1.1 kleink if (e1 & 1)
539 1.6 christos dval(&rv) *= tinytens[j];
540 1.1 kleink /* The last multiplication could underflow. */
541 1.6 christos dval(&rv0) = dval(&rv);
542 1.6 christos dval(&rv) *= tinytens[j];
543 1.6 christos if (!dval(&rv)) {
544 1.6 christos dval(&rv) = 2.*dval(&rv0);
545 1.6 christos dval(&rv) *= tinytens[j];
546 1.1 kleink #endif
547 1.6 christos if (!dval(&rv)) {
548 1.1 kleink undfl:
549 1.6 christos dval(&rv) = 0.;
550 1.16 christos #ifdef Honor_FLT_ROUNDS
551 1.16 christos if (Rounding == 2)
552 1.16 christos word1(&rv) = 1;
553 1.16 christos #endif
554 1.6 christos goto range_err;
555 1.1 kleink }
556 1.1 kleink #ifndef Avoid_Underflow
557 1.6 christos word0(&rv) = Tiny0;
558 1.6 christos word1(&rv) = Tiny1;
559 1.1 kleink /* The refinement below will clean
560 1.1 kleink * this approximation up.
561 1.1 kleink */
562 1.1 kleink }
563 1.1 kleink #endif
564 1.1 kleink }
565 1.1 kleink }
566 1.1 kleink
567 1.1 kleink /* Now the hard part -- adjusting rv to the correct value.*/
568 1.1 kleink
569 1.1 kleink /* Put digits into bd: true value = bd * 10^e */
570 1.1 kleink
571 1.6 christos bd0 = s2b(s0, nd0, nd, y, dplen);
572 1.5 christos if (bd0 == NULL)
573 1.5 christos goto ovfl;
574 1.1 kleink
575 1.1 kleink for(;;) {
576 1.1 kleink bd = Balloc(bd0->k);
577 1.5 christos if (bd == NULL)
578 1.5 christos goto ovfl;
579 1.1 kleink Bcopy(bd, bd0);
580 1.6 christos bb = d2b(dval(&rv), &bbe, &bbbits); /* rv = bb * 2^bbe */
581 1.5 christos if (bb == NULL)
582 1.5 christos goto ovfl;
583 1.1 kleink bs = i2b(1);
584 1.5 christos if (bs == NULL)
585 1.5 christos goto ovfl;
586 1.1 kleink
587 1.1 kleink if (e >= 0) {
588 1.1 kleink bb2 = bb5 = 0;
589 1.1 kleink bd2 = bd5 = e;
590 1.1 kleink }
591 1.1 kleink else {
592 1.1 kleink bb2 = bb5 = -e;
593 1.1 kleink bd2 = bd5 = 0;
594 1.1 kleink }
595 1.1 kleink if (bbe >= 0)
596 1.1 kleink bb2 += bbe;
597 1.1 kleink else
598 1.1 kleink bd2 -= bbe;
599 1.1 kleink bs2 = bb2;
600 1.1 kleink #ifdef Honor_FLT_ROUNDS
601 1.6 christos if (Rounding != 1)
602 1.1 kleink bs2++;
603 1.1 kleink #endif
604 1.1 kleink #ifdef Avoid_Underflow
605 1.6 christos Lsb = LSB;
606 1.6 christos Lsb1 = 0;
607 1.1 kleink j = bbe - scale;
608 1.1 kleink i = j + bbbits - 1; /* logb(rv) */
609 1.6 christos j = P + 1 - bbbits;
610 1.6 christos if (i < Emin) { /* denormal */
611 1.6 christos i = Emin - i;
612 1.6 christos j -= i;
613 1.6 christos if (i < 32)
614 1.6 christos Lsb <<= i;
615 1.6 christos else
616 1.6 christos Lsb1 = Lsb << (i-32);
617 1.6 christos }
618 1.1 kleink #else /*Avoid_Underflow*/
619 1.1 kleink #ifdef Sudden_Underflow
620 1.1 kleink #ifdef IBM
621 1.1 kleink j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
622 1.1 kleink #else
623 1.1 kleink j = P + 1 - bbbits;
624 1.1 kleink #endif
625 1.1 kleink #else /*Sudden_Underflow*/
626 1.1 kleink j = bbe;
627 1.6 christos i = j + bbbits - 1; /* logb(&rv) */
628 1.1 kleink if (i < Emin) /* denormal */
629 1.1 kleink j += P - Emin;
630 1.1 kleink else
631 1.1 kleink j = P + 1 - bbbits;
632 1.1 kleink #endif /*Sudden_Underflow*/
633 1.1 kleink #endif /*Avoid_Underflow*/
634 1.1 kleink bb2 += j;
635 1.1 kleink bd2 += j;
636 1.1 kleink #ifdef Avoid_Underflow
637 1.1 kleink bd2 += scale;
638 1.1 kleink #endif
639 1.1 kleink i = bb2 < bd2 ? bb2 : bd2;
640 1.1 kleink if (i > bs2)
641 1.1 kleink i = bs2;
642 1.1 kleink if (i > 0) {
643 1.1 kleink bb2 -= i;
644 1.1 kleink bd2 -= i;
645 1.1 kleink bs2 -= i;
646 1.1 kleink }
647 1.1 kleink if (bb5 > 0) {
648 1.1 kleink bs = pow5mult(bs, bb5);
649 1.5 christos if (bs == NULL)
650 1.5 christos goto ovfl;
651 1.1 kleink bb1 = mult(bs, bb);
652 1.5 christos if (bb1 == NULL)
653 1.5 christos goto ovfl;
654 1.1 kleink Bfree(bb);
655 1.1 kleink bb = bb1;
656 1.1 kleink }
657 1.5 christos if (bb2 > 0) {
658 1.1 kleink bb = lshift(bb, bb2);
659 1.5 christos if (bb == NULL)
660 1.5 christos goto ovfl;
661 1.5 christos }
662 1.5 christos if (bd5 > 0) {
663 1.1 kleink bd = pow5mult(bd, bd5);
664 1.5 christos if (bd == NULL)
665 1.5 christos goto ovfl;
666 1.5 christos }
667 1.5 christos if (bd2 > 0) {
668 1.1 kleink bd = lshift(bd, bd2);
669 1.5 christos if (bd == NULL)
670 1.5 christos goto ovfl;
671 1.5 christos }
672 1.5 christos if (bs2 > 0) {
673 1.1 kleink bs = lshift(bs, bs2);
674 1.5 christos if (bs == NULL)
675 1.5 christos goto ovfl;
676 1.5 christos }
677 1.1 kleink delta = diff(bb, bd);
678 1.5 christos if (delta == NULL)
679 1.5 christos goto ovfl;
680 1.1 kleink dsign = delta->sign;
681 1.1 kleink delta->sign = 0;
682 1.1 kleink i = cmp(delta, bs);
683 1.1 kleink #ifdef Honor_FLT_ROUNDS
684 1.6 christos if (Rounding != 1) {
685 1.1 kleink if (i < 0) {
686 1.1 kleink /* Error is less than an ulp */
687 1.1 kleink if (!delta->x[0] && delta->wds <= 1) {
688 1.1 kleink /* exact */
689 1.1 kleink #ifdef SET_INEXACT
690 1.1 kleink inexact = 0;
691 1.1 kleink #endif
692 1.1 kleink break;
693 1.1 kleink }
694 1.6 christos if (Rounding) {
695 1.1 kleink if (dsign) {
696 1.6 christos dval(&adj) = 1.;
697 1.1 kleink goto apply_adj;
698 1.1 kleink }
699 1.1 kleink }
700 1.1 kleink else if (!dsign) {
701 1.6 christos dval(&adj) = -1.;
702 1.6 christos if (!word1(&rv)
703 1.6 christos && !(word0(&rv) & Frac_mask)) {
704 1.6 christos y = word0(&rv) & Exp_mask;
705 1.1 kleink #ifdef Avoid_Underflow
706 1.1 kleink if (!scale || y > 2*P*Exp_msk1)
707 1.1 kleink #else
708 1.1 kleink if (y)
709 1.1 kleink #endif
710 1.1 kleink {
711 1.1 kleink delta = lshift(delta,Log2P);
712 1.18 christos if (delta == NULL)
713 1.18 christos goto ovfl;
714 1.1 kleink if (cmp(delta, bs) <= 0)
715 1.6 christos dval(&adj) = -0.5;
716 1.1 kleink }
717 1.1 kleink }
718 1.1 kleink apply_adj:
719 1.1 kleink #ifdef Avoid_Underflow
720 1.6 christos if (scale && (y = word0(&rv) & Exp_mask)
721 1.1 kleink <= 2*P*Exp_msk1)
722 1.6 christos word0(&adj) += (2*P+1)*Exp_msk1 - y;
723 1.1 kleink #else
724 1.1 kleink #ifdef Sudden_Underflow
725 1.6 christos if ((word0(&rv) & Exp_mask) <=
726 1.1 kleink P*Exp_msk1) {
727 1.6 christos word0(&rv) += P*Exp_msk1;
728 1.6 christos dval(&rv) += adj*ulp(&rv);
729 1.6 christos word0(&rv) -= P*Exp_msk1;
730 1.1 kleink }
731 1.1 kleink else
732 1.1 kleink #endif /*Sudden_Underflow*/
733 1.1 kleink #endif /*Avoid_Underflow*/
734 1.6 christos dval(&rv) += adj.d*ulp(&rv);
735 1.1 kleink }
736 1.1 kleink break;
737 1.1 kleink }
738 1.6 christos dval(&adj) = ratio(delta, bs);
739 1.6 christos if (adj.d < 1.)
740 1.6 christos dval(&adj) = 1.;
741 1.6 christos if (adj.d <= 0x7ffffffe) {
742 1.6 christos /* dval(&adj) = Rounding ? ceil(&adj) : floor(&adj); */
743 1.6 christos y = adj.d;
744 1.6 christos if (y != adj.d) {
745 1.17 christos if (!(((unsigned int)Rounding>>1) ^ (unsigned int)dsign))
746 1.1 kleink y++;
747 1.6 christos dval(&adj) = y;
748 1.1 kleink }
749 1.1 kleink }
750 1.1 kleink #ifdef Avoid_Underflow
751 1.6 christos if (scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
752 1.6 christos word0(&adj) += (2*P+1)*Exp_msk1 - y;
753 1.1 kleink #else
754 1.1 kleink #ifdef Sudden_Underflow
755 1.6 christos if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
756 1.6 christos word0(&rv) += P*Exp_msk1;
757 1.6 christos dval(&adj) *= ulp(&rv);
758 1.1 kleink if (dsign)
759 1.6 christos dval(&rv) += adj;
760 1.1 kleink else
761 1.6 christos dval(&rv) -= adj;
762 1.6 christos word0(&rv) -= P*Exp_msk1;
763 1.1 kleink goto cont;
764 1.1 kleink }
765 1.1 kleink #endif /*Sudden_Underflow*/
766 1.1 kleink #endif /*Avoid_Underflow*/
767 1.6 christos dval(&adj) *= ulp(&rv);
768 1.6 christos if (dsign) {
769 1.6 christos if (word0(&rv) == Big0 && word1(&rv) == Big1)
770 1.6 christos goto ovfl;
771 1.6 christos dval(&rv) += adj.d;
772 1.6 christos }
773 1.1 kleink else
774 1.6 christos dval(&rv) -= adj.d;
775 1.1 kleink goto cont;
776 1.1 kleink }
777 1.1 kleink #endif /*Honor_FLT_ROUNDS*/
778 1.1 kleink
779 1.1 kleink if (i < 0) {
780 1.1 kleink /* Error is less than half an ulp -- check for
781 1.1 kleink * special case of mantissa a power of two.
782 1.1 kleink */
783 1.6 christos if (dsign || word1(&rv) || word0(&rv) & Bndry_mask
784 1.1 kleink #ifdef IEEE_Arith
785 1.1 kleink #ifdef Avoid_Underflow
786 1.6 christos || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
787 1.1 kleink #else
788 1.6 christos || (word0(&rv) & Exp_mask) <= Exp_msk1
789 1.1 kleink #endif
790 1.1 kleink #endif
791 1.1 kleink ) {
792 1.1 kleink #ifdef SET_INEXACT
793 1.1 kleink if (!delta->x[0] && delta->wds <= 1)
794 1.1 kleink inexact = 0;
795 1.1 kleink #endif
796 1.1 kleink break;
797 1.1 kleink }
798 1.1 kleink if (!delta->x[0] && delta->wds <= 1) {
799 1.1 kleink /* exact result */
800 1.1 kleink #ifdef SET_INEXACT
801 1.1 kleink inexact = 0;
802 1.1 kleink #endif
803 1.1 kleink break;
804 1.1 kleink }
805 1.1 kleink delta = lshift(delta,Log2P);
806 1.18 christos if (delta == NULL)
807 1.18 christos goto ovfl;
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.17 christos 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.14 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 return _int_strtod_l(s, sp, loc);
1117 1.12 joerg }
1118