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