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