Bug 551763: Fix deletion of arguments ident. (r=Waldo)
[mozilla-central.git] / js / src / dtoa.c
blob76fc8cf08e626fe417aa227548149f16cd50ef31
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /****************************************************************
4 * The author of this software is David M. Gay.
6 * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose without fee is hereby granted, provided that this entire notice
10 * is included in all copies of any software which is or includes a copy
11 * or modification of this software and in all copies of the supporting
12 * documentation for such software.
14 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
15 * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
16 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
17 * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
19 ***************************************************************/
21 /* Please send bug reports to David M. Gay (dmg at acm dot org,
22 * with " at " changed at "@" and " dot " changed to "."). */
24 /* On a machine with IEEE extended-precision registers, it is
25 * necessary to specify double-precision (53-bit) rounding precision
26 * before invoking strtod or dtoa. If the machine uses (the equivalent
27 * of) Intel 80x87 arithmetic, the call
28 * _control87(PC_53, MCW_PC);
29 * does this with many compilers. Whether this or another call is
30 * appropriate depends on the compiler; for this to work, it may be
31 * necessary to #include "float.h" or another system-dependent header
32 * file.
35 /* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
37 * This strtod returns a nearest machine number to the input decimal
38 * string (or sets errno to ERANGE). With IEEE arithmetic, ties are
39 * broken by the IEEE round-even rule. Otherwise ties are broken by
40 * biased rounding (add half and chop).
42 * Inspired loosely by William D. Clinger's paper "How to Read Floating
43 * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
45 * Modifications:
47 * 1. We only require IEEE, IBM, or VAX double-precision
48 * arithmetic (not IEEE double-extended).
49 * 2. We get by with floating-point arithmetic in a case that
50 * Clinger missed -- when we're computing d * 10^n
51 * for a small integer d and the integer n is not too
52 * much larger than 22 (the maximum integer k for which
53 * we can represent 10^k exactly), we may be able to
54 * compute (d*10^k) * 10^(e-k) with just one roundoff.
55 * 3. Rather than a bit-at-a-time adjustment of the binary
56 * result in the hard case, we use floating-point
57 * arithmetic to determine the adjustment to within
58 * one bit; only in really hard cases do we need to
59 * compute a second residual.
60 * 4. Because of 3., we don't need a large table of powers of 10
61 * for ten-to-e (just some small tables, e.g. of 10^k
62 * for 0 <= k <= 22).
66 * #define IEEE_8087 for IEEE-arithmetic machines where the least
67 * significant byte has the lowest address.
68 * #define IEEE_MC68k for IEEE-arithmetic machines where the most
69 * significant byte has the lowest address.
70 * #define Long int on machines with 32-bit ints and 64-bit longs.
71 * #define IBM for IBM mainframe-style floating-point arithmetic.
72 * #define VAX for VAX-style floating-point arithmetic (D_floating).
73 * #define No_leftright to omit left-right logic in fast floating-point
74 * computation of dtoa.
75 * #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3
76 * and strtod and dtoa should round accordingly.
77 * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3
78 * and Honor_FLT_ROUNDS is not #defined.
79 * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
80 * that use extended-precision instructions to compute rounded
81 * products and quotients) with IBM.
82 * #define ROUND_BIASED for IEEE-format with biased rounding.
83 * #define Inaccurate_Divide for IEEE-format with correctly rounded
84 * products but inaccurate quotients, e.g., for Intel i860.
85 * #define NO_LONG_LONG on machines that do not have a "long long"
86 * integer type (of >= 64 bits). On such machines, you can
87 * #define Just_16 to store 16 bits per 32-bit Long when doing
88 * high-precision integer arithmetic. Whether this speeds things
89 * up or slows things down depends on the machine and the number
90 * being converted. If long long is available and the name is
91 * something other than "long long", #define Llong to be the name,
92 * and if "unsigned Llong" does not work as an unsigned version of
93 * Llong, #define #ULLong to be the corresponding unsigned type.
94 * #define KR_headers for old-style C function headers.
95 * #define Bad_float_h if your system lacks a float.h or if it does not
96 * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
97 * FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
98 * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
99 * if memory is available and otherwise does something you deem
100 * appropriate. If MALLOC is undefined, malloc will be invoked
101 * directly -- and assumed always to succeed. Similarly, if you
102 * want something other than the system's free() to be called to
103 * recycle memory acquired from MALLOC, #define FREE to be the
104 * name of the alternate routine. (Unless you #define
105 * NO_GLOBAL_STATE and call destroydtoa, FREE or free is only
106 * called in pathological cases, e.g., in a dtoa call after a dtoa
107 * return in mode 3 with thousands of digits requested.)
108 * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
109 * memory allocations from a private pool of memory when possible.
110 * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes,
111 * unless #defined to be a different length. This default length
112 * suffices to get rid of MALLOC calls except for unusual cases,
113 * such as decimal-to-binary conversion of a very long string of
114 * digits. The longest string dtoa can return is about 751 bytes
115 * long. For conversions by strtod of strings of 800 digits and
116 * all dtoa conversions in single-threaded executions with 8-byte
117 * pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte
118 * pointers, PRIVATE_MEM >= 7112 appears adequate.
119 * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK
120 * #defined automatically on IEEE systems. On such systems,
121 * when INFNAN_CHECK is #defined, strtod checks
122 * for Infinity and NaN (case insensitively). On some systems
123 * (e.g., some HP systems), it may be necessary to #define NAN_WORD0
124 * appropriately -- to the most significant word of a quiet NaN.
125 * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.)
126 * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined,
127 * strtod also accepts (case insensitively) strings of the form
128 * NaN(x), where x is a string of hexadecimal digits and spaces;
129 * if there is only one string of hexadecimal digits, it is taken
130 * for the 52 fraction bits of the resulting NaN; if there are two
131 * or more strings of hex digits, the first is for the high 20 bits,
132 * the second and subsequent for the low 32 bits, with intervening
133 * white space ignored; but if this results in none of the 52
134 * fraction bits being on (an IEEE Infinity symbol), then NAN_WORD0
135 * and NAN_WORD1 are used instead.
136 * #define MULTIPLE_THREADS if the system offers preemptively scheduled
137 * multiple threads. In this case, you must provide (or suitably
138 * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed
139 * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed
140 * in pow5mult, ensures lazy evaluation of only one copy of high
141 * powers of 5; omitting this lock would introduce a small
142 * probability of wasting memory, but would otherwise be harmless.)
143 * You must also invoke freedtoa(s) to free the value s returned by
144 * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined.
145 * #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that
146 * avoids underflows on inputs whose result does not underflow.
147 * If you #define NO_IEEE_Scale on a machine that uses IEEE-format
148 * floating-point numbers and flushes underflows to zero rather
149 * than implementing gradual underflow, then you must also #define
150 * Sudden_Underflow.
151 * #define USE_LOCALE to use the current locale's decimal_point value.
152 * #define SET_INEXACT if IEEE arithmetic is being used and extra
153 * computation should be done to set the inexact flag when the
154 * result is inexact and avoid setting inexact when the result
155 * is exact. In this case, dtoa.c must be compiled in
156 * an environment, perhaps provided by #include "dtoa.c" in a
157 * suitable wrapper, that defines two functions,
158 * int get_inexact(void);
159 * void clear_inexact(void);
160 * such that get_inexact() returns a nonzero value if the
161 * inexact bit is already set, and clear_inexact() sets the
162 * inexact bit to 0. When SET_INEXACT is #defined, strtod
163 * also does extra computations to set the underflow and overflow
164 * flags when appropriate (i.e., when the result is tiny and
165 * inexact or when it is a numeric value rounded to +-infinity).
166 * #define NO_ERRNO if strtod should not assign errno = ERANGE when
167 * the result overflows to +-Infinity or underflows to 0.
168 * #define NO_GLOBAL_STATE to avoid defining any non-const global or
169 * static variables. Instead the necessary state is stored in an
170 * opaque struct, DtoaState, a pointer to which must be passed to
171 * every entry point. Two new functions are added to the API:
172 * DtoaState *newdtoa(void);
173 * void destroydtoa(DtoaState *);
176 #ifndef Long
177 #define Long long
178 #endif
179 #ifndef ULong
180 typedef unsigned Long ULong;
181 #endif
183 #ifdef DEBUG
184 #include "stdio.h"
185 #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
186 #endif
188 #include "stdlib.h"
189 #include "string.h"
191 #ifdef USE_LOCALE
192 #include "locale.h"
193 #endif
195 #ifdef MALLOC
196 #ifdef KR_headers
197 extern char *MALLOC();
198 #else
199 extern void *MALLOC(size_t);
200 #endif
201 #else
202 #define MALLOC malloc
203 #endif
205 #ifndef FREE
206 #define FREE free
207 #endif
209 #ifndef Omit_Private_Memory
210 #ifndef PRIVATE_MEM
211 #define PRIVATE_MEM 2304
212 #endif
213 #define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
214 #endif
216 #undef IEEE_Arith
217 #undef Avoid_Underflow
218 #ifdef IEEE_MC68k
219 #define IEEE_Arith
220 #endif
221 #ifdef IEEE_8087
222 #define IEEE_Arith
223 #endif
225 #ifdef IEEE_Arith
226 #ifndef NO_INFNAN_CHECK
227 #undef INFNAN_CHECK
228 #define INFNAN_CHECK
229 #endif
230 #else
231 #undef INFNAN_CHECK
232 #endif
234 #include "errno.h"
236 #ifdef Bad_float_h
238 #ifdef IEEE_Arith
239 #define DBL_DIG 15
240 #define DBL_MAX_10_EXP 308
241 #define DBL_MAX_EXP 1024
242 #define FLT_RADIX 2
243 #endif /*IEEE_Arith*/
245 #ifdef IBM
246 #define DBL_DIG 16
247 #define DBL_MAX_10_EXP 75
248 #define DBL_MAX_EXP 63
249 #define FLT_RADIX 16
250 #define DBL_MAX 7.2370055773322621e+75
251 #endif
253 #ifdef VAX
254 #define DBL_DIG 16
255 #define DBL_MAX_10_EXP 38
256 #define DBL_MAX_EXP 127
257 #define FLT_RADIX 2
258 #define DBL_MAX 1.7014118346046923e+38
259 #endif
261 #ifndef LONG_MAX
262 #define LONG_MAX 2147483647
263 #endif
265 #else /* ifndef Bad_float_h */
266 #include "float.h"
267 #endif /* Bad_float_h */
269 #ifndef __MATH_H__
270 #include "math.h"
271 #endif
273 #ifdef __cplusplus
274 extern "C" {
275 #endif
277 #ifndef CONST
278 #ifdef KR_headers
279 #define CONST /* blank */
280 #else
281 #define CONST const
282 #endif
283 #endif
285 #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
286 Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
287 #endif
289 typedef union { double d; ULong L[2]; } U;
291 #define dval(x) ((x).d)
292 #ifdef IEEE_8087
293 #define word0(x) ((x).L[1])
294 #define word1(x) ((x).L[0])
295 #else
296 #define word0(x) ((x).L[0])
297 #define word1(x) ((x).L[1])
298 #endif
300 /* The following definition of Storeinc is appropriate for MIPS processors.
301 * An alternative that might be better on some machines is
302 * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
304 #if defined(IEEE_8087) + defined(VAX)
305 #define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
306 ((unsigned short *)a)[0] = (unsigned short)c, a++)
307 #else
308 #define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
309 ((unsigned short *)a)[1] = (unsigned short)c, a++)
310 #endif
312 /* #define P DBL_MANT_DIG */
313 /* Ten_pmax = floor(P*log(2)/log(5)) */
314 /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
315 /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
316 /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
318 #ifdef IEEE_Arith
319 #define Exp_shift 20
320 #define Exp_shift1 20
321 #define Exp_msk1 0x100000
322 #define Exp_msk11 0x100000
323 #define Exp_mask 0x7ff00000
324 #define P 53
325 #define Bias 1023
326 #define Emin (-1022)
327 #define Exp_1 0x3ff00000
328 #define Exp_11 0x3ff00000
329 #define Ebits 11
330 #define Frac_mask 0xfffff
331 #define Frac_mask1 0xfffff
332 #define Ten_pmax 22
333 #define Bletch 0x10
334 #define Bndry_mask 0xfffff
335 #define Bndry_mask1 0xfffff
336 #define LSB 1
337 #define Sign_bit 0x80000000
338 #define Log2P 1
339 #define Tiny0 0
340 #define Tiny1 1
341 #define Quick_max 14
342 #define Int_max 14
343 #ifndef NO_IEEE_Scale
344 #define Avoid_Underflow
345 #ifdef Flush_Denorm /* debugging option */
346 #undef Sudden_Underflow
347 #endif
348 #endif
350 #ifndef Flt_Rounds
351 #ifdef FLT_ROUNDS
352 #define Flt_Rounds FLT_ROUNDS
353 #else
354 #define Flt_Rounds 1
355 #endif
356 #endif /*Flt_Rounds*/
358 #ifdef Honor_FLT_ROUNDS
359 #define Rounding rounding
360 #undef Check_FLT_ROUNDS
361 #define Check_FLT_ROUNDS
362 #else
363 #define Rounding Flt_Rounds
364 #endif
366 #else /* ifndef IEEE_Arith */
367 #undef Check_FLT_ROUNDS
368 #undef Honor_FLT_ROUNDS
369 #undef SET_INEXACT
370 #undef Sudden_Underflow
371 #define Sudden_Underflow
372 #ifdef IBM
373 #undef Flt_Rounds
374 #define Flt_Rounds 0
375 #define Exp_shift 24
376 #define Exp_shift1 24
377 #define Exp_msk1 0x1000000
378 #define Exp_msk11 0x1000000
379 #define Exp_mask 0x7f000000
380 #define P 14
381 #define Bias 65
382 #define Exp_1 0x41000000
383 #define Exp_11 0x41000000
384 #define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */
385 #define Frac_mask 0xffffff
386 #define Frac_mask1 0xffffff
387 #define Bletch 4
388 #define Ten_pmax 22
389 #define Bndry_mask 0xefffff
390 #define Bndry_mask1 0xffffff
391 #define LSB 1
392 #define Sign_bit 0x80000000
393 #define Log2P 4
394 #define Tiny0 0x100000
395 #define Tiny1 0
396 #define Quick_max 14
397 #define Int_max 15
398 #else /* VAX */
399 #undef Flt_Rounds
400 #define Flt_Rounds 1
401 #define Exp_shift 23
402 #define Exp_shift1 7
403 #define Exp_msk1 0x80
404 #define Exp_msk11 0x800000
405 #define Exp_mask 0x7f80
406 #define P 56
407 #define Bias 129
408 #define Exp_1 0x40800000
409 #define Exp_11 0x4080
410 #define Ebits 8
411 #define Frac_mask 0x7fffff
412 #define Frac_mask1 0xffff007f
413 #define Ten_pmax 24
414 #define Bletch 2
415 #define Bndry_mask 0xffff007f
416 #define Bndry_mask1 0xffff007f
417 #define LSB 0x10000
418 #define Sign_bit 0x8000
419 #define Log2P 1
420 #define Tiny0 0x80
421 #define Tiny1 0
422 #define Quick_max 15
423 #define Int_max 15
424 #endif /* IBM, VAX */
425 #endif /* IEEE_Arith */
427 #ifndef IEEE_Arith
428 #define ROUND_BIASED
429 #endif
431 #ifdef RND_PRODQUOT
432 #define rounded_product(a,b) a = rnd_prod(a, b)
433 #define rounded_quotient(a,b) a = rnd_quot(a, b)
434 #ifdef KR_headers
435 extern double rnd_prod(), rnd_quot();
436 #else
437 extern double rnd_prod(double, double), rnd_quot(double, double);
438 #endif
439 #else
440 #define rounded_product(a,b) a *= b
441 #define rounded_quotient(a,b) a /= b
442 #endif
444 #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
445 #define Big1 0xffffffff
447 #ifndef Pack_32
448 #define Pack_32
449 #endif
451 #ifdef KR_headers
452 #define FFFFFFFF ((((unsigned long)0xffff)<<16)|(unsigned long)0xffff)
453 #else
454 #define FFFFFFFF 0xffffffffUL
455 #endif
457 #ifdef NO_LONG_LONG
458 #undef ULLong
459 #ifdef Just_16
460 #undef Pack_32
461 /* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
462 * This makes some inner loops simpler and sometimes saves work
463 * during multiplications, but it often seems to make things slightly
464 * slower. Hence the default is now to store 32 bits per Long.
466 #endif
467 #else /* long long available */
468 #ifndef Llong
469 #define Llong long long
470 #endif
471 #ifndef ULLong
472 #define ULLong unsigned Llong
473 #endif
474 #endif /* NO_LONG_LONG */
476 #ifndef MULTIPLE_THREADS
477 #define ACQUIRE_DTOA_LOCK(n) /*nothing*/
478 #define FREE_DTOA_LOCK(n) /*nothing*/
479 #endif
481 #define Kmax 7
483 struct
484 Bigint {
485 struct Bigint *next;
486 int k, maxwds, sign, wds;
487 ULong x[1];
490 typedef struct Bigint Bigint;
492 #ifdef NO_GLOBAL_STATE
493 #ifdef MULTIPLE_THREADS
494 #error "cannot have both NO_GLOBAL_STATE and MULTIPLE_THREADS"
495 #endif
496 struct
497 DtoaState {
498 #define DECLARE_GLOBAL_STATE /* nothing */
499 #else
500 #define DECLARE_GLOBAL_STATE static
501 #endif
503 DECLARE_GLOBAL_STATE Bigint *freelist[Kmax+1];
504 DECLARE_GLOBAL_STATE Bigint *p5s;
505 #ifndef Omit_Private_Memory
506 DECLARE_GLOBAL_STATE double private_mem[PRIVATE_mem];
507 DECLARE_GLOBAL_STATE double *pmem_next
508 #ifndef NO_GLOBAL_STATE
509 = private_mem
510 #endif
512 #endif
513 #ifdef NO_GLOBAL_STATE
515 typedef struct DtoaState DtoaState;
516 #ifdef KR_headers
517 #define STATE_PARAM state,
518 #define STATE_PARAM_DECL DtoaState *state;
519 #else
520 #define STATE_PARAM DtoaState *state,
521 #endif
522 #define PASS_STATE state,
523 #define GET_STATE(field) (state->field)
525 static DtoaState *
526 newdtoa(void)
528 DtoaState *state = (DtoaState *) MALLOC(sizeof(DtoaState));
529 if (state) {
530 memset(state, 0, sizeof(DtoaState));
531 state->pmem_next = state->private_mem;
533 return state;
536 static void
537 destroydtoa
538 #ifdef KR_headers
539 (state) STATE_PARAM_DECL
540 #else
541 (DtoaState *state)
542 #endif
544 int i;
545 Bigint *v, *next;
547 for (i = 0; i <= Kmax; i++) {
548 for (v = GET_STATE(freelist)[i]; v; v = next) {
549 next = v->next;
550 #ifndef Omit_Private_Memory
551 if ((double*)v < GET_STATE(private_mem) ||
552 (double*)v >= GET_STATE(private_mem) + PRIVATE_mem)
553 #endif
554 FREE((void*)v);
557 FREE((void *)state);
560 #else
561 #define STATE_PARAM /* nothing */
562 #define STATE_PARAM_DECL /* nothing */
563 #define PASS_STATE /* nothing */
564 #define GET_STATE(name) name
565 #endif
567 static Bigint *
568 Balloc
569 #ifdef KR_headers
570 (STATE_PARAM k) STATE_PARAM_DECL int k;
571 #else
572 (STATE_PARAM int k)
573 #endif
575 int x;
576 Bigint *rv;
577 #ifndef Omit_Private_Memory
578 size_t len;
579 #endif
581 ACQUIRE_DTOA_LOCK(0);
582 /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */
583 /* but this case seems very unlikely. */
584 if (k <= Kmax && (rv = GET_STATE(freelist)[k]))
585 GET_STATE(freelist)[k] = rv->next;
586 else {
587 x = 1 << k;
588 #ifdef Omit_Private_Memory
589 rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));
590 #else
591 len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
592 /sizeof(double);
593 if (k <= Kmax && GET_STATE(pmem_next) - GET_STATE(private_mem) + len <= PRIVATE_mem) {
594 rv = (Bigint*)GET_STATE(pmem_next);
595 GET_STATE(pmem_next) += len;
597 else
598 rv = (Bigint*)MALLOC(len*sizeof(double));
599 #endif
600 rv->k = k;
601 rv->maxwds = x;
603 FREE_DTOA_LOCK(0);
604 rv->sign = rv->wds = 0;
605 return rv;
608 static void
609 Bfree
610 #ifdef KR_headers
611 (STATE_PARAM v) STATE_PARAM_DECL Bigint *v;
612 #else
613 (STATE_PARAM Bigint *v)
614 #endif
616 if (v) {
617 if (v->k > Kmax)
618 FREE((void*)v);
619 else {
620 ACQUIRE_DTOA_LOCK(0);
621 v->next = GET_STATE(freelist)[v->k];
622 GET_STATE(freelist)[v->k] = v;
623 FREE_DTOA_LOCK(0);
628 #define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
629 y->wds*sizeof(Long) + 2*sizeof(int))
631 static Bigint *
632 multadd
633 #ifdef KR_headers
634 (STATE_PARAM b, m, a) STATE_PARAM_DECL Bigint *b; int m, a;
635 #else
636 (STATE_PARAM Bigint *b, int m, int a) /* multiply by m and add a */
637 #endif
639 int i, wds;
640 #ifdef ULLong
641 ULong *x;
642 ULLong carry, y;
643 #else
644 ULong carry, *x, y;
645 #ifdef Pack_32
646 ULong xi, z;
647 #endif
648 #endif
649 Bigint *b1;
651 wds = b->wds;
652 x = b->x;
653 i = 0;
654 carry = a;
655 do {
656 #ifdef ULLong
657 y = *x * (ULLong)m + carry;
658 carry = y >> 32;
659 *x++ = (ULong) y & FFFFFFFF;
660 #else
661 #ifdef Pack_32
662 xi = *x;
663 y = (xi & 0xffff) * m + carry;
664 z = (xi >> 16) * m + (y >> 16);
665 carry = z >> 16;
666 *x++ = (z << 16) + (y & 0xffff);
667 #else
668 y = *x * m + carry;
669 carry = y >> 16;
670 *x++ = y & 0xffff;
671 #endif
672 #endif
674 while(++i < wds);
675 if (carry) {
676 if (wds >= b->maxwds) {
677 b1 = Balloc(PASS_STATE b->k+1);
678 Bcopy(b1, b);
679 Bfree(PASS_STATE b);
680 b = b1;
682 b->x[wds++] = (ULong) carry;
683 b->wds = wds;
685 return b;
688 static Bigint *
690 #ifdef KR_headers
691 (STATE_PARAM s, nd0, nd, y9) STATE_PARAM_DECL CONST char *s; int nd0, nd; ULong y9;
692 #else
693 (STATE_PARAM CONST char *s, int nd0, int nd, ULong y9)
694 #endif
696 Bigint *b;
697 int i, k;
698 Long x, y;
700 x = (nd + 8) / 9;
701 for(k = 0, y = 1; x > y; y <<= 1, k++) ;
702 #ifdef Pack_32
703 b = Balloc(PASS_STATE k);
704 b->x[0] = y9;
705 b->wds = 1;
706 #else
707 b = Balloc(PASS_STATE k+1);
708 b->x[0] = y9 & 0xffff;
709 b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
710 #endif
712 i = 9;
713 if (9 < nd0) {
714 s += 9;
715 do b = multadd(PASS_STATE b, 10, *s++ - '0');
716 while(++i < nd0);
717 s++;
719 else
720 s += 10;
721 for(; i < nd; i++)
722 b = multadd(PASS_STATE b, 10, *s++ - '0');
723 return b;
726 static int
727 hi0bits
728 #ifdef KR_headers
729 (x) register ULong x;
730 #else
731 (register ULong x)
732 #endif
734 register int k = 0;
736 if (!(x & 0xffff0000)) {
737 k = 16;
738 x <<= 16;
740 if (!(x & 0xff000000)) {
741 k += 8;
742 x <<= 8;
744 if (!(x & 0xf0000000)) {
745 k += 4;
746 x <<= 4;
748 if (!(x & 0xc0000000)) {
749 k += 2;
750 x <<= 2;
752 if (!(x & 0x80000000)) {
753 k++;
754 if (!(x & 0x40000000))
755 return 32;
757 return k;
760 static int
761 lo0bits
762 #ifdef KR_headers
763 (y) ULong *y;
764 #else
765 (ULong *y)
766 #endif
768 register int k;
769 register ULong x = *y;
771 if (x & 7) {
772 if (x & 1)
773 return 0;
774 if (x & 2) {
775 *y = x >> 1;
776 return 1;
778 *y = x >> 2;
779 return 2;
781 k = 0;
782 if (!(x & 0xffff)) {
783 k = 16;
784 x >>= 16;
786 if (!(x & 0xff)) {
787 k += 8;
788 x >>= 8;
790 if (!(x & 0xf)) {
791 k += 4;
792 x >>= 4;
794 if (!(x & 0x3)) {
795 k += 2;
796 x >>= 2;
798 if (!(x & 1)) {
799 k++;
800 x >>= 1;
801 if (!x)
802 return 32;
804 *y = x;
805 return k;
808 static Bigint *
810 #ifdef KR_headers
811 (STATE_PARAM i) STATE_PARAM_DECL int i;
812 #else
813 (STATE_PARAM int i)
814 #endif
816 Bigint *b;
818 b = Balloc(PASS_STATE 1);
819 b->x[0] = i;
820 b->wds = 1;
821 return b;
824 static Bigint *
825 mult
826 #ifdef KR_headers
827 (STATE_PARAM a, b) STATE_PARAM_DECL Bigint *a, *b;
828 #else
829 (STATE_PARAM Bigint *a, Bigint *b)
830 #endif
832 Bigint *c;
833 int k, wa, wb, wc;
834 ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
835 ULong y;
836 #ifdef ULLong
837 ULLong carry, z;
838 #else
839 ULong carry, z;
840 #ifdef Pack_32
841 ULong z2;
842 #endif
843 #endif
845 if (a->wds < b->wds) {
846 c = a;
847 a = b;
848 b = c;
850 k = a->k;
851 wa = a->wds;
852 wb = b->wds;
853 wc = wa + wb;
854 if (wc > a->maxwds)
855 k++;
856 c = Balloc(PASS_STATE k);
857 for(x = c->x, xa = x + wc; x < xa; x++)
858 *x = 0;
859 xa = a->x;
860 xae = xa + wa;
861 xb = b->x;
862 xbe = xb + wb;
863 xc0 = c->x;
864 #ifdef ULLong
865 for(; xb < xbe; xc0++) {
866 if ((y = *xb++)) {
867 x = xa;
868 xc = xc0;
869 carry = 0;
870 do {
871 z = *x++ * (ULLong)y + *xc + carry;
872 carry = z >> 32;
873 *xc++ = (ULong) z & FFFFFFFF;
875 while(x < xae);
876 *xc = (ULong) carry;
879 #else
880 #ifdef Pack_32
881 for(; xb < xbe; xb++, xc0++) {
882 if (y = *xb & 0xffff) {
883 x = xa;
884 xc = xc0;
885 carry = 0;
886 do {
887 z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
888 carry = z >> 16;
889 z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
890 carry = z2 >> 16;
891 Storeinc(xc, z2, z);
893 while(x < xae);
894 *xc = carry;
896 if (y = *xb >> 16) {
897 x = xa;
898 xc = xc0;
899 carry = 0;
900 z2 = *xc;
901 do {
902 z = (*x & 0xffff) * y + (*xc >> 16) + carry;
903 carry = z >> 16;
904 Storeinc(xc, z, z2);
905 z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
906 carry = z2 >> 16;
908 while(x < xae);
909 *xc = z2;
912 #else
913 for(; xb < xbe; xc0++) {
914 if (y = *xb++) {
915 x = xa;
916 xc = xc0;
917 carry = 0;
918 do {
919 z = *x++ * y + *xc + carry;
920 carry = z >> 16;
921 *xc++ = z & 0xffff;
923 while(x < xae);
924 *xc = carry;
927 #endif
928 #endif
929 for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
930 c->wds = wc;
931 return c;
934 static Bigint *
935 pow5mult
936 #ifdef KR_headers
937 (STATE_PARAM b, k) STATE_PARAM_DECL Bigint *b; int k;
938 #else
939 (STATE_PARAM Bigint *b, int k)
940 #endif
942 Bigint *b1, *p5, *p51;
943 int i;
944 static CONST int p05[3] = { 5, 25, 125 };
946 if ((i = k & 3))
947 b = multadd(PASS_STATE b, p05[i-1], 0);
949 if (!(k >>= 2))
950 return b;
951 if (!(p5 = GET_STATE(p5s))) {
952 /* first time */
953 #ifdef MULTIPLE_THREADS
954 ACQUIRE_DTOA_LOCK(1);
955 if (!(p5 = p5s)) {
956 p5 = p5s = i2b(625);
957 p5->next = 0;
959 FREE_DTOA_LOCK(1);
960 #else
961 p5 = GET_STATE(p5s) = i2b(PASS_STATE 625);
962 p5->next = 0;
963 #endif
965 for(;;) {
966 if (k & 1) {
967 b1 = mult(PASS_STATE b, p5);
968 Bfree(PASS_STATE b);
969 b = b1;
971 if (!(k >>= 1))
972 break;
973 if (!(p51 = p5->next)) {
974 #ifdef MULTIPLE_THREADS
975 ACQUIRE_DTOA_LOCK(1);
976 if (!(p51 = p5->next)) {
977 p51 = p5->next = mult(p5,p5);
978 p51->next = 0;
980 FREE_DTOA_LOCK(1);
981 #else
982 p51 = p5->next = mult(PASS_STATE p5,p5);
983 p51->next = 0;
984 #endif
986 p5 = p51;
988 return b;
991 static Bigint *
992 lshift
993 #ifdef KR_headers
994 (STATE_PARAM b, k) STATE_PARAM_DECL Bigint *b; int k;
995 #else
996 (STATE_PARAM Bigint *b, int k)
997 #endif
999 int i, k1, n, n1;
1000 Bigint *b1;
1001 ULong *x, *x1, *xe, z;
1003 #ifdef Pack_32
1004 n = k >> 5;
1005 #else
1006 n = k >> 4;
1007 #endif
1008 k1 = b->k;
1009 n1 = n + b->wds + 1;
1010 for(i = b->maxwds; n1 > i; i <<= 1)
1011 k1++;
1012 b1 = Balloc(PASS_STATE k1);
1013 x1 = b1->x;
1014 for(i = 0; i < n; i++)
1015 *x1++ = 0;
1016 x = b->x;
1017 xe = x + b->wds;
1018 #ifdef Pack_32
1019 if (k &= 0x1f) {
1020 k1 = 32 - k;
1021 z = 0;
1022 do {
1023 *x1++ = *x << k | z;
1024 z = *x++ >> k1;
1026 while(x < xe);
1027 if ((*x1 = z))
1028 ++n1;
1030 #else
1031 if (k &= 0xf) {
1032 k1 = 16 - k;
1033 z = 0;
1034 do {
1035 *x1++ = *x << k & 0xffff | z;
1036 z = *x++ >> k1;
1038 while(x < xe);
1039 if (*x1 = z)
1040 ++n1;
1042 #endif
1043 else do
1044 *x1++ = *x++;
1045 while(x < xe);
1046 b1->wds = n1 - 1;
1047 Bfree(PASS_STATE b);
1048 return b1;
1051 static int
1053 #ifdef KR_headers
1054 (a, b) Bigint *a, *b;
1055 #else
1056 (Bigint *a, Bigint *b)
1057 #endif
1059 ULong *xa, *xa0, *xb, *xb0;
1060 int i, j;
1062 i = a->wds;
1063 j = b->wds;
1064 #ifdef DEBUG
1065 if (i > 1 && !a->x[i-1])
1066 Bug("cmp called with a->x[a->wds-1] == 0");
1067 if (j > 1 && !b->x[j-1])
1068 Bug("cmp called with b->x[b->wds-1] == 0");
1069 #endif
1070 if (i -= j)
1071 return i;
1072 xa0 = a->x;
1073 xa = xa0 + j;
1074 xb0 = b->x;
1075 xb = xb0 + j;
1076 for(;;) {
1077 if (*--xa != *--xb)
1078 return *xa < *xb ? -1 : 1;
1079 if (xa <= xa0)
1080 break;
1082 return 0;
1085 static Bigint *
1086 diff
1087 #ifdef KR_headers
1088 (STATE_PARAM a, b) STATE_PARAM_DECL Bigint *a, *b;
1089 #else
1090 (STATE_PARAM Bigint *a, Bigint *b)
1091 #endif
1093 Bigint *c;
1094 int i, wa, wb;
1095 ULong *xa, *xae, *xb, *xbe, *xc;
1096 #ifdef ULLong
1097 ULLong borrow, y;
1098 #else
1099 ULong borrow, y;
1100 #ifdef Pack_32
1101 ULong z;
1102 #endif
1103 #endif
1105 i = cmp(a,b);
1106 if (!i) {
1107 c = Balloc(PASS_STATE 0);
1108 c->wds = 1;
1109 c->x[0] = 0;
1110 return c;
1112 if (i < 0) {
1113 c = a;
1114 a = b;
1115 b = c;
1116 i = 1;
1118 else
1119 i = 0;
1120 c = Balloc(PASS_STATE a->k);
1121 c->sign = i;
1122 wa = a->wds;
1123 xa = a->x;
1124 xae = xa + wa;
1125 wb = b->wds;
1126 xb = b->x;
1127 xbe = xb + wb;
1128 xc = c->x;
1129 borrow = 0;
1130 #ifdef ULLong
1131 do {
1132 y = (ULLong)*xa++ - *xb++ - borrow;
1133 borrow = y >> 32 & (ULong)1;
1134 *xc++ = (ULong) y & FFFFFFFF;
1136 while(xb < xbe);
1137 while(xa < xae) {
1138 y = *xa++ - borrow;
1139 borrow = y >> 32 & (ULong)1;
1140 *xc++ = (ULong) y & FFFFFFFF;
1142 #else
1143 #ifdef Pack_32
1144 do {
1145 y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
1146 borrow = (y & 0x10000) >> 16;
1147 z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
1148 borrow = (z & 0x10000) >> 16;
1149 Storeinc(xc, z, y);
1151 while(xb < xbe);
1152 while(xa < xae) {
1153 y = (*xa & 0xffff) - borrow;
1154 borrow = (y & 0x10000) >> 16;
1155 z = (*xa++ >> 16) - borrow;
1156 borrow = (z & 0x10000) >> 16;
1157 Storeinc(xc, z, y);
1159 #else
1160 do {
1161 y = *xa++ - *xb++ - borrow;
1162 borrow = (y & 0x10000) >> 16;
1163 *xc++ = y & 0xffff;
1165 while(xb < xbe);
1166 while(xa < xae) {
1167 y = *xa++ - borrow;
1168 borrow = (y & 0x10000) >> 16;
1169 *xc++ = y & 0xffff;
1171 #endif
1172 #endif
1173 while(!*--xc)
1174 wa--;
1175 c->wds = wa;
1176 return c;
1179 static double
1181 #ifdef KR_headers
1182 (x) U x;
1183 #else
1184 (U x)
1185 #endif
1187 register Long L;
1188 U a;
1190 L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
1191 #ifndef Avoid_Underflow
1192 #ifndef Sudden_Underflow
1193 if (L > 0) {
1194 #endif
1195 #endif
1196 #ifdef IBM
1197 L |= Exp_msk1 >> 4;
1198 #endif
1199 word0(a) = L;
1200 word1(a) = 0;
1201 #ifndef Avoid_Underflow
1202 #ifndef Sudden_Underflow
1204 else {
1205 L = -L >> Exp_shift;
1206 if (L < Exp_shift) {
1207 word0(a) = 0x80000 >> L;
1208 word1(a) = 0;
1210 else {
1211 word0(a) = 0;
1212 L -= Exp_shift;
1213 word1(a) = L >= 31 ? 1 : 1 << 31 - L;
1216 #endif
1217 #endif
1218 return dval(a);
1221 static double
1223 #ifdef KR_headers
1224 (a, e) Bigint *a; int *e;
1225 #else
1226 (Bigint *a, int *e)
1227 #endif
1229 ULong *xa, *xa0, w, y, z;
1230 int k;
1231 U d;
1232 #ifdef VAX
1233 ULong d0, d1;
1234 #else
1235 #define d0 word0(d)
1236 #define d1 word1(d)
1237 #endif
1239 xa0 = a->x;
1240 xa = xa0 + a->wds;
1241 y = *--xa;
1242 #ifdef DEBUG
1243 if (!y) Bug("zero y in b2d");
1244 #endif
1245 k = hi0bits(y);
1246 *e = 32 - k;
1247 #ifdef Pack_32
1248 if (k < Ebits) {
1249 d0 = Exp_1 | y >> (Ebits - k);
1250 w = xa > xa0 ? *--xa : 0;
1251 d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
1252 goto ret_d;
1254 z = xa > xa0 ? *--xa : 0;
1255 if (k -= Ebits) {
1256 d0 = Exp_1 | y << k | z >> (32 - k);
1257 y = xa > xa0 ? *--xa : 0;
1258 d1 = z << k | y >> (32 - k);
1260 else {
1261 d0 = Exp_1 | y;
1262 d1 = z;
1264 #else
1265 if (k < Ebits + 16) {
1266 z = xa > xa0 ? *--xa : 0;
1267 d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;
1268 w = xa > xa0 ? *--xa : 0;
1269 y = xa > xa0 ? *--xa : 0;
1270 d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;
1271 goto ret_d;
1273 z = xa > xa0 ? *--xa : 0;
1274 w = xa > xa0 ? *--xa : 0;
1275 k -= Ebits + 16;
1276 d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;
1277 y = xa > xa0 ? *--xa : 0;
1278 d1 = w << k + 16 | y << k;
1279 #endif
1280 ret_d:
1281 #ifdef VAX
1282 word0(d) = d0 >> 16 | d0 << 16;
1283 word1(d) = d1 >> 16 | d1 << 16;
1284 #else
1285 #undef d0
1286 #undef d1
1287 #endif
1288 return dval(d);
1291 static Bigint *
1293 #ifdef KR_headers
1294 (STATE_PARAM d, e, bits) STATE_PARAM_DECL U d; int *e, *bits;
1295 #else
1296 (STATE_PARAM U d, int *e, int *bits)
1297 #endif
1299 Bigint *b;
1300 int de, k;
1301 ULong *x, y, z;
1302 #ifndef Sudden_Underflow
1303 int i;
1304 #endif
1305 #ifdef VAX
1306 ULong d0, d1;
1307 d0 = word0(d) >> 16 | word0(d) << 16;
1308 d1 = word1(d) >> 16 | word1(d) << 16;
1309 #else
1310 #define d0 word0(d)
1311 #define d1 word1(d)
1312 #endif
1314 #ifdef Pack_32
1315 b = Balloc(PASS_STATE 1);
1316 #else
1317 b = Balloc(PASS_STATE 2);
1318 #endif
1319 x = b->x;
1321 z = d0 & Frac_mask;
1322 d0 &= 0x7fffffff; /* clear sign bit, which we ignore */
1323 #ifdef Sudden_Underflow
1324 de = (int)(d0 >> Exp_shift);
1325 #ifndef IBM
1326 z |= Exp_msk11;
1327 #endif
1328 #else
1329 if ((de = (int)(d0 >> Exp_shift)))
1330 z |= Exp_msk1;
1331 #endif
1332 #ifdef Pack_32
1333 if ((y = d1)) {
1334 if ((k = lo0bits(&y))) {
1335 x[0] = y | z << (32 - k);
1336 z >>= k;
1338 else
1339 x[0] = y;
1340 #ifndef Sudden_Underflow
1342 #endif
1343 b->wds = (x[1] = z) ? 2 : 1;
1345 else {
1346 k = lo0bits(&z);
1347 x[0] = z;
1348 #ifndef Sudden_Underflow
1350 #endif
1351 b->wds = 1;
1352 k += 32;
1354 #else
1355 if (y = d1) {
1356 if (k = lo0bits(&y))
1357 if (k >= 16) {
1358 x[0] = y | z << 32 - k & 0xffff;
1359 x[1] = z >> k - 16 & 0xffff;
1360 x[2] = z >> k;
1361 i = 2;
1363 else {
1364 x[0] = y & 0xffff;
1365 x[1] = y >> 16 | z << 16 - k & 0xffff;
1366 x[2] = z >> k & 0xffff;
1367 x[3] = z >> k+16;
1368 i = 3;
1370 else {
1371 x[0] = y & 0xffff;
1372 x[1] = y >> 16;
1373 x[2] = z & 0xffff;
1374 x[3] = z >> 16;
1375 i = 3;
1378 else {
1379 #ifdef DEBUG
1380 if (!z)
1381 Bug("Zero passed to d2b");
1382 #endif
1383 k = lo0bits(&z);
1384 if (k >= 16) {
1385 x[0] = z;
1386 i = 0;
1388 else {
1389 x[0] = z & 0xffff;
1390 x[1] = z >> 16;
1391 i = 1;
1393 k += 32;
1395 while(!x[i])
1396 --i;
1397 b->wds = i + 1;
1398 #endif
1399 #ifndef Sudden_Underflow
1400 if (de) {
1401 #endif
1402 #ifdef IBM
1403 *e = (de - Bias - (P-1) << 2) + k;
1404 *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);
1405 #else
1406 *e = de - Bias - (P-1) + k;
1407 *bits = P - k;
1408 #endif
1409 #ifndef Sudden_Underflow
1411 else {
1412 *e = de - Bias - (P-1) + 1 + k;
1413 #ifdef Pack_32
1414 *bits = 32*i - hi0bits(x[i-1]);
1415 #else
1416 *bits = (i+2)*16 - hi0bits(x[i]);
1417 #endif
1419 #endif
1420 return b;
1422 #undef d0
1423 #undef d1
1425 static double
1426 ratio
1427 #ifdef KR_headers
1428 (a, b) Bigint *a, *b;
1429 #else
1430 (Bigint *a, Bigint *b)
1431 #endif
1433 U da, db;
1434 int k, ka, kb;
1436 dval(da) = b2d(a, &ka);
1437 dval(db) = b2d(b, &kb);
1438 #ifdef Pack_32
1439 k = ka - kb + 32*(a->wds - b->wds);
1440 #else
1441 k = ka - kb + 16*(a->wds - b->wds);
1442 #endif
1443 #ifdef IBM
1444 if (k > 0) {
1445 word0(da) += (k >> 2)*Exp_msk1;
1446 if (k &= 3)
1447 dval(da) *= 1 << k;
1449 else {
1450 k = -k;
1451 word0(db) += (k >> 2)*Exp_msk1;
1452 if (k &= 3)
1453 dval(db) *= 1 << k;
1455 #else
1456 if (k > 0)
1457 word0(da) += k*Exp_msk1;
1458 else {
1459 k = -k;
1460 word0(db) += k*Exp_msk1;
1462 #endif
1463 return dval(da) / dval(db);
1466 static CONST double
1467 tens[] = {
1468 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1469 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1470 1e20, 1e21, 1e22
1471 #ifdef VAX
1472 , 1e23, 1e24
1473 #endif
1476 static CONST double
1477 #ifdef IEEE_Arith
1478 bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
1479 static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
1480 #ifdef Avoid_Underflow
1481 9007199254740992.*9007199254740992.e-256
1482 /* = 2^106 * 1e-53 */
1483 #else
1484 1e-256
1485 #endif
1487 /* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */
1488 /* flag unnecessarily. It leads to a song and dance at the end of strtod. */
1489 #define Scale_Bit 0x10
1490 #define n_bigtens 5
1491 #else
1492 #ifdef IBM
1493 bigtens[] = { 1e16, 1e32, 1e64 };
1494 static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 };
1495 #define n_bigtens 3
1496 #else
1497 bigtens[] = { 1e16, 1e32 };
1498 static CONST double tinytens[] = { 1e-16, 1e-32 };
1499 #define n_bigtens 2
1500 #endif
1501 #endif
1503 #ifdef INFNAN_CHECK
1505 #ifndef NAN_WORD0
1506 #define NAN_WORD0 0x7ff80000
1507 #endif
1509 #ifndef NAN_WORD1
1510 #define NAN_WORD1 0
1511 #endif
1513 static int
1514 match
1515 #ifdef KR_headers
1516 (sp, t) char **sp, *t;
1517 #else
1518 (CONST char **sp, CONST char *t)
1519 #endif
1521 int c, d;
1522 CONST char *s = *sp;
1524 while((d = *t++)) {
1525 if ((c = *++s) >= 'A' && c <= 'Z')
1526 c += 'a' - 'A';
1527 if (c != d)
1528 return 0;
1530 *sp = s + 1;
1531 return 1;
1534 #ifndef No_Hex_NaN
1535 static void
1536 hexnan
1537 #ifdef KR_headers
1538 (rvp, sp) U *rvp; CONST char **sp;
1539 #else
1540 (U *rvp, CONST char **sp)
1541 #endif
1543 ULong c, x[2];
1544 CONST char *s;
1545 int havedig, udx0, xshift;
1547 x[0] = x[1] = 0;
1548 havedig = xshift = 0;
1549 udx0 = 1;
1550 s = *sp;
1551 /* allow optional initial 0x or 0X */
1552 while((c = *(CONST unsigned char*)(s+1)) && c <= ' ')
1553 ++s;
1554 if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X'))
1555 s += 2;
1556 while((c = *(CONST unsigned char*)++s)) {
1557 if (c >= '0' && c <= '9')
1558 c -= '0';
1559 else if (c >= 'a' && c <= 'f')
1560 c += 10 - 'a';
1561 else if (c >= 'A' && c <= 'F')
1562 c += 10 - 'A';
1563 else if (c <= ' ') {
1564 if (udx0 && havedig) {
1565 udx0 = 0;
1566 xshift = 1;
1568 continue;
1570 #ifdef GDTOA_NON_PEDANTIC_NANCHECK
1571 else if (/*(*/ c == ')' && havedig) {
1572 *sp = s + 1;
1573 break;
1575 else
1576 return; /* invalid form: don't change *sp */
1577 #else
1578 else {
1579 do {
1580 if (/*(*/ c == ')') {
1581 *sp = s + 1;
1582 break;
1584 } while((c = *++s));
1585 break;
1587 #endif
1588 havedig = 1;
1589 if (xshift) {
1590 xshift = 0;
1591 x[0] = x[1];
1592 x[1] = 0;
1594 if (udx0)
1595 x[0] = (x[0] << 4) | (x[1] >> 28);
1596 x[1] = (x[1] << 4) | c;
1598 if ((x[0] &= 0xfffff) || x[1]) {
1599 word0(*rvp) = Exp_mask | x[0];
1600 word1(*rvp) = x[1];
1603 #endif /*No_Hex_NaN*/
1604 #endif /* INFNAN_CHECK */
1606 static double
1607 _strtod
1608 #ifdef KR_headers
1609 (STATE_PARAM s00, se) STATE_PARAM_DECL CONST char *s00; char **se;
1610 #else
1611 (STATE_PARAM CONST char *s00, char **se)
1612 #endif
1614 #ifdef Avoid_Underflow
1615 int scale;
1616 #endif
1617 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
1618 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
1619 CONST char *s, *s0, *s1;
1620 double aadj, adj;
1621 U aadj1, rv, rv0;
1622 Long L;
1623 ULong y, z;
1624 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
1625 #ifdef SET_INEXACT
1626 int inexact, oldinexact;
1627 #endif
1628 #ifdef Honor_FLT_ROUNDS
1629 int rounding;
1630 #endif
1631 #ifdef USE_LOCALE
1632 CONST char *s2;
1633 #endif
1635 #ifdef __GNUC__
1636 delta = bb = bd = bs = 0;
1637 #endif
1639 sign = nz0 = nz = 0;
1640 dval(rv) = 0.;
1641 for(s = s00;;s++) switch(*s) {
1642 case '-':
1643 sign = 1;
1644 /* no break */
1645 case '+':
1646 if (*++s)
1647 goto break2;
1648 /* no break */
1649 case 0:
1650 goto ret0;
1651 case '\t':
1652 case '\n':
1653 case '\v':
1654 case '\f':
1655 case '\r':
1656 case ' ':
1657 continue;
1658 default:
1659 goto break2;
1661 break2:
1662 if (*s == '0') {
1663 nz0 = 1;
1664 while(*++s == '0') ;
1665 if (!*s)
1666 goto ret;
1668 s0 = s;
1669 y = z = 0;
1670 for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
1671 if (nd < 9)
1672 y = 10*y + c - '0';
1673 else if (nd < 16)
1674 z = 10*z + c - '0';
1675 nd0 = nd;
1676 #ifdef USE_LOCALE
1677 s1 = localeconv()->decimal_point;
1678 if (c == *s1) {
1679 c = '.';
1680 if (*++s1) {
1681 s2 = s;
1682 for(;;) {
1683 if (*++s2 != *s1) {
1684 c = 0;
1685 break;
1687 if (!*++s1) {
1688 s = s2;
1689 break;
1694 #endif
1695 if (c == '.') {
1696 c = *++s;
1697 if (!nd) {
1698 for(; c == '0'; c = *++s)
1699 nz++;
1700 if (c > '0' && c <= '9') {
1701 s0 = s;
1702 nf += nz;
1703 nz = 0;
1704 goto have_dig;
1706 goto dig_done;
1708 for(; c >= '0' && c <= '9'; c = *++s) {
1709 have_dig:
1710 nz++;
1711 if (c -= '0') {
1712 nf += nz;
1713 for(i = 1; i < nz; i++)
1714 if (nd++ < 9)
1715 y *= 10;
1716 else if (nd <= DBL_DIG + 1)
1717 z *= 10;
1718 if (nd++ < 9)
1719 y = 10*y + c;
1720 else if (nd <= DBL_DIG + 1)
1721 z = 10*z + c;
1722 nz = 0;
1726 dig_done:
1727 e = 0;
1728 if (c == 'e' || c == 'E') {
1729 if (!nd && !nz && !nz0) {
1730 goto ret0;
1732 s00 = s;
1733 esign = 0;
1734 switch(c = *++s) {
1735 case '-':
1736 esign = 1;
1737 case '+':
1738 c = *++s;
1740 if (c >= '0' && c <= '9') {
1741 while(c == '0')
1742 c = *++s;
1743 if (c > '0' && c <= '9') {
1744 L = c - '0';
1745 s1 = s;
1746 while((c = *++s) >= '0' && c <= '9')
1747 L = 10*L + c - '0';
1748 if (s - s1 > 8 || L > 19999)
1749 /* Avoid confusion from exponents
1750 * so large that e might overflow.
1752 e = 19999; /* safe for 16 bit ints */
1753 else
1754 e = (int)L;
1755 if (esign)
1756 e = -e;
1758 else
1759 e = 0;
1761 else
1762 s = s00;
1764 if (!nd) {
1765 if (!nz && !nz0) {
1766 #ifdef INFNAN_CHECK
1767 /* Check for Nan and Infinity */
1768 switch(c) {
1769 case 'i':
1770 case 'I':
1771 if (match(&s,"nf")) {
1772 --s;
1773 if (!match(&s,"inity"))
1774 ++s;
1775 word0(rv) = 0x7ff00000;
1776 word1(rv) = 0;
1777 goto ret;
1779 break;
1780 case 'n':
1781 case 'N':
1782 if (match(&s, "an")) {
1783 word0(rv) = NAN_WORD0;
1784 word1(rv) = NAN_WORD1;
1785 #ifndef No_Hex_NaN
1786 if (*s == '(') /*)*/
1787 hexnan(&rv, &s);
1788 #endif
1789 goto ret;
1792 #endif /* INFNAN_CHECK */
1793 ret0:
1794 s = s00;
1795 sign = 0;
1797 goto ret;
1799 e1 = e -= nf;
1801 /* Now we have nd0 digits, starting at s0, followed by a
1802 * decimal point, followed by nd-nd0 digits. The number we're
1803 * after is the integer represented by those digits times
1804 * 10**e */
1806 if (!nd0)
1807 nd0 = nd;
1808 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
1809 dval(rv) = y;
1810 if (k > 9) {
1811 #ifdef SET_INEXACT
1812 if (k > DBL_DIG)
1813 oldinexact = get_inexact();
1814 #endif
1815 dval(rv) = tens[k - 9] * dval(rv) + z;
1817 bd0 = 0;
1818 if (nd <= DBL_DIG
1819 #ifndef RND_PRODQUOT
1820 #ifndef Honor_FLT_ROUNDS
1821 && Flt_Rounds == 1
1822 #endif
1823 #endif
1825 if (!e)
1826 goto ret;
1827 if (e > 0) {
1828 if (e <= Ten_pmax) {
1829 #ifdef VAX
1830 goto vax_ovfl_check;
1831 #else
1832 #ifdef Honor_FLT_ROUNDS
1833 /* round correctly FLT_ROUNDS = 2 or 3 */
1834 if (sign) {
1835 rv = -rv;
1836 sign = 0;
1838 #endif
1839 /* rv = */ rounded_product(dval(rv), tens[e]);
1840 goto ret;
1841 #endif
1843 i = DBL_DIG - nd;
1844 if (e <= Ten_pmax + i) {
1845 /* A fancier test would sometimes let us do
1846 * this for larger i values.
1848 #ifdef Honor_FLT_ROUNDS
1849 /* round correctly FLT_ROUNDS = 2 or 3 */
1850 if (sign) {
1851 rv = -rv;
1852 sign = 0;
1854 #endif
1855 e -= i;
1856 dval(rv) *= tens[i];
1857 #ifdef VAX
1858 /* VAX exponent range is so narrow we must
1859 * worry about overflow here...
1861 vax_ovfl_check:
1862 word0(rv) -= P*Exp_msk1;
1863 /* rv = */ rounded_product(dval(rv), tens[e]);
1864 if ((word0(rv) & Exp_mask)
1865 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
1866 goto ovfl;
1867 word0(rv) += P*Exp_msk1;
1868 #else
1869 /* rv = */ rounded_product(dval(rv), tens[e]);
1870 #endif
1871 goto ret;
1874 #ifndef Inaccurate_Divide
1875 else if (e >= -Ten_pmax) {
1876 #ifdef Honor_FLT_ROUNDS
1877 /* round correctly FLT_ROUNDS = 2 or 3 */
1878 if (sign) {
1879 rv = -rv;
1880 sign = 0;
1882 #endif
1883 /* rv = */ rounded_quotient(dval(rv), tens[-e]);
1884 goto ret;
1886 #endif
1888 e1 += nd - k;
1890 #ifdef IEEE_Arith
1891 #ifdef SET_INEXACT
1892 inexact = 1;
1893 if (k <= DBL_DIG)
1894 oldinexact = get_inexact();
1895 #endif
1896 #ifdef Avoid_Underflow
1897 scale = 0;
1898 #endif
1899 #ifdef Honor_FLT_ROUNDS
1900 if ((rounding = Flt_Rounds) >= 2) {
1901 if (sign)
1902 rounding = rounding == 2 ? 0 : 2;
1903 else
1904 if (rounding != 2)
1905 rounding = 0;
1907 #endif
1908 #endif /*IEEE_Arith*/
1910 /* Get starting approximation = rv * 10**e1 */
1912 if (e1 > 0) {
1913 if ((i = e1 & 15))
1914 dval(rv) *= tens[i];
1915 if (e1 &= ~15) {
1916 if (e1 > DBL_MAX_10_EXP) {
1917 ovfl:
1918 #ifndef NO_ERRNO
1919 errno = ERANGE;
1920 #endif
1921 /* Can't trust HUGE_VAL */
1922 #ifdef IEEE_Arith
1923 #ifdef Honor_FLT_ROUNDS
1924 switch(rounding) {
1925 case 0: /* toward 0 */
1926 case 3: /* toward -infinity */
1927 word0(rv) = Big0;
1928 word1(rv) = Big1;
1929 break;
1930 default:
1931 word0(rv) = Exp_mask;
1932 word1(rv) = 0;
1934 #else /*Honor_FLT_ROUNDS*/
1935 word0(rv) = Exp_mask;
1936 word1(rv) = 0;
1937 #endif /*Honor_FLT_ROUNDS*/
1938 #ifdef SET_INEXACT
1939 /* set overflow bit */
1940 dval(rv0) = 1e300;
1941 dval(rv0) *= dval(rv0);
1942 #endif
1943 #else /*IEEE_Arith*/
1944 word0(rv) = Big0;
1945 word1(rv) = Big1;
1946 #endif /*IEEE_Arith*/
1947 if (bd0)
1948 goto retfree;
1949 goto ret;
1951 e1 >>= 4;
1952 for(j = 0; e1 > 1; j++, e1 >>= 1)
1953 if (e1 & 1)
1954 dval(rv) *= bigtens[j];
1955 /* The last multiplication could overflow. */
1956 word0(rv) -= P*Exp_msk1;
1957 dval(rv) *= bigtens[j];
1958 if ((z = word0(rv) & Exp_mask)
1959 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
1960 goto ovfl;
1961 if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
1962 /* set to largest number */
1963 /* (Can't trust DBL_MAX) */
1964 word0(rv) = Big0;
1965 word1(rv) = Big1;
1967 else
1968 word0(rv) += P*Exp_msk1;
1971 else if (e1 < 0) {
1972 e1 = -e1;
1973 if ((i = e1 & 15))
1974 dval(rv) /= tens[i];
1975 if (e1 >>= 4) {
1976 if (e1 >= 1 << n_bigtens)
1977 goto undfl;
1978 #ifdef Avoid_Underflow
1979 if (e1 & Scale_Bit)
1980 scale = 2*P;
1981 for(j = 0; e1 > 0; j++, e1 >>= 1)
1982 if (e1 & 1)
1983 dval(rv) *= tinytens[j];
1984 if (scale && (j = 2*P + 1 - ((word0(rv) & Exp_mask)
1985 >> Exp_shift)) > 0) {
1986 /* scaled rv is denormal; zap j low bits */
1987 if (j >= 32) {
1988 word1(rv) = 0;
1989 if (j >= 53)
1990 word0(rv) = (P+2)*Exp_msk1;
1991 else
1992 word0(rv) &= 0xffffffff << (j-32);
1994 else
1995 word1(rv) &= 0xffffffff << j;
1997 #else
1998 for(j = 0; e1 > 1; j++, e1 >>= 1)
1999 if (e1 & 1)
2000 dval(rv) *= tinytens[j];
2001 /* The last multiplication could underflow. */
2002 dval(rv0) = dval(rv);
2003 dval(rv) *= tinytens[j];
2004 if (!dval(rv)) {
2005 dval(rv) = 2.*dval(rv0);
2006 dval(rv) *= tinytens[j];
2007 #endif
2008 if (!dval(rv)) {
2009 undfl:
2010 dval(rv) = 0.;
2011 #ifndef NO_ERRNO
2012 errno = ERANGE;
2013 #endif
2014 if (bd0)
2015 goto retfree;
2016 goto ret;
2018 #ifndef Avoid_Underflow
2019 word0(rv) = Tiny0;
2020 word1(rv) = Tiny1;
2021 /* The refinement below will clean
2022 * this approximation up.
2025 #endif
2029 /* Now the hard part -- adjusting rv to the correct value.*/
2031 /* Put digits into bd: true value = bd * 10^e */
2033 bd0 = s2b(PASS_STATE s0, nd0, nd, y);
2035 for(;;) {
2036 bd = Balloc(PASS_STATE bd0->k);
2037 Bcopy(bd, bd0);
2038 bb = d2b(PASS_STATE rv, &bbe, &bbbits); /* rv = bb * 2^bbe */
2039 bs = i2b(PASS_STATE 1);
2041 if (e >= 0) {
2042 bb2 = bb5 = 0;
2043 bd2 = bd5 = e;
2045 else {
2046 bb2 = bb5 = -e;
2047 bd2 = bd5 = 0;
2049 if (bbe >= 0)
2050 bb2 += bbe;
2051 else
2052 bd2 -= bbe;
2053 bs2 = bb2;
2054 #ifdef Honor_FLT_ROUNDS
2055 if (rounding != 1)
2056 bs2++;
2057 #endif
2058 #ifdef Avoid_Underflow
2059 j = bbe - scale;
2060 i = j + bbbits - 1; /* logb(rv) */
2061 if (i < Emin) /* denormal */
2062 j += P - Emin;
2063 else
2064 j = P + 1 - bbbits;
2065 #else /*Avoid_Underflow*/
2066 #ifdef Sudden_Underflow
2067 #ifdef IBM
2068 j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
2069 #else
2070 j = P + 1 - bbbits;
2071 #endif
2072 #else /*Sudden_Underflow*/
2073 j = bbe;
2074 i = j + bbbits - 1; /* logb(rv) */
2075 if (i < Emin) /* denormal */
2076 j += P - Emin;
2077 else
2078 j = P + 1 - bbbits;
2079 #endif /*Sudden_Underflow*/
2080 #endif /*Avoid_Underflow*/
2081 bb2 += j;
2082 bd2 += j;
2083 #ifdef Avoid_Underflow
2084 bd2 += scale;
2085 #endif
2086 i = bb2 < bd2 ? bb2 : bd2;
2087 if (i > bs2)
2088 i = bs2;
2089 if (i > 0) {
2090 bb2 -= i;
2091 bd2 -= i;
2092 bs2 -= i;
2094 if (bb5 > 0) {
2095 bs = pow5mult(PASS_STATE bs, bb5);
2096 bb1 = mult(PASS_STATE bs, bb);
2097 Bfree(PASS_STATE bb);
2098 bb = bb1;
2100 if (bb2 > 0)
2101 bb = lshift(PASS_STATE bb, bb2);
2102 if (bd5 > 0)
2103 bd = pow5mult(PASS_STATE bd, bd5);
2104 if (bd2 > 0)
2105 bd = lshift(PASS_STATE bd, bd2);
2106 if (bs2 > 0)
2107 bs = lshift(PASS_STATE bs, bs2);
2108 delta = diff(PASS_STATE bb, bd);
2109 dsign = delta->sign;
2110 delta->sign = 0;
2111 i = cmp(delta, bs);
2112 #ifdef Honor_FLT_ROUNDS
2113 if (rounding != 1) {
2114 if (i < 0) {
2115 /* Error is less than an ulp */
2116 if (!delta->x[0] && delta->wds <= 1) {
2117 /* exact */
2118 #ifdef SET_INEXACT
2119 inexact = 0;
2120 #endif
2121 break;
2123 if (rounding) {
2124 if (dsign) {
2125 adj = 1.;
2126 goto apply_adj;
2129 else if (!dsign) {
2130 adj = -1.;
2131 if (!word1(rv)
2132 && !(word0(rv) & Frac_mask)) {
2133 y = word0(rv) & Exp_mask;
2134 #ifdef Avoid_Underflow
2135 if (!scale || y > 2*P*Exp_msk1)
2136 #else
2137 if (y)
2138 #endif
2140 delta = lshift(PASS_STATE delta,Log2P);
2141 if (cmp(delta, bs) <= 0)
2142 adj = -0.5;
2145 apply_adj:
2146 #ifdef Avoid_Underflow
2147 if (scale && (y = word0(rv) & Exp_mask)
2148 <= 2*P*Exp_msk1)
2149 word0(adj) += (2*P+1)*Exp_msk1 - y;
2150 #else
2151 #ifdef Sudden_Underflow
2152 if ((word0(rv) & Exp_mask) <=
2153 P*Exp_msk1) {
2154 word0(rv) += P*Exp_msk1;
2155 dval(rv) += adj*ulp(rv);
2156 word0(rv) -= P*Exp_msk1;
2158 else
2159 #endif /*Sudden_Underflow*/
2160 #endif /*Avoid_Underflow*/
2161 dval(rv) += adj*ulp(rv);
2163 break;
2165 adj = ratio(delta, bs);
2166 if (adj < 1.)
2167 adj = 1.;
2168 if (adj <= 0x7ffffffe) {
2169 /* adj = rounding ? ceil(adj) : floor(adj); */
2170 y = adj;
2171 if (y != adj) {
2172 if (!((rounding>>1) ^ dsign))
2173 y++;
2174 adj = y;
2177 #ifdef Avoid_Underflow
2178 if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
2179 word0(adj) += (2*P+1)*Exp_msk1 - y;
2180 #else
2181 #ifdef Sudden_Underflow
2182 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
2183 word0(rv) += P*Exp_msk1;
2184 adj *= ulp(rv);
2185 if (dsign)
2186 dval(rv) += adj;
2187 else
2188 dval(rv) -= adj;
2189 word0(rv) -= P*Exp_msk1;
2190 goto cont;
2192 #endif /*Sudden_Underflow*/
2193 #endif /*Avoid_Underflow*/
2194 adj *= ulp(rv);
2195 if (dsign)
2196 dval(rv) += adj;
2197 else
2198 dval(rv) -= adj;
2199 goto cont;
2201 #endif /*Honor_FLT_ROUNDS*/
2203 if (i < 0) {
2204 /* Error is less than half an ulp -- check for
2205 * special case of mantissa a power of two.
2207 if (dsign || word1(rv) || word0(rv) & Bndry_mask
2208 #ifdef IEEE_Arith
2209 #ifdef Avoid_Underflow
2210 || (word0(rv) & Exp_mask) <= (2*P+1)*Exp_msk1
2211 #else
2212 || (word0(rv) & Exp_mask) <= Exp_msk1
2213 #endif
2214 #endif
2216 #ifdef SET_INEXACT
2217 if (!delta->x[0] && delta->wds <= 1)
2218 inexact = 0;
2219 #endif
2220 break;
2222 if (!delta->x[0] && delta->wds <= 1) {
2223 /* exact result */
2224 #ifdef SET_INEXACT
2225 inexact = 0;
2226 #endif
2227 break;
2229 delta = lshift(PASS_STATE delta,Log2P);
2230 if (cmp(delta, bs) > 0)
2231 goto drop_down;
2232 break;
2234 if (i == 0) {
2235 /* exactly half-way between */
2236 if (dsign) {
2237 if ((word0(rv) & Bndry_mask1) == Bndry_mask1
2238 && word1(rv) == (
2239 #ifdef Avoid_Underflow
2240 (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
2241 ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
2242 #endif
2243 0xffffffff)) {
2244 /*boundary case -- increment exponent*/
2245 word0(rv) = (word0(rv) & Exp_mask)
2246 + Exp_msk1
2247 #ifdef IBM
2248 | Exp_msk1 >> 4
2249 #endif
2251 word1(rv) = 0;
2252 #ifdef Avoid_Underflow
2253 dsign = 0;
2254 #endif
2255 break;
2258 else if (!(word0(rv) & Bndry_mask) && !word1(rv)) {
2259 drop_down:
2260 /* boundary case -- decrement exponent */
2261 #ifdef Sudden_Underflow /*{{*/
2262 L = word0(rv) & Exp_mask;
2263 #ifdef IBM
2264 if (L < Exp_msk1)
2265 #else
2266 #ifdef Avoid_Underflow
2267 if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
2268 #else
2269 if (L <= Exp_msk1)
2270 #endif /*Avoid_Underflow*/
2271 #endif /*IBM*/
2272 goto undfl;
2273 L -= Exp_msk1;
2274 #else /*Sudden_Underflow}{*/
2275 #ifdef Avoid_Underflow
2276 if (scale) {
2277 L = word0(rv) & Exp_mask;
2278 if (L <= (2*P+1)*Exp_msk1) {
2279 if (L > (P+2)*Exp_msk1)
2280 /* round even ==> */
2281 /* accept rv */
2282 break;
2283 /* rv = smallest denormal */
2284 goto undfl;
2287 #endif /*Avoid_Underflow*/
2288 L = (word0(rv) & Exp_mask) - Exp_msk1;
2289 #endif /*Sudden_Underflow}}*/
2290 word0(rv) = L | Bndry_mask1;
2291 word1(rv) = 0xffffffff;
2292 #ifdef IBM
2293 goto cont;
2294 #else
2295 break;
2296 #endif
2298 #ifndef ROUND_BIASED
2299 if (!(word1(rv) & LSB))
2300 break;
2301 #endif
2302 if (dsign)
2303 dval(rv) += ulp(rv);
2304 #ifndef ROUND_BIASED
2305 else {
2306 dval(rv) -= ulp(rv);
2307 #ifndef Sudden_Underflow
2308 if (!dval(rv))
2309 goto undfl;
2310 #endif
2312 #ifdef Avoid_Underflow
2313 dsign = 1 - dsign;
2314 #endif
2315 #endif
2316 break;
2318 if ((aadj = ratio(delta, bs)) <= 2.) {
2319 if (dsign)
2320 aadj = dval(aadj1) = 1.;
2321 else if (word1(rv) || word0(rv) & Bndry_mask) {
2322 #ifndef Sudden_Underflow
2323 if (word1(rv) == Tiny1 && !word0(rv))
2324 goto undfl;
2325 #endif
2326 aadj = 1.;
2327 dval(aadj1) = -1.;
2329 else {
2330 /* special case -- power of FLT_RADIX to be */
2331 /* rounded down... */
2333 if (aadj < 2./FLT_RADIX)
2334 aadj = 1./FLT_RADIX;
2335 else
2336 aadj *= 0.5;
2337 dval(aadj1) = -aadj;
2340 else {
2341 aadj *= 0.5;
2342 dval(aadj1) = dsign ? aadj : -aadj;
2343 #ifdef Check_FLT_ROUNDS
2344 switch(Rounding) {
2345 case 2: /* towards +infinity */
2346 dval(aadj1) -= 0.5;
2347 break;
2348 case 0: /* towards 0 */
2349 case 3: /* towards -infinity */
2350 dval(aadj1) += 0.5;
2352 #else
2353 if (Flt_Rounds == 0)
2354 dval(aadj1) += 0.5;
2355 #endif /*Check_FLT_ROUNDS*/
2357 y = word0(rv) & Exp_mask;
2359 /* Check for overflow */
2361 if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
2362 dval(rv0) = dval(rv);
2363 word0(rv) -= P*Exp_msk1;
2364 adj = dval(aadj1) * ulp(rv);
2365 dval(rv) += adj;
2366 if ((word0(rv) & Exp_mask) >=
2367 Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
2368 if (word0(rv0) == Big0 && word1(rv0) == Big1)
2369 goto ovfl;
2370 word0(rv) = Big0;
2371 word1(rv) = Big1;
2372 goto cont;
2374 else
2375 word0(rv) += P*Exp_msk1;
2377 else {
2378 #ifdef Avoid_Underflow
2379 if (scale && y <= 2*P*Exp_msk1) {
2380 if (aadj <= 0x7fffffff) {
2381 if ((z = (ULong) aadj) <= 0)
2382 z = 1;
2383 aadj = z;
2384 dval(aadj1) = dsign ? aadj : -aadj;
2386 word0(aadj1) += (2*P+1)*Exp_msk1 - y;
2388 adj = dval(aadj1) * ulp(rv);
2389 dval(rv) += adj;
2390 #else
2391 #ifdef Sudden_Underflow
2392 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
2393 dval(rv0) = dval(rv);
2394 word0(rv) += P*Exp_msk1;
2395 adj = dval(aadj1) * ulp(rv);
2396 dval(rv) += adj;
2397 #ifdef IBM
2398 if ((word0(rv) & Exp_mask) < P*Exp_msk1)
2399 #else
2400 if ((word0(rv) & Exp_mask) <= P*Exp_msk1)
2401 #endif
2403 if (word0(rv0) == Tiny0
2404 && word1(rv0) == Tiny1)
2405 goto undfl;
2406 word0(rv) = Tiny0;
2407 word1(rv) = Tiny1;
2408 goto cont;
2410 else
2411 word0(rv) -= P*Exp_msk1;
2413 else {
2414 adj = dval(aadj1) * ulp(rv);
2415 dval(rv) += adj;
2417 #else /*Sudden_Underflow*/
2418 /* Compute adj so that the IEEE rounding rules will
2419 * correctly round rv + adj in some half-way cases.
2420 * If rv * ulp(rv) is denormalized (i.e.,
2421 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
2422 * trouble from bits lost to denormalization;
2423 * example: 1.2e-307 .
2425 if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
2426 dval(aadj1) = (double)(int)(aadj + 0.5);
2427 if (!dsign)
2428 dval(aadj1) = -dval(aadj1);
2430 adj = dval(aadj1) * ulp(rv);
2431 dval(rv) += adj;
2432 #endif /*Sudden_Underflow*/
2433 #endif /*Avoid_Underflow*/
2435 z = word0(rv) & Exp_mask;
2436 #ifndef SET_INEXACT
2437 #ifdef Avoid_Underflow
2438 if (!scale)
2439 #endif
2440 if (y == z) {
2441 /* Can we stop now? */
2442 L = (Long)aadj;
2443 aadj -= L;
2444 /* The tolerances below are conservative. */
2445 if (dsign || word1(rv) || word0(rv) & Bndry_mask) {
2446 if (aadj < .4999999 || aadj > .5000001)
2447 break;
2449 else if (aadj < .4999999/FLT_RADIX)
2450 break;
2452 #endif
2453 cont:
2454 Bfree(PASS_STATE bb);
2455 Bfree(PASS_STATE bd);
2456 Bfree(PASS_STATE bs);
2457 Bfree(PASS_STATE delta);
2459 #ifdef SET_INEXACT
2460 if (inexact) {
2461 if (!oldinexact) {
2462 word0(rv0) = Exp_1 + (70 << Exp_shift);
2463 word1(rv0) = 0;
2464 dval(rv0) += 1.;
2467 else if (!oldinexact)
2468 clear_inexact();
2469 #endif
2470 #ifdef Avoid_Underflow
2471 if (scale) {
2472 word0(rv0) = Exp_1 - 2*P*Exp_msk1;
2473 word1(rv0) = 0;
2474 dval(rv) *= dval(rv0);
2475 #ifndef NO_ERRNO
2476 /* try to avoid the bug of testing an 8087 register value */
2477 if (word0(rv) == 0 && word1(rv) == 0)
2478 errno = ERANGE;
2479 #endif
2481 #endif /* Avoid_Underflow */
2482 #ifdef SET_INEXACT
2483 if (inexact && !(word0(rv) & Exp_mask)) {
2484 /* set underflow bit */
2485 dval(rv0) = 1e-300;
2486 dval(rv0) *= dval(rv0);
2488 #endif
2489 retfree:
2490 Bfree(PASS_STATE bb);
2491 Bfree(PASS_STATE bd);
2492 Bfree(PASS_STATE bs);
2493 Bfree(PASS_STATE bd0);
2494 Bfree(PASS_STATE delta);
2495 ret:
2496 if (se)
2497 *se = (char *)s;
2498 return sign ? -dval(rv) : dval(rv);
2501 static int
2502 quorem
2503 #ifdef KR_headers
2504 (b, S) Bigint *b, *S;
2505 #else
2506 (Bigint *b, Bigint *S)
2507 #endif
2509 int n;
2510 ULong *bx, *bxe, q, *sx, *sxe;
2511 #ifdef ULLong
2512 ULLong borrow, carry, y, ys;
2513 #else
2514 ULong borrow, carry, y, ys;
2515 #ifdef Pack_32
2516 ULong si, z, zs;
2517 #endif
2518 #endif
2520 n = S->wds;
2521 #ifdef DEBUG
2522 /*debug*/ if (b->wds > n)
2523 /*debug*/ Bug("oversize b in quorem");
2524 #endif
2525 if (b->wds < n)
2526 return 0;
2527 sx = S->x;
2528 sxe = sx + --n;
2529 bx = b->x;
2530 bxe = bx + n;
2531 q = *bxe / (*sxe + 1); /* ensure q <= true quotient */
2532 #ifdef DEBUG
2533 /*debug*/ if (q > 9)
2534 /*debug*/ Bug("oversized quotient in quorem");
2535 #endif
2536 if (q) {
2537 borrow = 0;
2538 carry = 0;
2539 do {
2540 #ifdef ULLong
2541 ys = *sx++ * (ULLong)q + carry;
2542 carry = ys >> 32;
2543 y = *bx - (ys & FFFFFFFF) - borrow;
2544 borrow = y >> 32 & (ULong)1;
2545 *bx++ = (ULong) y & FFFFFFFF;
2546 #else
2547 #ifdef Pack_32
2548 si = *sx++;
2549 ys = (si & 0xffff) * q + carry;
2550 zs = (si >> 16) * q + (ys >> 16);
2551 carry = zs >> 16;
2552 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2553 borrow = (y & 0x10000) >> 16;
2554 z = (*bx >> 16) - (zs & 0xffff) - borrow;
2555 borrow = (z & 0x10000) >> 16;
2556 Storeinc(bx, z, y);
2557 #else
2558 ys = *sx++ * q + carry;
2559 carry = ys >> 16;
2560 y = *bx - (ys & 0xffff) - borrow;
2561 borrow = (y & 0x10000) >> 16;
2562 *bx++ = y & 0xffff;
2563 #endif
2564 #endif
2566 while(sx <= sxe);
2567 if (!*bxe) {
2568 bx = b->x;
2569 while(--bxe > bx && !*bxe)
2570 --n;
2571 b->wds = n;
2574 if (cmp(b, S) >= 0) {
2575 q++;
2576 borrow = 0;
2577 carry = 0;
2578 bx = b->x;
2579 sx = S->x;
2580 do {
2581 #ifdef ULLong
2582 ys = *sx++ + carry;
2583 carry = ys >> 32;
2584 y = *bx - (ys & FFFFFFFF) - borrow;
2585 borrow = y >> 32 & (ULong)1;
2586 *bx++ = (ULong) y & FFFFFFFF;
2587 #else
2588 #ifdef Pack_32
2589 si = *sx++;
2590 ys = (si & 0xffff) + carry;
2591 zs = (si >> 16) + (ys >> 16);
2592 carry = zs >> 16;
2593 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2594 borrow = (y & 0x10000) >> 16;
2595 z = (*bx >> 16) - (zs & 0xffff) - borrow;
2596 borrow = (z & 0x10000) >> 16;
2597 Storeinc(bx, z, y);
2598 #else
2599 ys = *sx++ + carry;
2600 carry = ys >> 16;
2601 y = *bx - (ys & 0xffff) - borrow;
2602 borrow = (y & 0x10000) >> 16;
2603 *bx++ = y & 0xffff;
2604 #endif
2605 #endif
2607 while(sx <= sxe);
2608 bx = b->x;
2609 bxe = bx + n;
2610 if (!*bxe) {
2611 while(--bxe > bx && !*bxe)
2612 --n;
2613 b->wds = n;
2616 return q;
2619 #if !defined(MULTIPLE_THREADS) && !defined(NO_GLOBAL_STATE)
2620 #define USE_DTOA_RESULT 1
2621 static char *dtoa_result;
2622 #endif
2624 static char *
2625 #ifdef KR_headers
2626 rv_alloc(STATE_PARAM i) STATE_PARAM_DECL int i;
2627 #else
2628 rv_alloc(STATE_PARAM int i)
2629 #endif
2631 int j, k, *r;
2633 j = sizeof(ULong);
2634 for(k = 0;
2635 sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (unsigned) i;
2636 j <<= 1)
2637 k++;
2638 r = (int*)Balloc(PASS_STATE k);
2639 *r = k;
2640 return
2641 #ifdef USE_DTOA_RESULT
2642 dtoa_result =
2643 #endif
2644 (char *)(r+1);
2647 static char *
2648 #ifdef KR_headers
2649 nrv_alloc(STATE_PARAM s, rve, n) STATE_PARAM_DECL char *s, **rve; int n;
2650 #else
2651 nrv_alloc(STATE_PARAM CONST char *s, char **rve, int n)
2652 #endif
2654 char *rv, *t;
2656 t = rv = rv_alloc(PASS_STATE n);
2657 while((*t = *s++)) t++;
2658 if (rve)
2659 *rve = t;
2660 return rv;
2663 /* freedtoa(s) must be used to free values s returned by dtoa
2664 * when MULTIPLE_THREADS is #defined. It should be used in all cases,
2665 * but for consistency with earlier versions of dtoa, it is optional
2666 * when MULTIPLE_THREADS is not defined.
2669 static void
2670 #ifdef KR_headers
2671 freedtoa(STATE_PARAM s) STATE_PARAM_DECL char *s;
2672 #else
2673 freedtoa(STATE_PARAM char *s)
2674 #endif
2676 Bigint *b = (Bigint *)((int *)s - 1);
2677 b->maxwds = 1 << (b->k = *(int*)b);
2678 Bfree(PASS_STATE b);
2679 #ifdef USE_DTOA_RESULT
2680 if (s == dtoa_result)
2681 dtoa_result = 0;
2682 #endif
2685 /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
2687 * Inspired by "How to Print Floating-Point Numbers Accurately" by
2688 * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
2690 * Modifications:
2691 * 1. Rather than iterating, we use a simple numeric overestimate
2692 * to determine k = floor(log10(d)). We scale relevant
2693 * quantities using O(log2(k)) rather than O(k) multiplications.
2694 * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
2695 * try to generate digits strictly left to right. Instead, we
2696 * compute with fewer bits and propagate the carry if necessary
2697 * when rounding the final digit up. This is often faster.
2698 * 3. Under the assumption that input will be rounded nearest,
2699 * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
2700 * That is, we allow equality in stopping tests when the
2701 * round-nearest rule will give the same floating-point value
2702 * as would satisfaction of the stopping test with strict
2703 * inequality.
2704 * 4. We remove common factors of powers of 2 from relevant
2705 * quantities.
2706 * 5. When converting floating-point integers less than 1e16,
2707 * we use floating-point arithmetic rather than resorting
2708 * to multiple-precision integers.
2709 * 6. When asked to produce fewer than 15 digits, we first try
2710 * to get by with floating-point arithmetic; we resort to
2711 * multiple-precision integer arithmetic only if we cannot
2712 * guarantee that the floating-point calculation has given
2713 * the correctly rounded result. For k requested digits and
2714 * "uniformly" distributed input, the probability is
2715 * something like 10^(k-15) that we must resort to the Long
2716 * calculation.
2719 static char *
2720 dtoa
2721 #ifdef KR_headers
2722 (STATE_PARAM d, mode, ndigits, decpt, sign, rve)
2723 STATE_PARAM_DECL U d; int mode, ndigits, *decpt, *sign; char **rve;
2724 #else
2725 (STATE_PARAM U d, int mode, int ndigits, int *decpt, int *sign, char **rve)
2726 #endif
2728 /* Arguments ndigits, decpt, sign are similar to those
2729 of ecvt and fcvt; trailing zeros are suppressed from
2730 the returned string. If not null, *rve is set to point
2731 to the end of the return value. If d is +-Infinity or NaN,
2732 then *decpt is set to 9999.
2734 mode:
2735 0 ==> shortest string that yields d when read in
2736 and rounded to nearest.
2737 1 ==> like 0, but with Steele & White stopping rule;
2738 e.g. with IEEE P754 arithmetic , mode 0 gives
2739 1e23 whereas mode 1 gives 9.999999999999999e22.
2740 2 ==> max(1,ndigits) significant digits. This gives a
2741 return value similar to that of ecvt, except
2742 that trailing zeros are suppressed.
2743 3 ==> through ndigits past the decimal point. This
2744 gives a return value similar to that from fcvt,
2745 except that trailing zeros are suppressed, and
2746 ndigits can be negative.
2747 4,5 ==> similar to 2 and 3, respectively, but (in
2748 round-nearest mode) with the tests of mode 0 to
2749 possibly return a shorter string that rounds to d.
2750 With IEEE arithmetic and compilation with
2751 -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
2752 as modes 2 and 3 when FLT_ROUNDS != 1.
2753 6-9 ==> Debugging modes similar to mode - 4: don't try
2754 fast floating-point estimate (if applicable).
2756 Values of mode other than 0-9 are treated as mode 0.
2758 Sufficient space is allocated to the return value
2759 to hold the suppressed trailing zeros.
2762 int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
2763 j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
2764 spec_case, try_quick;
2765 Long L;
2766 #ifndef Sudden_Underflow
2767 int denorm;
2768 ULong x;
2769 #endif
2770 Bigint *b, *b1, *delta, *mlo, *mhi, *S;
2771 U d2, eps;
2772 double ds;
2773 char *s, *s0;
2774 #ifdef Honor_FLT_ROUNDS
2775 int rounding;
2776 #endif
2777 #ifdef SET_INEXACT
2778 int inexact, oldinexact;
2779 #endif
2781 #ifdef __GNUC__
2782 ilim = ilim1 = 0;
2783 mlo = NULL;
2784 #endif
2786 #ifdef USE_DTOA_RESULT
2787 if (dtoa_result) {
2788 freedtoa(PASS_STATE dtoa_result);
2789 dtoa_result = 0;
2791 #endif
2793 if (word0(d) & Sign_bit) {
2794 /* set sign for everything, including 0's and NaNs */
2795 *sign = 1;
2796 word0(d) &= ~Sign_bit; /* clear sign bit */
2798 else
2799 *sign = 0;
2801 #if defined(IEEE_Arith) + defined(VAX)
2802 #ifdef IEEE_Arith
2803 if ((word0(d) & Exp_mask) == Exp_mask)
2804 #else
2805 if (word0(d) == 0x8000)
2806 #endif
2808 /* Infinity or NaN */
2809 *decpt = 9999;
2810 #ifdef IEEE_Arith
2811 if (!word1(d) && !(word0(d) & 0xfffff))
2812 return nrv_alloc(PASS_STATE "Infinity", rve, 8);
2813 #endif
2814 return nrv_alloc(PASS_STATE "NaN", rve, 3);
2816 #endif
2817 #ifdef IBM
2818 dval(d) += 0; /* normalize */
2819 #endif
2820 if (!dval(d)) {
2821 *decpt = 1;
2822 return nrv_alloc(PASS_STATE "0", rve, 1);
2825 #ifdef SET_INEXACT
2826 try_quick = oldinexact = get_inexact();
2827 inexact = 1;
2828 #endif
2829 #ifdef Honor_FLT_ROUNDS
2830 if ((rounding = Flt_Rounds) >= 2) {
2831 if (*sign)
2832 rounding = rounding == 2 ? 0 : 2;
2833 else
2834 if (rounding != 2)
2835 rounding = 0;
2837 #endif
2839 b = d2b(PASS_STATE d, &be, &bbits);
2840 #ifdef Sudden_Underflow
2841 i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
2842 #else
2843 if ((i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {
2844 #endif
2845 dval(d2) = dval(d);
2846 word0(d2) &= Frac_mask1;
2847 word0(d2) |= Exp_11;
2848 #ifdef IBM
2849 if (j = 11 - hi0bits(word0(d2) & Frac_mask))
2850 dval(d2) /= 1 << j;
2851 #endif
2853 /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
2854 * log10(x) = log(x) / log(10)
2855 * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
2856 * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
2858 * This suggests computing an approximation k to log10(d) by
2860 * k = (i - Bias)*0.301029995663981
2861 * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
2863 * We want k to be too large rather than too small.
2864 * The error in the first-order Taylor series approximation
2865 * is in our favor, so we just round up the constant enough
2866 * to compensate for any error in the multiplication of
2867 * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
2868 * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
2869 * adding 1e-13 to the constant term more than suffices.
2870 * Hence we adjust the constant term to 0.1760912590558.
2871 * (We could get a more accurate k by invoking log10,
2872 * but this is probably not worthwhile.)
2875 i -= Bias;
2876 #ifdef IBM
2877 i <<= 2;
2878 i += j;
2879 #endif
2880 #ifndef Sudden_Underflow
2881 denorm = 0;
2883 else {
2884 /* d is denormalized */
2886 i = bbits + be + (Bias + (P-1) - 1);
2887 x = i > 32 ? word0(d) << (64 - i) | word1(d) >> (i - 32)
2888 : word1(d) << (32 - i);
2889 dval(d2) = x;
2890 word0(d2) -= 31*Exp_msk1; /* adjust exponent */
2891 i -= (Bias + (P-1) - 1) + 1;
2892 denorm = 1;
2894 #endif
2895 ds = (dval(d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
2896 k = (int)ds;
2897 if (ds < 0. && ds != k)
2898 k--; /* want k = floor(ds) */
2899 k_check = 1;
2900 if (k >= 0 && k <= Ten_pmax) {
2901 if (dval(d) < tens[k])
2902 k--;
2903 k_check = 0;
2905 j = bbits - i - 1;
2906 if (j >= 0) {
2907 b2 = 0;
2908 s2 = j;
2910 else {
2911 b2 = -j;
2912 s2 = 0;
2914 if (k >= 0) {
2915 b5 = 0;
2916 s5 = k;
2917 s2 += k;
2919 else {
2920 b2 -= k;
2921 b5 = -k;
2922 s5 = 0;
2924 if (mode < 0 || mode > 9)
2925 mode = 0;
2927 #ifndef SET_INEXACT
2928 #ifdef Check_FLT_ROUNDS
2929 try_quick = Rounding == 1;
2930 #else
2931 try_quick = 1;
2932 #endif
2933 #endif /*SET_INEXACT*/
2935 if (mode > 5) {
2936 mode -= 4;
2937 try_quick = 0;
2939 leftright = 1;
2940 switch(mode) {
2941 case 0:
2942 case 1:
2943 ilim = ilim1 = -1;
2944 i = 18;
2945 ndigits = 0;
2946 break;
2947 case 2:
2948 leftright = 0;
2949 /* no break */
2950 case 4:
2951 if (ndigits <= 0)
2952 ndigits = 1;
2953 ilim = ilim1 = i = ndigits;
2954 break;
2955 case 3:
2956 leftright = 0;
2957 /* no break */
2958 case 5:
2959 i = ndigits + k + 1;
2960 ilim = i;
2961 ilim1 = i - 1;
2962 if (i <= 0)
2963 i = 1;
2965 s = s0 = rv_alloc(PASS_STATE i);
2967 #ifdef Honor_FLT_ROUNDS
2968 if (mode > 1 && rounding != 1)
2969 leftright = 0;
2970 #endif
2972 if (ilim >= 0 && ilim <= Quick_max && try_quick) {
2974 /* Try to get by with floating-point arithmetic. */
2976 i = 0;
2977 dval(d2) = dval(d);
2978 k0 = k;
2979 ilim0 = ilim;
2980 ieps = 2; /* conservative */
2981 if (k > 0) {
2982 ds = tens[k&0xf];
2983 j = k >> 4;
2984 if (j & Bletch) {
2985 /* prevent overflows */
2986 j &= Bletch - 1;
2987 dval(d) /= bigtens[n_bigtens-1];
2988 ieps++;
2990 for(; j; j >>= 1, i++)
2991 if (j & 1) {
2992 ieps++;
2993 ds *= bigtens[i];
2995 dval(d) /= ds;
2997 else if ((j1 = -k)) {
2998 dval(d) *= tens[j1 & 0xf];
2999 for(j = j1 >> 4; j; j >>= 1, i++)
3000 if (j & 1) {
3001 ieps++;
3002 dval(d) *= bigtens[i];
3005 if (k_check && dval(d) < 1. && ilim > 0) {
3006 if (ilim1 <= 0)
3007 goto fast_failed;
3008 ilim = ilim1;
3009 k--;
3010 dval(d) *= 10.;
3011 ieps++;
3013 dval(eps) = ieps*dval(d) + 7.;
3014 word0(eps) -= (P-1)*Exp_msk1;
3015 if (ilim == 0) {
3016 S = mhi = 0;
3017 dval(d) -= 5.;
3018 if (dval(d) > dval(eps))
3019 goto one_digit;
3020 if (dval(d) < -dval(eps))
3021 goto no_digits;
3022 goto fast_failed;
3024 #ifndef No_leftright
3025 if (leftright) {
3026 /* Use Steele & White method of only
3027 * generating digits needed.
3029 dval(eps) = 0.5/tens[ilim-1] - dval(eps);
3030 for(i = 0;;) {
3031 L = (ULong) dval(d);
3032 dval(d) -= L;
3033 *s++ = '0' + (int)L;
3034 if (dval(d) < dval(eps))
3035 goto ret1;
3036 if (1. - dval(d) < dval(eps))
3037 goto bump_up;
3038 if (++i >= ilim)
3039 break;
3040 dval(eps) *= 10.;
3041 dval(d) *= 10.;
3044 else {
3045 #endif
3046 /* Generate ilim digits, then fix them up. */
3047 dval(eps) *= tens[ilim-1];
3048 for(i = 1;; i++, dval(d) *= 10.) {
3049 L = (Long)(dval(d));
3050 if (!(dval(d) -= L))
3051 ilim = i;
3052 *s++ = '0' + (int)L;
3053 if (i == ilim) {
3054 if (dval(d) > 0.5 + dval(eps))
3055 goto bump_up;
3056 else if (dval(d) < 0.5 - dval(eps)) {
3057 while(*--s == '0');
3058 s++;
3059 goto ret1;
3061 break;
3064 #ifndef No_leftright
3066 #endif
3067 fast_failed:
3068 s = s0;
3069 dval(d) = dval(d2);
3070 k = k0;
3071 ilim = ilim0;
3074 /* Do we have a "small" integer? */
3076 if (be >= 0 && k <= Int_max) {
3077 /* Yes. */
3078 ds = tens[k];
3079 if (ndigits < 0 && ilim <= 0) {
3080 S = mhi = 0;
3081 if (ilim < 0 || dval(d) < 5*ds)
3082 goto no_digits;
3083 goto one_digit;
3085 for(i = 1;; i++, dval(d) *= 10.) {
3086 L = (Long)(dval(d) / ds);
3087 dval(d) -= L*ds;
3088 #ifdef Check_FLT_ROUNDS
3089 /* If FLT_ROUNDS == 2, L will usually be high by 1 */
3090 if (dval(d) < 0) {
3091 L--;
3092 dval(d) += ds;
3094 #endif
3095 *s++ = '0' + (int)L;
3096 if (!dval(d)) {
3097 #ifdef SET_INEXACT
3098 inexact = 0;
3099 #endif
3100 break;
3102 if (i == ilim) {
3103 #ifdef Honor_FLT_ROUNDS
3104 if (mode > 1)
3105 switch(rounding) {
3106 case 0: goto ret1;
3107 case 2: goto bump_up;
3109 #endif
3110 dval(d) += dval(d);
3111 if (dval(d) > ds || (dval(d) == ds && L & 1)) {
3112 bump_up:
3113 while(*--s == '9')
3114 if (s == s0) {
3115 k++;
3116 *s = '0';
3117 break;
3119 ++*s++;
3121 break;
3124 goto ret1;
3127 m2 = b2;
3128 m5 = b5;
3129 mhi = mlo = 0;
3130 if (leftright) {
3132 #ifndef Sudden_Underflow
3133 denorm ? be + (Bias + (P-1) - 1 + 1) :
3134 #endif
3135 #ifdef IBM
3136 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
3137 #else
3138 1 + P - bbits;
3139 #endif
3140 b2 += i;
3141 s2 += i;
3142 mhi = i2b(PASS_STATE 1);
3144 if (m2 > 0 && s2 > 0) {
3145 i = m2 < s2 ? m2 : s2;
3146 b2 -= i;
3147 m2 -= i;
3148 s2 -= i;
3150 if (b5 > 0) {
3151 if (leftright) {
3152 if (m5 > 0) {
3153 mhi = pow5mult(PASS_STATE mhi, m5);
3154 b1 = mult(PASS_STATE mhi, b);
3155 Bfree(PASS_STATE b);
3156 b = b1;
3158 if ((j = b5 - m5))
3159 b = pow5mult(PASS_STATE b, j);
3161 else
3162 b = pow5mult(PASS_STATE b, b5);
3164 S = i2b(PASS_STATE 1);
3165 if (s5 > 0)
3166 S = pow5mult(PASS_STATE S, s5);
3168 /* Check for special case that d is a normalized power of 2. */
3170 spec_case = 0;
3171 if ((mode < 2 || leftright)
3172 #ifdef Honor_FLT_ROUNDS
3173 && rounding == 1
3174 #endif
3176 if (!word1(d) && !(word0(d) & Bndry_mask)
3177 #ifndef Sudden_Underflow
3178 && word0(d) & (Exp_mask & ~Exp_msk1)
3179 #endif
3181 /* The special case */
3182 b2 += Log2P;
3183 s2 += Log2P;
3184 spec_case = 1;
3188 /* Arrange for convenient computation of quotients:
3189 * shift left if necessary so divisor has 4 leading 0 bits.
3191 * Perhaps we should just compute leading 28 bits of S once
3192 * and for all and pass them and a shift to quorem, so it
3193 * can do shifts and ors to compute the numerator for q.
3195 #ifdef Pack_32
3196 if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f))
3197 i = 32 - i;
3198 #else
3199 if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf)
3200 i = 16 - i;
3201 #endif
3202 if (i > 4) {
3203 i -= 4;
3204 b2 += i;
3205 m2 += i;
3206 s2 += i;
3208 else if (i < 4) {
3209 i += 28;
3210 b2 += i;
3211 m2 += i;
3212 s2 += i;
3214 if (b2 > 0)
3215 b = lshift(PASS_STATE b, b2);
3216 if (s2 > 0)
3217 S = lshift(PASS_STATE S, s2);
3218 if (k_check) {
3219 if (cmp(b,S) < 0) {
3220 k--;
3221 b = multadd(PASS_STATE b, 10, 0); /* we botched the k estimate */
3222 if (leftright)
3223 mhi = multadd(PASS_STATE mhi, 10, 0);
3224 ilim = ilim1;
3227 if (ilim <= 0 && (mode == 3 || mode == 5)) {
3228 if (ilim < 0 || cmp(b,S = multadd(PASS_STATE S,5,0)) < 0) {
3229 /* no digits, fcvt style */
3230 no_digits:
3231 /* MOZILLA CHANGE: Always return a non-empty string. */
3232 *s++ = '0';
3233 k = 0;
3234 goto ret;
3236 one_digit:
3237 *s++ = '1';
3238 k++;
3239 goto ret;
3241 if (leftright) {
3242 if (m2 > 0)
3243 mhi = lshift(PASS_STATE mhi, m2);
3245 /* Compute mlo -- check for special case
3246 * that d is a normalized power of 2.
3249 mlo = mhi;
3250 if (spec_case) {
3251 mhi = Balloc(PASS_STATE mhi->k);
3252 Bcopy(mhi, mlo);
3253 mhi = lshift(PASS_STATE mhi, Log2P);
3256 for(i = 1;;i++) {
3257 dig = quorem(b,S) + '0';
3258 /* Do we yet have the shortest decimal string
3259 * that will round to d?
3261 j = cmp(b, mlo);
3262 delta = diff(PASS_STATE S, mhi);
3263 j1 = delta->sign ? 1 : cmp(b, delta);
3264 Bfree(PASS_STATE delta);
3265 #ifndef ROUND_BIASED
3266 if (j1 == 0 && mode != 1 && !(word1(d) & 1)
3267 #ifdef Honor_FLT_ROUNDS
3268 && rounding >= 1
3269 #endif
3271 if (dig == '9')
3272 goto round_9_up;
3273 if (j > 0)
3274 dig++;
3275 #ifdef SET_INEXACT
3276 else if (!b->x[0] && b->wds <= 1)
3277 inexact = 0;
3278 #endif
3279 *s++ = dig;
3280 goto ret;
3282 #endif
3283 if (j < 0 || (j == 0 && mode != 1
3284 #ifndef ROUND_BIASED
3285 && !(word1(d) & 1)
3286 #endif
3287 )) {
3288 if (!b->x[0] && b->wds <= 1) {
3289 #ifdef SET_INEXACT
3290 inexact = 0;
3291 #endif
3292 goto accept_dig;
3294 #ifdef Honor_FLT_ROUNDS
3295 if (mode > 1)
3296 switch(rounding) {
3297 case 0: goto accept_dig;
3298 case 2: goto keep_dig;
3300 #endif /*Honor_FLT_ROUNDS*/
3301 if (j1 > 0) {
3302 b = lshift(PASS_STATE b, 1);
3303 j1 = cmp(b, S);
3304 if ((j1 > 0 || (j1 == 0 && dig & 1))
3305 && dig++ == '9')
3306 goto round_9_up;
3308 accept_dig:
3309 *s++ = dig;
3310 goto ret;
3312 if (j1 > 0) {
3313 #ifdef Honor_FLT_ROUNDS
3314 if (!rounding)
3315 goto accept_dig;
3316 #endif
3317 if (dig == '9') { /* possible if i == 1 */
3318 round_9_up:
3319 *s++ = '9';
3320 goto roundoff;
3322 *s++ = dig + 1;
3323 goto ret;
3325 #ifdef Honor_FLT_ROUNDS
3326 keep_dig:
3327 #endif
3328 *s++ = dig;
3329 if (i == ilim)
3330 break;
3331 b = multadd(PASS_STATE b, 10, 0);
3332 if (mlo == mhi)
3333 mlo = mhi = multadd(PASS_STATE mhi, 10, 0);
3334 else {
3335 mlo = multadd(PASS_STATE mlo, 10, 0);
3336 mhi = multadd(PASS_STATE mhi, 10, 0);
3340 else
3341 for(i = 1;; i++) {
3342 *s++ = dig = quorem(b,S) + '0';
3343 if (!b->x[0] && b->wds <= 1) {
3344 #ifdef SET_INEXACT
3345 inexact = 0;
3346 #endif
3347 goto ret;
3349 if (i >= ilim)
3350 break;
3351 b = multadd(PASS_STATE b, 10, 0);
3354 /* Round off last digit */
3356 #ifdef Honor_FLT_ROUNDS
3357 switch(rounding) {
3358 case 0: goto trimzeros;
3359 case 2: goto roundoff;
3361 #endif
3362 b = lshift(PASS_STATE b, 1);
3363 j = cmp(b, S);
3364 if (j >= 0) { /* ECMA compatible rounding needed by Spidermonkey */
3365 roundoff:
3366 while(*--s == '9')
3367 if (s == s0) {
3368 k++;
3369 *s++ = '1';
3370 goto ret;
3372 ++*s++;
3374 else {
3375 #ifdef Honor_FLT_ROUNDS
3376 trimzeros:
3377 #endif
3378 while(*--s == '0');
3379 s++;
3381 ret:
3382 Bfree(PASS_STATE S);
3383 if (mhi) {
3384 if (mlo && mlo != mhi)
3385 Bfree(PASS_STATE mlo);
3386 Bfree(PASS_STATE mhi);
3388 ret1:
3389 #ifdef SET_INEXACT
3390 if (inexact) {
3391 if (!oldinexact) {
3392 word0(d) = Exp_1 + (70 << Exp_shift);
3393 word1(d) = 0;
3394 dval(d) += 1.;
3397 else if (!oldinexact)
3398 clear_inexact();
3399 #endif
3400 Bfree(PASS_STATE b);
3401 *s = 0;
3402 *decpt = k + 1;
3403 if (rve)
3404 *rve = s;
3405 return s0;
3407 #ifdef __cplusplus
3409 #endif