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