1/****************************************************************
2 *
3 * The author of this software is David M. Gay.
4 *
5 * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose without fee is hereby granted, provided that this entire notice
9 * is included in all copies of any software which is or includes a copy
10 * or modification of this software and in all copies of the supporting
11 * documentation for such software.
12 *
13 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
14 * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
15 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
16 * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
17 *
18 ***************************************************************/
19
20/* Please send bug reports to David M. Gay (dmg at acm dot org,
21 * with " at " changed at "@" and " dot " changed to ".").	*/
22
23/* On a machine with IEEE extended-precision registers, it is
24 * necessary to specify double-precision (53-bit) rounding precision
25 * before invoking strtod or dtoa.  If the machine uses (the equivalent
26 * of) Intel 80x87 arithmetic, the call
27 *	_control87(PC_53, MCW_PC);
28 * does this with many compilers.  Whether this or another call is
29 * appropriate depends on the compiler; for this to work, it may be
30 * necessary to #include "float.h" or another system-dependent header
31 * file.
32 */
33
34/* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
35 *
36 * This strtod returns a nearest machine number to the input decimal
37 * string (or sets errno to ERANGE).  With IEEE arithmetic, ties are
38 * broken by the IEEE round-even rule.  Otherwise ties are broken by
39 * biased rounding (add half and chop).
40 *
41 * Inspired loosely by William D. Clinger's paper "How to Read Floating
42 * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
43 *
44 * Modifications:
45 *
46 *	1. We only require IEEE, IBM, or VAX double-precision
47 *		arithmetic (not IEEE double-extended).
48 *	2. We get by with floating-point arithmetic in a case that
49 *		Clinger missed -- when we're computing d * 10^n
50 *		for a small integer d and the integer n is not too
51 *		much larger than 22 (the maximum integer k for which
52 *		we can represent 10^k exactly), we may be able to
53 *		compute (d*10^k) * 10^(e-k) with just one roundoff.
54 *	3. Rather than a bit-at-a-time adjustment of the binary
55 *		result in the hard case, we use floating-point
56 *		arithmetic to determine the adjustment to within
57 *		one bit; only in really hard cases do we need to
58 *		compute a second residual.
59 *	4. Because of 3., we don't need a large table of powers of 10
60 *		for ten-to-e (just some small tables, e.g. of 10^k
61 *		for 0 <= k <= 22).
62 */
63
64/*
65 * #define IEEE_8087 for IEEE-arithmetic machines where the least
66 *	significant byte has the lowest address.
67 * #define IEEE_MC68k for IEEE-arithmetic machines where the most
68 *	significant byte has the lowest address.
69 * #define Long int on machines with 32-bit ints and 64-bit longs.
70 * #define IBM for IBM mainframe-style floating-point arithmetic.
71 * #define VAX for VAX-style floating-point arithmetic (D_floating).
72 * #define No_leftright to omit left-right logic in fast floating-point
73 *	computation of dtoa.
74 * #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3
75 *	and strtod and dtoa should round accordingly.  Unless Trust_FLT_ROUNDS
76 *	is also #defined, fegetround() will be queried for the rounding mode.
77 *	Note that both FLT_ROUNDS and fegetround() are specified by the C99
78 *	standard (and are specified to be consistent, with fesetround()
79 *	affecting the value of FLT_ROUNDS), but that some (Linux) systems
80 *	do not work correctly in this regard, so using fegetround() is more
81 *	portable than using FLT_FOUNDS directly.
82 * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3
83 *	and Honor_FLT_ROUNDS is not #defined.
84 * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
85 *	that use extended-precision instructions to compute rounded
86 *	products and quotients) with IBM.
87 * #define ROUND_BIASED for IEEE-format with biased rounding.
88 * #define Inaccurate_Divide for IEEE-format with correctly rounded
89 *	products but inaccurate quotients, e.g., for Intel i860.
90 * #define NO_LONG_LONG on machines that do not have a "long long"
91 *	integer type (of >= 64 bits).  On such machines, you can
92 *	#define Just_16 to store 16 bits per 32-bit Long when doing
93 *	high-precision integer arithmetic.  Whether this speeds things
94 *	up or slows things down depends on the machine and the number
95 *	being converted.  If long long is available and the name is
96 *	something other than "long long", #define Llong to be the name,
97 *	and if "unsigned Llong" does not work as an unsigned version of
98 *	Llong, #define #ULLong to be the corresponding unsigned type.
99 * #define KR_headers for old-style C function headers.
100 * #define Bad_float_h if your system lacks a float.h or if it does not
101 *	define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
102 *	FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
103 * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
104 *	if memory is available and otherwise does something you deem
105 *	appropriate.  If MALLOC is undefined, malloc will be invoked
106 *	directly -- and assumed always to succeed.  Similarly, if you
107 *	want something other than the system's free() to be called to
108 *	recycle memory acquired from MALLOC, #define FREE to be the
109 *	name of the alternate routine.  (FREE or free is only called in
110 *	pathological cases, e.g., in a dtoa call after a dtoa return in
111 *	mode 3 with thousands of digits requested.)
112 * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
113 *	memory allocations from a private pool of memory when possible.
114 *	When used, the private pool is PRIVATE_MEM bytes long:  2304 bytes,
115 *	unless #defined to be a different length.  This default length
116 *	suffices to get rid of MALLOC calls except for unusual cases,
117 *	such as decimal-to-binary conversion of a very long string of
118 *	digits.  The longest string dtoa can return is about 751 bytes
119 *	long.  For conversions by strtod of strings of 800 digits and
120 *	all dtoa conversions in single-threaded executions with 8-byte
121 *	pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte
122 *	pointers, PRIVATE_MEM >= 7112 appears adequate.
123 * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK
124 *	#defined automatically on IEEE systems.  On such systems,
125 *	when INFNAN_CHECK is #defined, strtod checks
126 *	for Infinity and NaN (case insensitively).  On some systems
127 *	(e.g., some HP systems), it may be necessary to #define NAN_WORD0
128 *	appropriately -- to the most significant word of a quiet NaN.
129 *	(On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.)
130 *	When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined,
131 *	strtod also accepts (case insensitively) strings of the form
132 *	NaN(x), where x is a string of hexadecimal digits and spaces;
133 *	if there is only one string of hexadecimal digits, it is taken
134 *	for the 52 fraction bits of the resulting NaN; if there are two
135 *	or more strings of hex digits, the first is for the high 20 bits,
136 *	the second and subsequent for the low 32 bits, with intervening
137 *	white space ignored; but if this results in none of the 52
138 *	fraction bits being on (an IEEE Infinity symbol), then NAN_WORD0
139 *	and NAN_WORD1 are used instead.
140 * #define MULTIPLE_THREADS if the system offers preemptively scheduled
141 *	multiple threads.  In this case, you must provide (or suitably
142 *	#define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed
143 *	by FREE_DTOA_LOCK(n) for n = 0 or 1.  (The second lock, accessed
144 *	in pow5mult, ensures lazy evaluation of only one copy of high
145 *	powers of 5; omitting this lock would introduce a small
146 *	probability of wasting memory, but would otherwise be harmless.)
147 *	You must also invoke freedtoa(s) to free the value s returned by
148 *	dtoa.  You may do so whether or not MULTIPLE_THREADS is #defined.
149 * #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that
150 *	avoids underflows on inputs whose result does not underflow.
151 *	If you #define NO_IEEE_Scale on a machine that uses IEEE-format
152 *	floating-point numbers and flushes underflows to zero rather
153 *	than implementing gradual underflow, then you must also #define
154 *	Sudden_Underflow.
155 * #define USE_LOCALE to use the current locale's decimal_point value.
156 * #define SET_INEXACT if IEEE arithmetic is being used and extra
157 *	computation should be done to set the inexact flag when the
158 *	result is inexact and avoid setting inexact when the result
159 *	is exact.  In this case, dtoa.c must be compiled in
160 *	an environment, perhaps provided by #include "dtoa.c" in a
161 *	suitable wrapper, that defines two functions,
162 *		int get_inexact(void);
163 *		void clear_inexact(void);
164 *	such that get_inexact() returns a nonzero value if the
165 *	inexact bit is already set, and clear_inexact() sets the
166 *	inexact bit to 0.  When SET_INEXACT is #defined, strtod
167 *	also does extra computations to set the underflow and overflow
168 *	flags when appropriate (i.e., when the result is tiny and
169 *	inexact or when it is a numeric value rounded to +-infinity).
170 * #define NO_ERRNO if strtod should not assign errno = ERANGE when
171 *	the result overflows to +-Infinity or underflows to 0.
172 * #define NO_HEX_FP to omit recognition of hexadecimal floating-point
173 *	values by strtod.
174 * #define NO_STRTOD_BIGCOMP (on IEEE-arithmetic systems only for now)
175 *	to disable logic for "fast" testing of very long input strings
176 *	to strtod.  This testing proceeds by initially truncating the
177 *	input string, then if necessary comparing the whole string with
178 *	a decimal expansion to decide close cases. This logic is only
179 *	used for input more than STRTOD_DIGLIM digits long (default 40).
180 */
181
182#define IEEE_8087
183#define NO_HEX_FP
184
185#ifndef Long
186#if __LP64__
187#define Long int
188#else
189#define Long long
190#endif
191#endif
192#ifndef ULong
193typedef unsigned Long ULong;
194#endif
195
196#ifdef DEBUG
197#include "stdio.h"
198#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
199#endif
200
201#include "stdlib.h"
202#include "string.h"
203
204#ifdef USE_LOCALE
205#include "locale.h"
206#endif
207
208#ifdef Honor_FLT_ROUNDS
209#ifndef Trust_FLT_ROUNDS
210#include <fenv.h>
211#endif
212#endif
213
214#ifdef MALLOC
215#ifdef KR_headers
216extern char *MALLOC();
217#else
218extern void *MALLOC(size_t);
219#endif
220#else
221#define MALLOC malloc
222#endif
223
224#ifndef Omit_Private_Memory
225#ifndef PRIVATE_MEM
226#define PRIVATE_MEM 2304
227#endif
228#define PRIVATE_mem ((unsigned)((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)))
229static double private_mem[PRIVATE_mem], *pmem_next = private_mem;
230#endif
231
232#undef IEEE_Arith
233#undef Avoid_Underflow
234#ifdef IEEE_MC68k
235#define IEEE_Arith
236#endif
237#ifdef IEEE_8087
238#define IEEE_Arith
239#endif
240
241#ifdef IEEE_Arith
242#ifndef NO_INFNAN_CHECK
243#undef INFNAN_CHECK
244#define INFNAN_CHECK
245#endif
246#else
247#undef INFNAN_CHECK
248#define NO_STRTOD_BIGCOMP
249#endif
250
251#include "errno.h"
252
253#ifdef Bad_float_h
254
255#ifdef IEEE_Arith
256#define DBL_DIG 15
257#define DBL_MAX_10_EXP 308
258#define DBL_MAX_EXP 1024
259#define FLT_RADIX 2
260#endif /*IEEE_Arith*/
261
262#ifdef IBM
263#define DBL_DIG 16
264#define DBL_MAX_10_EXP 75
265#define DBL_MAX_EXP 63
266#define FLT_RADIX 16
267#define DBL_MAX 7.2370055773322621e+75
268#endif
269
270#ifdef VAX
271#define DBL_DIG 16
272#define DBL_MAX_10_EXP 38
273#define DBL_MAX_EXP 127
274#define FLT_RADIX 2
275#define DBL_MAX 1.7014118346046923e+38
276#endif
277
278#ifndef LONG_MAX
279#define LONG_MAX 2147483647
280#endif
281
282#else /* ifndef Bad_float_h */
283#include "float.h"
284#endif /* Bad_float_h */
285
286#ifndef __MATH_H__
287#include "math.h"
288#endif
289
290namespace dmg_fp {
291
292#ifndef CONST
293#ifdef KR_headers
294#define CONST /* blank */
295#else
296#define CONST const
297#endif
298#endif
299
300#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
301Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
302#endif
303
304typedef union { double d; ULong L[2]; } U;
305
306#ifdef IEEE_8087
307#define word0(x) (x)->L[1]
308#define word1(x) (x)->L[0]
309#else
310#define word0(x) (x)->L[0]
311#define word1(x) (x)->L[1]
312#endif
313#define dval(x) (x)->d
314
315#ifndef STRTOD_DIGLIM
316#define STRTOD_DIGLIM 40
317#endif
318
319#ifdef DIGLIM_DEBUG
320extern int strtod_diglim;
321#else
322#define strtod_diglim STRTOD_DIGLIM
323#endif
324
325/* The following definition of Storeinc is appropriate for MIPS processors.
326 * An alternative that might be better on some machines is
327 * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
328 */
329#if defined(IEEE_8087) + defined(VAX)
330#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
331((unsigned short *)a)[0] = (unsigned short)c, a++)
332#else
333#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
334((unsigned short *)a)[1] = (unsigned short)c, a++)
335#endif
336
337/* #define P DBL_MANT_DIG */
338/* Ten_pmax = floor(P*log(2)/log(5)) */
339/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
340/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
341/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
342
343#ifdef IEEE_Arith
344#define Exp_shift  20
345#define Exp_shift1 20
346#define Exp_msk1    0x100000
347#define Exp_msk11   0x100000
348#define Exp_mask  0x7ff00000
349#define P 53
350#define Nbits 53
351#define Bias 1023
352#define Emax 1023
353#define Emin (-1022)
354#define Exp_1  0x3ff00000
355#define Exp_11 0x3ff00000
356#define Ebits 11
357#define Frac_mask  0xfffff
358#define Frac_mask1 0xfffff
359#define Ten_pmax 22
360#define Bletch 0x10
361#define Bndry_mask  0xfffff
362#define Bndry_mask1 0xfffff
363#define LSB 1
364#define Sign_bit 0x80000000
365#define Log2P 1
366#define Tiny0 0
367#define Tiny1 1
368#define Quick_max 14
369#define Int_max 14
370#ifndef NO_IEEE_Scale
371#define Avoid_Underflow
372#ifdef Flush_Denorm	/* debugging option */
373#undef Sudden_Underflow
374#endif
375#endif
376
377#ifndef Flt_Rounds
378#ifdef FLT_ROUNDS
379#define Flt_Rounds FLT_ROUNDS
380#else
381#define Flt_Rounds 1
382#endif
383#endif /*Flt_Rounds*/
384
385#ifdef Honor_FLT_ROUNDS
386#undef Check_FLT_ROUNDS
387#define Check_FLT_ROUNDS
388#else
389#define Rounding Flt_Rounds
390#endif
391
392#else /* ifndef IEEE_Arith */
393#undef Check_FLT_ROUNDS
394#undef Honor_FLT_ROUNDS
395#undef SET_INEXACT
396#undef  Sudden_Underflow
397#define Sudden_Underflow
398#ifdef IBM
399#undef Flt_Rounds
400#define Flt_Rounds 0
401#define Exp_shift  24
402#define Exp_shift1 24
403#define Exp_msk1   0x1000000
404#define Exp_msk11  0x1000000
405#define Exp_mask  0x7f000000
406#define P 14
407#define Nbits 56
408#define Bias 65
409#define Emax 248
410#define Emin (-260)
411#define Exp_1  0x41000000
412#define Exp_11 0x41000000
413#define Ebits 8	/* exponent has 7 bits, but 8 is the right value in b2d */
414#define Frac_mask  0xffffff
415#define Frac_mask1 0xffffff
416#define Bletch 4
417#define Ten_pmax 22
418#define Bndry_mask  0xefffff
419#define Bndry_mask1 0xffffff
420#define LSB 1
421#define Sign_bit 0x80000000
422#define Log2P 4
423#define Tiny0 0x100000
424#define Tiny1 0
425#define Quick_max 14
426#define Int_max 15
427#else /* VAX */
428#undef Flt_Rounds
429#define Flt_Rounds 1
430#define Exp_shift  23
431#define Exp_shift1 7
432#define Exp_msk1    0x80
433#define Exp_msk11   0x800000
434#define Exp_mask  0x7f80
435#define P 56
436#define Nbits 56
437#define Bias 129
438#define Emax 126
439#define Emin (-129)
440#define Exp_1  0x40800000
441#define Exp_11 0x4080
442#define Ebits 8
443#define Frac_mask  0x7fffff
444#define Frac_mask1 0xffff007f
445#define Ten_pmax 24
446#define Bletch 2
447#define Bndry_mask  0xffff007f
448#define Bndry_mask1 0xffff007f
449#define LSB 0x10000
450#define Sign_bit 0x8000
451#define Log2P 1
452#define Tiny0 0x80
453#define Tiny1 0
454#define Quick_max 15
455#define Int_max 15
456#endif /* IBM, VAX */
457#endif /* IEEE_Arith */
458
459#ifndef IEEE_Arith
460#define ROUND_BIASED
461#endif
462
463#ifdef RND_PRODQUOT
464#define rounded_product(a,b) a = rnd_prod(a, b)
465#define rounded_quotient(a,b) a = rnd_quot(a, b)
466#ifdef KR_headers
467extern double rnd_prod(), rnd_quot();
468#else
469extern double rnd_prod(double, double), rnd_quot(double, double);
470#endif
471#else
472#define rounded_product(a,b) a *= b
473#define rounded_quotient(a,b) a /= b
474#endif
475
476#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
477#define Big1 0xffffffff
478
479#ifndef Pack_32
480#define Pack_32
481#endif
482
483typedef struct BCinfo BCinfo;
484 struct
485BCinfo { int dp0, dp1, dplen, dsign, e0, inexact, nd, nd0, rounding, scale, uflchk; };
486
487#ifdef KR_headers
488#define FFFFFFFF ((((unsigned long)0xffff)<<16)|(unsigned long)0xffff)
489#else
490#define FFFFFFFF 0xffffffffUL
491#endif
492
493#ifdef NO_LONG_LONG
494#undef ULLong
495#ifdef Just_16
496#undef Pack_32
497/* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
498 * This makes some inner loops simpler and sometimes saves work
499 * during multiplications, but it often seems to make things slightly
500 * slower.  Hence the default is now to store 32 bits per Long.
501 */
502#endif
503#else	/* long long available */
504#ifndef Llong
505#define Llong long long
506#endif
507#ifndef ULLong
508#define ULLong unsigned Llong
509#endif
510#endif /* NO_LONG_LONG */
511
512#ifndef MULTIPLE_THREADS
513#define ACQUIRE_DTOA_LOCK(n)	/*nothing*/
514#define FREE_DTOA_LOCK(n)	/*nothing*/
515#endif
516
517#define Kmax 7
518
519double strtod(const char *s00, char **se);
520char *dtoa(double d, int mode, int ndigits,
521			int *decpt, int *sign, char **rve);
522
523 struct
524Bigint {
525	struct Bigint *next;
526	int k, maxwds, sign, wds;
527	ULong x[1];
528	};
529
530 typedef struct Bigint Bigint;
531
532 static Bigint *freelist[Kmax+1];
533
534 static Bigint *
535Balloc
536#ifdef KR_headers
537	(k) int k;
538#else
539	(int k)
540#endif
541{
542	int x;
543	Bigint *rv;
544#ifndef Omit_Private_Memory
545	unsigned int len;
546#endif
547
548	ACQUIRE_DTOA_LOCK(0);
549	/* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */
550	/* but this case seems very unlikely. */
551	if (k <= Kmax && freelist[k]) {
552		rv = freelist[k];
553		freelist[k] = rv->next;
554		}
555	else {
556		x = 1 << k;
557#ifdef Omit_Private_Memory
558		rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));
559#else
560		len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
561			/sizeof(double);
562		if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {
563			rv = (Bigint*)pmem_next;
564			pmem_next += len;
565			}
566		else
567			rv = (Bigint*)MALLOC(len*sizeof(double));
568#endif
569		rv->k = k;
570		rv->maxwds = x;
571		}
572	FREE_DTOA_LOCK(0);
573	rv->sign = rv->wds = 0;
574	return rv;
575	}
576
577 static void
578Bfree
579#ifdef KR_headers
580	(v) Bigint *v;
581#else
582	(Bigint *v)
583#endif
584{
585	if (v) {
586		if (v->k > Kmax)
587#ifdef FREE
588			FREE((void*)v);
589#else
590			free((void*)v);
591#endif
592		else {
593			ACQUIRE_DTOA_LOCK(0);
594			v->next = freelist[v->k];
595			freelist[v->k] = v;
596			FREE_DTOA_LOCK(0);
597			}
598		}
599	}
600
601#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
602y->wds*sizeof(Long) + 2*sizeof(int))
603
604 static Bigint *
605multadd
606#ifdef KR_headers
607	(b, m, a) Bigint *b; int m, a;
608#else
609	(Bigint *b, int m, int a)	/* multiply by m and add a */
610#endif
611{
612	int i, wds;
613#ifdef ULLong
614	ULong *x;
615	ULLong carry, y;
616#else
617	ULong carry, *x, y;
618#ifdef Pack_32
619	ULong xi, z;
620#endif
621#endif
622	Bigint *b1;
623
624	wds = b->wds;
625	x = b->x;
626	i = 0;
627	carry = a;
628	do {
629#ifdef ULLong
630		y = *x * (ULLong)m + carry;
631		carry = y >> 32;
632		*x++ = y & FFFFFFFF;
633#else
634#ifdef Pack_32
635		xi = *x;
636		y = (xi & 0xffff) * m + carry;
637		z = (xi >> 16) * m + (y >> 16);
638		carry = z >> 16;
639		*x++ = (z << 16) + (y & 0xffff);
640#else
641		y = *x * m + carry;
642		carry = y >> 16;
643		*x++ = y & 0xffff;
644#endif
645#endif
646		}
647		while(++i < wds);
648	if (carry) {
649		if (wds >= b->maxwds) {
650			b1 = Balloc(b->k+1);
651			Bcopy(b1, b);
652			Bfree(b);
653			b = b1;
654			}
655		b->x[wds++] = (ULong)carry;
656		b->wds = wds;
657		}
658	return b;
659	}
660
661 static Bigint *
662s2b
663#ifdef KR_headers
664	(s, nd0, nd, y9, dplen) CONST char *s; int nd0, nd, dplen; ULong y9;
665#else
666	(CONST char *s, int nd0, int nd, ULong y9, int dplen)
667#endif
668{
669	Bigint *b;
670	int i, k;
671	Long x, y;
672
673	x = (nd + 8) / 9;
674	for(k = 0, y = 1; x > y; y <<= 1, k++) ;
675#ifdef Pack_32
676	b = Balloc(k);
677	b->x[0] = y9;
678	b->wds = 1;
679#else
680	b = Balloc(k+1);
681	b->x[0] = y9 & 0xffff;
682	b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
683#endif
684
685	i = 9;
686	if (9 < nd0) {
687		s += 9;
688		do b = multadd(b, 10, *s++ - '0');
689			while(++i < nd0);
690		s += dplen;
691		}
692	else
693		s += dplen + 9;
694	for(; i < nd; i++)
695		b = multadd(b, 10, *s++ - '0');
696	return b;
697	}
698
699 static int
700hi0bits
701#ifdef KR_headers
702	(x) ULong x;
703#else
704	(ULong x)
705#endif
706{
707	int k = 0;
708
709	if (!(x & 0xffff0000)) {
710		k = 16;
711		x <<= 16;
712		}
713	if (!(x & 0xff000000)) {
714		k += 8;
715		x <<= 8;
716		}
717	if (!(x & 0xf0000000)) {
718		k += 4;
719		x <<= 4;
720		}
721	if (!(x & 0xc0000000)) {
722		k += 2;
723		x <<= 2;
724		}
725	if (!(x & 0x80000000)) {
726		k++;
727		if (!(x & 0x40000000))
728			return 32;
729		}
730	return k;
731	}
732
733 static int
734lo0bits
735#ifdef KR_headers
736	(y) ULong *y;
737#else
738	(ULong *y)
739#endif
740{
741	int k;
742	ULong x = *y;
743
744	if (x & 7) {
745		if (x & 1)
746			return 0;
747		if (x & 2) {
748			*y = x >> 1;
749			return 1;
750			}
751		*y = x >> 2;
752		return 2;
753		}
754	k = 0;
755	if (!(x & 0xffff)) {
756		k = 16;
757		x >>= 16;
758		}
759	if (!(x & 0xff)) {
760		k += 8;
761		x >>= 8;
762		}
763	if (!(x & 0xf)) {
764		k += 4;
765		x >>= 4;
766		}
767	if (!(x & 0x3)) {
768		k += 2;
769		x >>= 2;
770		}
771	if (!(x & 1)) {
772		k++;
773		x >>= 1;
774		if (!x)
775			return 32;
776		}
777	*y = x;
778	return k;
779	}
780
781 static Bigint *
782i2b
783#ifdef KR_headers
784	(i) int i;
785#else
786	(int i)
787#endif
788{
789	Bigint *b;
790
791	b = Balloc(1);
792	b->x[0] = i;
793	b->wds = 1;
794	return b;
795	}
796
797 static Bigint *
798mult
799#ifdef KR_headers
800	(a, b) Bigint *a, *b;
801#else
802	(Bigint *a, Bigint *b)
803#endif
804{
805	Bigint *c;
806	int k, wa, wb, wc;
807	ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
808	ULong y;
809#ifdef ULLong
810	ULLong carry, z;
811#else
812	ULong carry, z;
813#ifdef Pack_32
814	ULong z2;
815#endif
816#endif
817
818	if (a->wds < b->wds) {
819		c = a;
820		a = b;
821		b = c;
822		}
823	k = a->k;
824	wa = a->wds;
825	wb = b->wds;
826	wc = wa + wb;
827	if (wc > a->maxwds)
828		k++;
829	c = Balloc(k);
830	for(x = c->x, xa = x + wc; x < xa; x++)
831		*x = 0;
832	xa = a->x;
833	xae = xa + wa;
834	xb = b->x;
835	xbe = xb + wb;
836	xc0 = c->x;
837#ifdef ULLong
838	for(; xb < xbe; xc0++) {
839		y = *xb++;
840		if (y) {
841			x = xa;
842			xc = xc0;
843			carry = 0;
844			do {
845				z = *x++ * (ULLong)y + *xc + carry;
846				carry = z >> 32;
847				*xc++ = z & FFFFFFFF;
848				}
849				while(x < xae);
850			*xc = (ULong)carry;
851			}
852		}
853#else
854#ifdef Pack_32
855	for(; xb < xbe; xb++, xc0++) {
856		if (y = *xb & 0xffff) {
857			x = xa;
858			xc = xc0;
859			carry = 0;
860			do {
861				z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
862				carry = z >> 16;
863				z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
864				carry = z2 >> 16;
865				Storeinc(xc, z2, z);
866				}
867				while(x < xae);
868			*xc = carry;
869			}
870		if (y = *xb >> 16) {
871			x = xa;
872			xc = xc0;
873			carry = 0;
874			z2 = *xc;
875			do {
876				z = (*x & 0xffff) * y + (*xc >> 16) + carry;
877				carry = z >> 16;
878				Storeinc(xc, z, z2);
879				z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
880				carry = z2 >> 16;
881				}
882				while(x < xae);
883			*xc = z2;
884			}
885		}
886#else
887	for(; xb < xbe; xc0++) {
888		if (y = *xb++) {
889			x = xa;
890			xc = xc0;
891			carry = 0;
892			do {
893				z = *x++ * y + *xc + carry;
894				carry = z >> 16;
895				*xc++ = z & 0xffff;
896				}
897				while(x < xae);
898			*xc = carry;
899			}
900		}
901#endif
902#endif
903	for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
904	c->wds = wc;
905	return c;
906	}
907
908 static Bigint *p5s;
909
910 static Bigint *
911pow5mult
912#ifdef KR_headers
913	(b, k) Bigint *b; int k;
914#else
915	(Bigint *b, int k)
916#endif
917{
918	Bigint *b1, *p5, *p51;
919	int i;
920	static int p05[3] = { 5, 25, 125 };
921
922	i = k & 3;
923	if (i)
924		b = multadd(b, p05[i-1], 0);
925
926	if (!(k >>= 2))
927		return b;
928	p5 = p5s;
929	if (!p5) {
930		/* first time */
931#ifdef MULTIPLE_THREADS
932		ACQUIRE_DTOA_LOCK(1);
933		p5 = p5s;
934		if (!p5) {
935			p5 = p5s = i2b(625);
936			p5->next = 0;
937			}
938		FREE_DTOA_LOCK(1);
939#else
940		p5 = p5s = i2b(625);
941		p5->next = 0;
942#endif
943		}
944	for(;;) {
945		if (k & 1) {
946			b1 = mult(b, p5);
947			Bfree(b);
948			b = b1;
949			}
950		if (!(k >>= 1))
951			break;
952		p51 = p5->next;
953		if (!p51) {
954#ifdef MULTIPLE_THREADS
955			ACQUIRE_DTOA_LOCK(1);
956			p51 = p5->next;
957			if (!p51) {
958				p51 = p5->next = mult(p5,p5);
959				p51->next = 0;
960				}
961			FREE_DTOA_LOCK(1);
962#else
963			p51 = p5->next = mult(p5,p5);
964			p51->next = 0;
965#endif
966			}
967		p5 = p51;
968		}
969	return b;
970	}
971
972 static Bigint *
973lshift
974#ifdef KR_headers
975	(b, k) Bigint *b; int k;
976#else
977	(Bigint *b, int k)
978#endif
979{
980	int i, k1, n, n1;
981	Bigint *b1;
982	ULong *x, *x1, *xe, z;
983
984#ifdef Pack_32
985	n = k >> 5;
986#else
987	n = k >> 4;
988#endif
989	k1 = b->k;
990	n1 = n + b->wds + 1;
991	for(i = b->maxwds; n1 > i; i <<= 1)
992		k1++;
993	b1 = Balloc(k1);
994	x1 = b1->x;
995	for(i = 0; i < n; i++)
996		*x1++ = 0;
997	x = b->x;
998	xe = x + b->wds;
999#ifdef Pack_32
1000	if (k &= 0x1f) {
1001		k1 = 32 - k;
1002		z = 0;
1003		do {
1004			*x1++ = *x << k | z;
1005			z = *x++ >> k1;
1006			}
1007			while(x < xe);
1008		*x1 = z;
1009		if (*x1)
1010			++n1;
1011		}
1012#else
1013	if (k &= 0xf) {
1014		k1 = 16 - k;
1015		z = 0;
1016		do {
1017			*x1++ = *x << k  & 0xffff | z;
1018			z = *x++ >> k1;
1019			}
1020			while(x < xe);
1021		if (*x1 = z)
1022			++n1;
1023		}
1024#endif
1025	else do
1026		*x1++ = *x++;
1027		while(x < xe);
1028	b1->wds = n1 - 1;
1029	Bfree(b);
1030	return b1;
1031	}
1032
1033 static int
1034cmp
1035#ifdef KR_headers
1036	(a, b) Bigint *a, *b;
1037#else
1038	(Bigint *a, Bigint *b)
1039#endif
1040{
1041	ULong *xa, *xa0, *xb, *xb0;
1042	int i, j;
1043
1044	i = a->wds;
1045	j = b->wds;
1046#ifdef DEBUG
1047	if (i > 1 && !a->x[i-1])
1048		Bug("cmp called with a->x[a->wds-1] == 0");
1049	if (j > 1 && !b->x[j-1])
1050		Bug("cmp called with b->x[b->wds-1] == 0");
1051#endif
1052	if (i -= j)
1053		return i;
1054	xa0 = a->x;
1055	xa = xa0 + j;
1056	xb0 = b->x;
1057	xb = xb0 + j;
1058	for(;;) {
1059		if (*--xa != *--xb)
1060			return *xa < *xb ? -1 : 1;
1061		if (xa <= xa0)
1062			break;
1063		}
1064	return 0;
1065	}
1066
1067 static Bigint *
1068diff
1069#ifdef KR_headers
1070	(a, b) Bigint *a, *b;
1071#else
1072	(Bigint *a, Bigint *b)
1073#endif
1074{
1075	Bigint *c;
1076	int i, wa, wb;
1077	ULong *xa, *xae, *xb, *xbe, *xc;
1078#ifdef ULLong
1079	ULLong borrow, y;
1080#else
1081	ULong borrow, y;
1082#ifdef Pack_32
1083	ULong z;
1084#endif
1085#endif
1086
1087	i = cmp(a,b);
1088	if (!i) {
1089		c = Balloc(0);
1090		c->wds = 1;
1091		c->x[0] = 0;
1092		return c;
1093		}
1094	if (i < 0) {
1095		c = a;
1096		a = b;
1097		b = c;
1098		i = 1;
1099		}
1100	else
1101		i = 0;
1102	c = Balloc(a->k);
1103	c->sign = i;
1104	wa = a->wds;
1105	xa = a->x;
1106	xae = xa + wa;
1107	wb = b->wds;
1108	xb = b->x;
1109	xbe = xb + wb;
1110	xc = c->x;
1111	borrow = 0;
1112#ifdef ULLong
1113	do {
1114		y = (ULLong)*xa++ - *xb++ - borrow;
1115		borrow = y >> 32 & (ULong)1;
1116		*xc++ = y & FFFFFFFF;
1117		}
1118		while(xb < xbe);
1119	while(xa < xae) {
1120		y = *xa++ - borrow;
1121		borrow = y >> 32 & (ULong)1;
1122		*xc++ = y & FFFFFFFF;
1123		}
1124#else
1125#ifdef Pack_32
1126	do {
1127		y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
1128		borrow = (y & 0x10000) >> 16;
1129		z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
1130		borrow = (z & 0x10000) >> 16;
1131		Storeinc(xc, z, y);
1132		}
1133		while(xb < xbe);
1134	while(xa < xae) {
1135		y = (*xa & 0xffff) - borrow;
1136		borrow = (y & 0x10000) >> 16;
1137		z = (*xa++ >> 16) - borrow;
1138		borrow = (z & 0x10000) >> 16;
1139		Storeinc(xc, z, y);
1140		}
1141#else
1142	do {
1143		y = *xa++ - *xb++ - borrow;
1144		borrow = (y & 0x10000) >> 16;
1145		*xc++ = y & 0xffff;
1146		}
1147		while(xb < xbe);
1148	while(xa < xae) {
1149		y = *xa++ - borrow;
1150		borrow = (y & 0x10000) >> 16;
1151		*xc++ = y & 0xffff;
1152		}
1153#endif
1154#endif
1155	while(!*--xc)
1156		wa--;
1157	c->wds = wa;
1158	return c;
1159	}
1160
1161 static double
1162ulp
1163#ifdef KR_headers
1164	(x) U *x;
1165#else
1166	(U *x)
1167#endif
1168{
1169	Long L;
1170	U u;
1171
1172	L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
1173#ifndef Avoid_Underflow
1174#ifndef Sudden_Underflow
1175	if (L > 0) {
1176#endif
1177#endif
1178#ifdef IBM
1179		L |= Exp_msk1 >> 4;
1180#endif
1181		word0(&u) = L;
1182		word1(&u) = 0;
1183#ifndef Avoid_Underflow
1184#ifndef Sudden_Underflow
1185		}
1186	else {
1187		L = -L >> Exp_shift;
1188		if (L < Exp_shift) {
1189			word0(&u) = 0x80000 >> L;
1190			word1(&u) = 0;
1191			}
1192		else {
1193			word0(&u) = 0;
1194			L -= Exp_shift;
1195			word1(&u) = L >= 31 ? 1 : 1 << 31 - L;
1196			}
1197		}
1198#endif
1199#endif
1200	return dval(&u);
1201	}
1202
1203 static double
1204b2d
1205#ifdef KR_headers
1206	(a, e) Bigint *a; int *e;
1207#else
1208	(Bigint *a, int *e)
1209#endif
1210{
1211	ULong *xa, *xa0, w, y, z;
1212	int k;
1213	U d;
1214#ifdef VAX
1215	ULong d0, d1;
1216#else
1217#define d0 word0(&d)
1218#define d1 word1(&d)
1219#endif
1220
1221	xa0 = a->x;
1222	xa = xa0 + a->wds;
1223	y = *--xa;
1224#ifdef DEBUG
1225	if (!y) Bug("zero y in b2d");
1226#endif
1227	k = hi0bits(y);
1228	*e = 32 - k;
1229#ifdef Pack_32
1230	if (k < Ebits) {
1231		d0 = Exp_1 | y >> (Ebits - k);
1232		w = xa > xa0 ? *--xa : 0;
1233		d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
1234		goto ret_d;
1235		}
1236	z = xa > xa0 ? *--xa : 0;
1237	if (k -= Ebits) {
1238		d0 = Exp_1 | y << k | z >> (32 - k);
1239		y = xa > xa0 ? *--xa : 0;
1240		d1 = z << k | y >> (32 - k);
1241		}
1242	else {
1243		d0 = Exp_1 | y;
1244		d1 = z;
1245		}
1246#else
1247	if (k < Ebits + 16) {
1248		z = xa > xa0 ? *--xa : 0;
1249		d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;
1250		w = xa > xa0 ? *--xa : 0;
1251		y = xa > xa0 ? *--xa : 0;
1252		d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;
1253		goto ret_d;
1254		}
1255	z = xa > xa0 ? *--xa : 0;
1256	w = xa > xa0 ? *--xa : 0;
1257	k -= Ebits + 16;
1258	d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;
1259	y = xa > xa0 ? *--xa : 0;
1260	d1 = w << k + 16 | y << k;
1261#endif
1262 ret_d:
1263#ifdef VAX
1264	word0(&d) = d0 >> 16 | d0 << 16;
1265	word1(&d) = d1 >> 16 | d1 << 16;
1266#else
1267#undef d0
1268#undef d1
1269#endif
1270	return dval(&d);
1271	}
1272
1273 static Bigint *
1274d2b
1275#ifdef KR_headers
1276	(d, e, bits) U *d; int *e, *bits;
1277#else
1278	(U *d, int *e, int *bits)
1279#endif
1280{
1281	Bigint *b;
1282	int de, k;
1283	ULong *x, y, z;
1284#ifndef Sudden_Underflow
1285	int i;
1286#endif
1287#ifdef VAX
1288	ULong d0, d1;
1289	d0 = word0(d) >> 16 | word0(d) << 16;
1290	d1 = word1(d) >> 16 | word1(d) << 16;
1291#else
1292#define d0 word0(d)
1293#define d1 word1(d)
1294#endif
1295
1296#ifdef Pack_32
1297	b = Balloc(1);
1298#else
1299	b = Balloc(2);
1300#endif
1301	x = b->x;
1302
1303	z = d0 & Frac_mask;
1304	d0 &= 0x7fffffff;	/* clear sign bit, which we ignore */
1305#ifdef Sudden_Underflow
1306	de = (int)(d0 >> Exp_shift);
1307#ifndef IBM
1308	z |= Exp_msk11;
1309#endif
1310#else
1311	de = (int)(d0 >> Exp_shift);
1312	if (de)
1313		z |= Exp_msk1;
1314#endif
1315#ifdef Pack_32
1316	y = d1;
1317	if (y) {
1318		k = lo0bits(&y);
1319		if (k) {
1320			x[0] = y | z << (32 - k);
1321			z >>= k;
1322			}
1323		else
1324			x[0] = y;
1325		x[1] = z;
1326		b->wds = x[1] ? 2 : 1;
1327#ifndef Sudden_Underflow
1328		i = b->wds;
1329#endif
1330		}
1331	else {
1332		k = lo0bits(&z);
1333		x[0] = z;
1334#ifndef Sudden_Underflow
1335		i =
1336#endif
1337		    b->wds = 1;
1338		k += 32;
1339		}
1340#else
1341	if (y = d1) {
1342		if (k = lo0bits(&y))
1343			if (k >= 16) {
1344				x[0] = y | z << 32 - k & 0xffff;
1345				x[1] = z >> k - 16 & 0xffff;
1346				x[2] = z >> k;
1347				i = 2;
1348				}
1349			else {
1350				x[0] = y & 0xffff;
1351				x[1] = y >> 16 | z << 16 - k & 0xffff;
1352				x[2] = z >> k & 0xffff;
1353				x[3] = z >> k+16;
1354				i = 3;
1355				}
1356		else {
1357			x[0] = y & 0xffff;
1358			x[1] = y >> 16;
1359			x[2] = z & 0xffff;
1360			x[3] = z >> 16;
1361			i = 3;
1362			}
1363		}
1364	else {
1365#ifdef DEBUG
1366		if (!z)
1367			Bug("Zero passed to d2b");
1368#endif
1369		k = lo0bits(&z);
1370		if (k >= 16) {
1371			x[0] = z;
1372			i = 0;
1373			}
1374		else {
1375			x[0] = z & 0xffff;
1376			x[1] = z >> 16;
1377			i = 1;
1378			}
1379		k += 32;
1380		}
1381	while(!x[i])
1382		--i;
1383	b->wds = i + 1;
1384#endif
1385#ifndef Sudden_Underflow
1386	if (de) {
1387#endif
1388#ifdef IBM
1389		*e = (de - Bias - (P-1) << 2) + k;
1390		*bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);
1391#else
1392		*e = de - Bias - (P-1) + k;
1393		*bits = P - k;
1394#endif
1395#ifndef Sudden_Underflow
1396		}
1397	else {
1398		*e = de - Bias - (P-1) + 1 + k;
1399#ifdef Pack_32
1400		*bits = 32*i - hi0bits(x[i-1]);
1401#else
1402		*bits = (i+2)*16 - hi0bits(x[i]);
1403#endif
1404		}
1405#endif
1406	return b;
1407	}
1408#undef d0
1409#undef d1
1410
1411 static double
1412ratio
1413#ifdef KR_headers
1414	(a, b) Bigint *a, *b;
1415#else
1416	(Bigint *a, Bigint *b)
1417#endif
1418{
1419	U da, db;
1420	int k, ka, kb;
1421
1422	dval(&da) = b2d(a, &ka);
1423	dval(&db) = b2d(b, &kb);
1424#ifdef Pack_32
1425	k = ka - kb + 32*(a->wds - b->wds);
1426#else
1427	k = ka - kb + 16*(a->wds - b->wds);
1428#endif
1429#ifdef IBM
1430	if (k > 0) {
1431		word0(&da) += (k >> 2)*Exp_msk1;
1432		if (k &= 3)
1433			dval(&da) *= 1 << k;
1434		}
1435	else {
1436		k = -k;
1437		word0(&db) += (k >> 2)*Exp_msk1;
1438		if (k &= 3)
1439			dval(&db) *= 1 << k;
1440		}
1441#else
1442	if (k > 0)
1443		word0(&da) += k*Exp_msk1;
1444	else {
1445		k = -k;
1446		word0(&db) += k*Exp_msk1;
1447		}
1448#endif
1449	return dval(&da) / dval(&db);
1450	}
1451
1452 static CONST double
1453tens[] = {
1454		1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1455		1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1456		1e20, 1e21, 1e22
1457#ifdef VAX
1458		, 1e23, 1e24
1459#endif
1460		};
1461
1462 static CONST double
1463#ifdef IEEE_Arith
1464bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
1465static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
1466#ifdef Avoid_Underflow
1467		9007199254740992.*9007199254740992.e-256
1468		/* = 2^106 * 1e-256 */
1469#else
1470		1e-256
1471#endif
1472		};
1473/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */
1474/* flag unnecessarily.  It leads to a song and dance at the end of strtod. */
1475#define Scale_Bit 0x10
1476#define n_bigtens 5
1477#else
1478#ifdef IBM
1479bigtens[] = { 1e16, 1e32, 1e64 };
1480static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 };
1481#define n_bigtens 3
1482#else
1483bigtens[] = { 1e16, 1e32 };
1484static CONST double tinytens[] = { 1e-16, 1e-32 };
1485#define n_bigtens 2
1486#endif
1487#endif
1488
1489#undef Need_Hexdig
1490#ifdef INFNAN_CHECK
1491#ifndef No_Hex_NaN
1492#define Need_Hexdig
1493#endif
1494#endif
1495
1496#ifndef Need_Hexdig
1497#ifndef NO_HEX_FP
1498#define Need_Hexdig
1499#endif
1500#endif
1501
1502#ifdef Need_Hexdig /*{*/
1503static unsigned char hexdig[256];
1504
1505 static void
1506#ifdef KR_headers
1507htinit(h, s, inc) unsigned char *h; unsigned char *s; int inc;
1508#else
1509htinit(unsigned char *h, unsigned char *s, int inc)
1510#endif
1511{
1512	int i, j;
1513	for(i = 0; (j = s[i]) !=0; i++)
1514		h[j] = (unsigned char)(i + inc);
1515	}
1516
1517 static void
1518#ifdef KR_headers
1519hexdig_init()
1520#else
1521hexdig_init(void)
1522#endif
1523{
1524#define USC (unsigned char *)
1525	htinit(hexdig, USC "0123456789", 0x10);
1526	htinit(hexdig, USC "abcdef", 0x10 + 10);
1527	htinit(hexdig, USC "ABCDEF", 0x10 + 10);
1528	}
1529#endif /* } Need_Hexdig */
1530
1531#ifdef INFNAN_CHECK
1532
1533#ifndef NAN_WORD0
1534#define NAN_WORD0 0x7ff80000
1535#endif
1536
1537#ifndef NAN_WORD1
1538#define NAN_WORD1 0
1539#endif
1540
1541 static int
1542match
1543#ifdef KR_headers
1544	(sp, t) char **sp, *t;
1545#else
1546	(CONST char **sp, CONST char *t)
1547#endif
1548{
1549	int c, d;
1550	CONST char *s = *sp;
1551
1552	for(d = *t++; d; d = *t++) {
1553		if ((c = *++s) >= 'A' && c <= 'Z')
1554			c += 'a' - 'A';
1555		if (c != d)
1556			return 0;
1557		}
1558	*sp = s + 1;
1559	return 1;
1560	}
1561
1562#ifndef No_Hex_NaN
1563 static void
1564hexnan
1565#ifdef KR_headers
1566	(rvp, sp) U *rvp; CONST char **sp;
1567#else
1568	(U *rvp, CONST char **sp)
1569#endif
1570{
1571	ULong c, x[2];
1572	CONST char *s;
1573	int c1, havedig, udx0, xshift;
1574
1575	if (!hexdig['0'])
1576		hexdig_init();
1577	x[0] = x[1] = 0;
1578	havedig = xshift = 0;
1579	udx0 = 1;
1580	s = *sp;
1581	/* allow optional initial 0x or 0X */
1582	for(c = *(CONST unsigned char*)(s+1); c && c <= ' '; c = *(CONST unsigned char*)(s+1))
1583		++s;
1584	if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X'))
1585		s += 2;
1586	for(c = *(CONST unsigned char*)++s; c; c = *(CONST unsigned char*)++s) {
1587		c1 = hexdig[c];
1588		if (c1)
1589			c  = c1 & 0xf;
1590		else if (c <= ' ') {
1591			if (udx0 && havedig) {
1592				udx0 = 0;
1593				xshift = 1;
1594				}
1595			continue;
1596			}
1597#ifdef GDTOA_NON_PEDANTIC_NANCHECK
1598		else if (/*(*/ c == ')' && havedig) {
1599			*sp = s + 1;
1600			break;
1601			}
1602		else
1603			return;	/* invalid form: don't change *sp */
1604#else
1605		else {
1606			do {
1607				if (/*(*/ c == ')') {
1608					*sp = s + 1;
1609					break;
1610					}
1611				c = *++s;
1612				} while(c);
1613			break;
1614			}
1615#endif
1616		havedig = 1;
1617		if (xshift) {
1618			xshift = 0;
1619			x[0] = x[1];
1620			x[1] = 0;
1621			}
1622		if (udx0)
1623			x[0] = (x[0] << 4) | (x[1] >> 28);
1624		x[1] = (x[1] << 4) | c;
1625		}
1626	if ((x[0] &= 0xfffff) || x[1]) {
1627		word0(rvp) = Exp_mask | x[0];
1628		word1(rvp) = x[1];
1629		}
1630	}
1631#endif /*No_Hex_NaN*/
1632#endif /* INFNAN_CHECK */
1633
1634#ifdef Pack_32
1635#define ULbits 32
1636#define kshift 5
1637#define kmask 31
1638#else
1639#define ULbits 16
1640#define kshift 4
1641#define kmask 15
1642#endif
1643#ifndef NO_HEX_FP /*{*/
1644
1645 static void
1646#ifdef KR_headers
1647rshift(b, k) Bigint *b; int k;
1648#else
1649rshift(Bigint *b, int k)
1650#endif
1651{
1652	ULong *x, *x1, *xe, y;
1653	int n;
1654
1655	x = x1 = b->x;
1656	n = k >> kshift;
1657	if (n < b->wds) {
1658		xe = x + b->wds;
1659		x += n;
1660		if (k &= kmask) {
1661			n = 32 - k;
1662			y = *x++ >> k;
1663			while(x < xe) {
1664				*x1++ = (y | (*x << n)) & 0xffffffff;
1665				y = *x++ >> k;
1666				}
1667			if ((*x1 = y) !=0)
1668				x1++;
1669			}
1670		else
1671			while(x < xe)
1672				*x1++ = *x++;
1673		}
1674	if ((b->wds = x1 - b->x) == 0)
1675		b->x[0] = 0;
1676	}
1677
1678 static ULong
1679#ifdef KR_headers
1680any_on(b, k) Bigint *b; int k;
1681#else
1682any_on(Bigint *b, int k)
1683#endif
1684{
1685	int n, nwds;
1686	ULong *x, *x0, x1, x2;
1687
1688	x = b->x;
1689	nwds = b->wds;
1690	n = k >> kshift;
1691	if (n > nwds)
1692		n = nwds;
1693	else if (n < nwds && (k &= kmask)) {
1694		x1 = x2 = x[n];
1695		x1 >>= k;
1696		x1 <<= k;
1697		if (x1 != x2)
1698			return 1;
1699		}
1700	x0 = x;
1701	x += n;
1702	while(x > x0)
1703		if (*--x)
1704			return 1;
1705	return 0;
1706	}
1707
1708enum {	/* rounding values: same as FLT_ROUNDS */
1709	Round_zero = 0,
1710	Round_near = 1,
1711	Round_up = 2,
1712	Round_down = 3
1713	};
1714
1715 static Bigint *
1716#ifdef KR_headers
1717increment(b) Bigint *b;
1718#else
1719increment(Bigint *b)
1720#endif
1721{
1722	ULong *x, *xe;
1723	Bigint *b1;
1724
1725	x = b->x;
1726	xe = x + b->wds;
1727	do {
1728		if (*x < (ULong)0xffffffffL) {
1729			++*x;
1730			return b;
1731			}
1732		*x++ = 0;
1733		} while(x < xe);
1734	{
1735		if (b->wds >= b->maxwds) {
1736			b1 = Balloc(b->k+1);
1737			Bcopy(b1,b);
1738			Bfree(b);
1739			b = b1;
1740			}
1741		b->x[b->wds++] = 1;
1742		}
1743	return b;
1744	}
1745
1746 void
1747#ifdef KR_headers
1748gethex(sp, rvp, rounding, sign)
1749	CONST char **sp; U *rvp; int rounding, sign;
1750#else
1751gethex( CONST char **sp, U *rvp, int rounding, int sign)
1752#endif
1753{
1754	Bigint *b;
1755	CONST unsigned char *decpt, *s0, *s, *s1;
1756	Long e, e1;
1757	ULong L, lostbits, *x;
1758	int big, denorm, esign, havedig, k, n, nbits, up, zret;
1759#ifdef IBM
1760	int j;
1761#endif
1762	enum {
1763#ifdef IEEE_Arith /*{{*/
1764		emax = 0x7fe - Bias - P + 1,
1765		emin = Emin - P + 1
1766#else /*}{*/
1767		emin = Emin - P,
1768#ifdef VAX
1769		emax = 0x7ff - Bias - P + 1
1770#endif
1771#ifdef IBM
1772		emax = 0x7f - Bias - P
1773#endif
1774#endif /*}}*/
1775		};
1776#ifdef USE_LOCALE
1777	int i;
1778#ifdef NO_LOCALE_CACHE
1779	const unsigned char *decimalpoint = (unsigned char*)
1780		localeconv()->decimal_point;
1781#else
1782	const unsigned char *decimalpoint;
1783	static unsigned char *decimalpoint_cache;
1784	if (!(s0 = decimalpoint_cache)) {
1785		s0 = (unsigned char*)localeconv()->decimal_point;
1786		if ((decimalpoint_cache = (unsigned char*)
1787				MALLOC(strlen((CONST char*)s0) + 1))) {
1788			strcpy((char*)decimalpoint_cache, (CONST char*)s0);
1789			s0 = decimalpoint_cache;
1790			}
1791		}
1792	decimalpoint = s0;
1793#endif
1794#endif
1795
1796	if (!hexdig['0'])
1797		hexdig_init();
1798	havedig = 0;
1799	s0 = *(CONST unsigned char **)sp + 2;
1800	while(s0[havedig] == '0')
1801		havedig++;
1802	s0 += havedig;
1803	s = s0;
1804	decpt = 0;
1805	zret = 0;
1806	e = 0;
1807	if (hexdig[*s])
1808		havedig++;
1809	else {
1810		zret = 1;
1811#ifdef USE_LOCALE
1812		for(i = 0; decimalpoint[i]; ++i) {
1813			if (s[i] != decimalpoint[i])
1814				goto pcheck;
1815			}
1816		decpt = s += i;
1817#else
1818		if (*s != '.')
1819			goto pcheck;
1820		decpt = ++s;
1821#endif
1822		if (!hexdig[*s])
1823			goto pcheck;
1824		while(*s == '0')
1825			s++;
1826		if (hexdig[*s])
1827			zret = 0;
1828		havedig = 1;
1829		s0 = s;
1830		}
1831	while(hexdig[*s])
1832		s++;
1833#ifdef USE_LOCALE
1834	if (*s == *decimalpoint && !decpt) {
1835		for(i = 1; decimalpoint[i]; ++i) {
1836			if (s[i] != decimalpoint[i])
1837				goto pcheck;
1838			}
1839		decpt = s += i;
1840#else
1841	if (*s == '.' && !decpt) {
1842		decpt = ++s;
1843#endif
1844		while(hexdig[*s])
1845			s++;
1846		}/*}*/
1847	if (decpt)
1848		e = -(((Long)(s-decpt)) << 2);
1849 pcheck:
1850	s1 = s;
1851	big = esign = 0;
1852	switch(*s) {
1853	  case 'p':
1854	  case 'P':
1855		switch(*++s) {
1856		  case '-':
1857			esign = 1;
1858			/* no break */
1859		  case '+':
1860			s++;
1861		  }
1862		if ((n = hexdig[*s]) == 0 || n > 0x19) {
1863			s = s1;
1864			break;
1865			}
1866		e1 = n - 0x10;
1867		while((n = hexdig[*++s]) !=0 && n <= 0x19) {
1868			if (e1 & 0xf8000000)
1869				big = 1;
1870			e1 = 10*e1 + n - 0x10;
1871			}
1872		if (esign)
1873			e1 = -e1;
1874		e += e1;
1875	  }
1876	*sp = (char*)s;
1877	if (!havedig)
1878		*sp = (char*)s0 - 1;
1879	if (zret)
1880		goto retz1;
1881	if (big) {
1882		if (esign) {
1883#ifdef IEEE_Arith
1884			switch(rounding) {
1885			  case Round_up:
1886				if (sign)
1887					break;
1888				goto ret_tiny;
1889			  case Round_down:
1890				if (!sign)
1891					break;
1892				goto ret_tiny;
1893			  }
1894#endif
1895			goto retz;
1896#ifdef IEEE_Arith
1897 ret_tiny:
1898#ifndef NO_ERRNO
1899			errno = ERANGE;
1900#endif
1901			word0(rvp) = 0;
1902			word1(rvp) = 1;
1903			return;
1904#endif /* IEEE_Arith */
1905			}
1906		switch(rounding) {
1907		  case Round_near:
1908			goto ovfl1;
1909		  case Round_up:
1910			if (!sign)
1911				goto ovfl1;
1912			goto ret_big;
1913		  case Round_down:
1914			if (sign)
1915				goto ovfl1;
1916			goto ret_big;
1917		  }
1918 ret_big:
1919		word0(rvp) = Big0;
1920		word1(rvp) = Big1;
1921		return;
1922		}
1923	n = s1 - s0 - 1;
1924	for(k = 0; n > (1 << (kshift-2)) - 1; n >>= 1)
1925		k++;
1926	b = Balloc(k);
1927	x = b->x;
1928	n = 0;
1929	L = 0;
1930#ifdef USE_LOCALE
1931	for(i = 0; decimalpoint[i+1]; ++i);
1932#endif
1933	while(s1 > s0) {
1934#ifdef USE_LOCALE
1935		if (*--s1 == decimalpoint[i]) {
1936			s1 -= i;
1937			continue;
1938			}
1939#else
1940		if (*--s1 == '.')
1941			continue;
1942#endif
1943		if (n == ULbits) {
1944			*x++ = L;
1945			L = 0;
1946			n = 0;
1947			}
1948		L |= (hexdig[*s1] & 0x0f) << n;
1949		n += 4;
1950		}
1951	*x++ = L;
1952	b->wds = n = x - b->x;
1953	n = ULbits*n - hi0bits(L);
1954	nbits = Nbits;
1955	lostbits = 0;
1956	x = b->x;
1957	if (n > nbits) {
1958		n -= nbits;
1959		if (any_on(b,n)) {
1960			lostbits = 1;
1961			k = n - 1;
1962			if (x[k>>kshift] & 1 << (k & kmask)) {
1963				lostbits = 2;
1964				if (k > 0 && any_on(b,k))
1965					lostbits = 3;
1966				}
1967			}
1968		rshift(b, n);
1969		e += n;
1970		}
1971	else if (n < nbits) {
1972		n = nbits - n;
1973		b = lshift(b, n);
1974		e -= n;
1975		x = b->x;
1976		}
1977	if (e > Emax) {
1978 ovfl:
1979		Bfree(b);
1980 ovfl1:
1981#ifndef NO_ERRNO
1982		errno = ERANGE;
1983#endif
1984		word0(rvp) = Exp_mask;
1985		word1(rvp) = 0;
1986		return;
1987		}
1988	denorm = 0;
1989	if (e < emin) {
1990		denorm = 1;
1991		n = emin - e;
1992		if (n >= nbits) {
1993#ifdef IEEE_Arith /*{*/
1994			switch (rounding) {
1995			  case Round_near:
1996				if (n == nbits && (n < 2 || any_on(b,n-1)))
1997					goto ret_tiny;
1998				break;
1999			  case Round_up:
2000				if (!sign)
2001					goto ret_tiny;
2002				break;
2003			  case Round_down:
2004				if (sign)
2005					goto ret_tiny;
2006			  }
2007#endif /* } IEEE_Arith */
2008			Bfree(b);
2009 retz:
2010#ifndef NO_ERRNO
2011			errno = ERANGE;
2012#endif
2013 retz1:
2014			rvp->d = 0.;
2015			return;
2016			}
2017		k = n - 1;
2018		if (lostbits)
2019			lostbits = 1;
2020		else if (k > 0)
2021			lostbits = any_on(b,k);
2022		if (x[k>>kshift] & 1 << (k & kmask))
2023			lostbits |= 2;
2024		nbits -= n;
2025		rshift(b,n);
2026		e = emin;
2027		}
2028	if (lostbits) {
2029		up = 0;
2030		switch(rounding) {
2031		  case Round_zero:
2032			break;
2033		  case Round_near:
2034			if (lostbits & 2
2035			 && (lostbits & 1) | (x[0] & 1))
2036				up = 1;
2037			break;
2038		  case Round_up:
2039			up = 1 - sign;
2040			break;
2041		  case Round_down:
2042			up = sign;
2043		  }
2044		if (up) {
2045			k = b->wds;
2046			b = increment(b);
2047			x = b->x;
2048			if (denorm) {
2049#if 0
2050				if (nbits == Nbits - 1
2051				 && x[nbits >> kshift] & 1 << (nbits & kmask))
2052					denorm = 0; /* not currently used */
2053#endif
2054				}
2055			else if (b->wds > k
2056			 || ((n = nbits & kmask) !=0
2057			     && hi0bits(x[k-1]) < 32-n)) {
2058				rshift(b,1);
2059				if (++e > Emax)
2060					goto ovfl;
2061				}
2062			}
2063		}
2064#ifdef IEEE_Arith
2065	if (denorm)
2066		word0(rvp) = b->wds > 1 ? b->x[1] & ~0x100000 : 0;
2067	else
2068		word0(rvp) = (b->x[1] & ~0x100000) | ((e + 0x3ff + 52) << 20);
2069	word1(rvp) = b->x[0];
2070#endif
2071#ifdef IBM
2072	if ((j = e & 3)) {
2073		k = b->x[0] & ((1 << j) - 1);
2074		rshift(b,j);
2075		if (k) {
2076			switch(rounding) {
2077			  case Round_up:
2078				if (!sign)
2079					increment(b);
2080				break;
2081			  case Round_down:
2082				if (sign)
2083					increment(b);
2084				break;
2085			  case Round_near:
2086				j = 1 << (j-1);
2087				if (k & j && ((k & (j-1)) | lostbits))
2088					increment(b);
2089			  }
2090			}
2091		}
2092	e >>= 2;
2093	word0(rvp) = b->x[1] | ((e + 65 + 13) << 24);
2094	word1(rvp) = b->x[0];
2095#endif
2096#ifdef VAX
2097	/* The next two lines ignore swap of low- and high-order 2 bytes. */
2098	/* word0(rvp) = (b->x[1] & ~0x800000) | ((e + 129 + 55) << 23); */
2099	/* word1(rvp) = b->x[0]; */
2100	word0(rvp) = ((b->x[1] & ~0x800000) >> 16) | ((e + 129 + 55) << 7) | (b->x[1] << 16);
2101	word1(rvp) = (b->x[0] >> 16) | (b->x[0] << 16);
2102#endif
2103	Bfree(b);
2104	}
2105#endif /*}!NO_HEX_FP*/
2106
2107 static int
2108#ifdef KR_headers
2109dshift(b, p2) Bigint *b; int p2;
2110#else
2111dshift(Bigint *b, int p2)
2112#endif
2113{
2114	int rv = hi0bits(b->x[b->wds-1]) - 4;
2115	if (p2 > 0)
2116		rv -= p2;
2117	return rv & kmask;
2118	}
2119
2120 static int
2121quorem
2122#ifdef KR_headers
2123	(b, S) Bigint *b, *S;
2124#else
2125	(Bigint *b, Bigint *S)
2126#endif
2127{
2128	int n;
2129	ULong *bx, *bxe, q, *sx, *sxe;
2130#ifdef ULLong
2131	ULLong borrow, carry, y, ys;
2132#else
2133	ULong borrow, carry, y, ys;
2134#ifdef Pack_32
2135	ULong si, z, zs;
2136#endif
2137#endif
2138
2139	n = S->wds;
2140#ifdef DEBUG
2141	/*debug*/ if (b->wds > n)
2142	/*debug*/	Bug("oversize b in quorem");
2143#endif
2144	if (b->wds < n)
2145		return 0;
2146	sx = S->x;
2147	sxe = sx + --n;
2148	bx = b->x;
2149	bxe = bx + n;
2150	q = *bxe / (*sxe + 1);	/* ensure q <= true quotient */
2151#ifdef DEBUG
2152	/*debug*/ if (q > 9)
2153	/*debug*/	Bug("oversized quotient in quorem");
2154#endif
2155	if (q) {
2156		borrow = 0;
2157		carry = 0;
2158		do {
2159#ifdef ULLong
2160			ys = *sx++ * (ULLong)q + carry;
2161			carry = ys >> 32;
2162			y = *bx - (ys & FFFFFFFF) - borrow;
2163			borrow = y >> 32 & (ULong)1;
2164			*bx++ = y & FFFFFFFF;
2165#else
2166#ifdef Pack_32
2167			si = *sx++;
2168			ys = (si & 0xffff) * q + carry;
2169			zs = (si >> 16) * q + (ys >> 16);
2170			carry = zs >> 16;
2171			y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2172			borrow = (y & 0x10000) >> 16;
2173			z = (*bx >> 16) - (zs & 0xffff) - borrow;
2174			borrow = (z & 0x10000) >> 16;
2175			Storeinc(bx, z, y);
2176#else
2177			ys = *sx++ * q + carry;
2178			carry = ys >> 16;
2179			y = *bx - (ys & 0xffff) - borrow;
2180			borrow = (y & 0x10000) >> 16;
2181			*bx++ = y & 0xffff;
2182#endif
2183#endif
2184			}
2185			while(sx <= sxe);
2186		if (!*bxe) {
2187			bx = b->x;
2188			while(--bxe > bx && !*bxe)
2189				--n;
2190			b->wds = n;
2191			}
2192		}
2193	if (cmp(b, S) >= 0) {
2194		q++;
2195		borrow = 0;
2196		carry = 0;
2197		bx = b->x;
2198		sx = S->x;
2199		do {
2200#ifdef ULLong
2201			ys = *sx++ + carry;
2202			carry = ys >> 32;
2203			y = *bx - (ys & FFFFFFFF) - borrow;
2204			borrow = y >> 32 & (ULong)1;
2205			*bx++ = y & FFFFFFFF;
2206#else
2207#ifdef Pack_32
2208			si = *sx++;
2209			ys = (si & 0xffff) + carry;
2210			zs = (si >> 16) + (ys >> 16);
2211			carry = zs >> 16;
2212			y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2213			borrow = (y & 0x10000) >> 16;
2214			z = (*bx >> 16) - (zs & 0xffff) - borrow;
2215			borrow = (z & 0x10000) >> 16;
2216			Storeinc(bx, z, y);
2217#else
2218			ys = *sx++ + carry;
2219			carry = ys >> 16;
2220			y = *bx - (ys & 0xffff) - borrow;
2221			borrow = (y & 0x10000) >> 16;
2222			*bx++ = y & 0xffff;
2223#endif
2224#endif
2225			}
2226			while(sx <= sxe);
2227		bx = b->x;
2228		bxe = bx + n;
2229		if (!*bxe) {
2230			while(--bxe > bx && !*bxe)
2231				--n;
2232			b->wds = n;
2233			}
2234		}
2235	return q;
2236	}
2237
2238#ifndef NO_STRTOD_BIGCOMP
2239
2240 static void
2241bigcomp
2242#ifdef KR_headers
2243	(rv, s0, bc)
2244	U *rv; CONST char *s0; BCinfo *bc;
2245#else
2246	(U *rv, CONST char *s0, BCinfo *bc)
2247#endif
2248{
2249	Bigint *b, *d;
2250	int b2, bbits, d2, dd, dig, dsign, i, j, nd, nd0, p2, p5, speccase;
2251
2252	dsign = bc->dsign;
2253	nd = bc->nd;
2254	nd0 = bc->nd0;
2255	p5 = nd + bc->e0 - 1;
2256	dd = speccase = 0;
2257#ifndef Sudden_Underflow
2258	if (rv->d == 0.) {	/* special case: value near underflow-to-zero */
2259				/* threshold was rounded to zero */
2260		b = i2b(1);
2261		p2 = Emin - P + 1;
2262		bbits = 1;
2263#ifdef Avoid_Underflow
2264		word0(rv) = (P+2) << Exp_shift;
2265#else
2266		word1(rv) = 1;
2267#endif
2268		i = 0;
2269#ifdef Honor_FLT_ROUNDS
2270		if (bc->rounding == 1)
2271#endif
2272			{
2273			speccase = 1;
2274			--p2;
2275			dsign = 0;
2276			goto have_i;
2277			}
2278		}
2279	else
2280#endif
2281		b = d2b(rv, &p2, &bbits);
2282#ifdef Avoid_Underflow
2283	p2 -= bc->scale;
2284#endif
2285	/* floor(log2(rv)) == bbits - 1 + p2 */
2286	/* Check for denormal case. */
2287	i = P - bbits;
2288	if (i > (j = P - Emin - 1 + p2)) {
2289#ifdef Sudden_Underflow
2290		Bfree(b);
2291		b = i2b(1);
2292		p2 = Emin;
2293		i = P - 1;
2294#ifdef Avoid_Underflow
2295		word0(rv) = (1 + bc->scale) << Exp_shift;
2296#else
2297		word0(rv) = Exp_msk1;
2298#endif
2299		word1(rv) = 0;
2300#else
2301		i = j;
2302#endif
2303		}
2304#ifdef Honor_FLT_ROUNDS
2305	if (bc->rounding != 1) {
2306		if (i > 0)
2307			b = lshift(b, i);
2308		if (dsign)
2309			b = increment(b);
2310		}
2311	else
2312#endif
2313		{
2314		b = lshift(b, ++i);
2315		b->x[0] |= 1;
2316		}
2317#ifndef Sudden_Underflow
2318 have_i:
2319#endif
2320	p2 -= p5 + i;
2321	d = i2b(1);
2322	/* Arrange for convenient computation of quotients:
2323	 * shift left if necessary so divisor has 4 leading 0 bits.
2324	 */
2325	if (p5 > 0)
2326		d = pow5mult(d, p5);
2327	else if (p5 < 0)
2328		b = pow5mult(b, -p5);
2329	if (p2 > 0) {
2330		b2 = p2;
2331		d2 = 0;
2332		}
2333	else {
2334		b2 = 0;
2335		d2 = -p2;
2336		}
2337	i = dshift(d, d2);
2338	if ((b2 += i) > 0)
2339		b = lshift(b, b2);
2340	if ((d2 += i) > 0)
2341		d = lshift(d, d2);
2342
2343	/* Now b/d = exactly half-way between the two floating-point values */
2344	/* on either side of the input string.  Compute first digit of b/d. */
2345
2346	dig = quorem(b,d);
2347	if (!dig) {
2348		b = multadd(b, 10, 0);	/* very unlikely */
2349		dig = quorem(b,d);
2350		}
2351
2352	/* Compare b/d with s0 */
2353
2354	for(i = 0; i < nd0; ) {
2355		dd = s0[i++] - '0' - dig;
2356		if (dd)
2357			goto ret;
2358		if (!b->x[0] && b->wds == 1) {
2359			if (i < nd)
2360				dd = 1;
2361			goto ret;
2362			}
2363		b = multadd(b, 10, 0);
2364		dig = quorem(b,d);
2365		}
2366	for(j = bc->dp1; i++ < nd;) {
2367		dd = s0[j++] - '0' - dig;
2368		if (dd)
2369			goto ret;
2370		if (!b->x[0] && b->wds == 1) {
2371			if (i < nd)
2372				dd = 1;
2373			goto ret;
2374			}
2375		b = multadd(b, 10, 0);
2376		dig = quorem(b,d);
2377		}
2378	if (b->x[0] || b->wds > 1)
2379		dd = -1;
2380 ret:
2381	Bfree(b);
2382	Bfree(d);
2383#ifdef Honor_FLT_ROUNDS
2384	if (bc->rounding != 1) {
2385		if (dd < 0) {
2386			if (bc->rounding == 0) {
2387				if (!dsign)
2388					goto retlow1;
2389				}
2390			else if (dsign)
2391				goto rethi1;
2392			}
2393		else if (dd > 0) {
2394			if (bc->rounding == 0) {
2395				if (dsign)
2396					goto rethi1;
2397				goto ret1;
2398				}
2399			if (!dsign)
2400				goto rethi1;
2401			dval(rv) += 2.*ulp(rv);
2402			}
2403		else {
2404			bc->inexact = 0;
2405			if (dsign)
2406				goto rethi1;
2407			}
2408		}
2409	else
2410#endif
2411	if (speccase) {
2412		if (dd <= 0)
2413			rv->d = 0.;
2414		}
2415	else if (dd < 0) {
2416		if (!dsign)	/* does not happen for round-near */
2417retlow1:
2418			dval(rv) -= ulp(rv);
2419		}
2420	else if (dd > 0) {
2421		if (dsign) {
2422 rethi1:
2423			dval(rv) += ulp(rv);
2424			}
2425		}
2426	else {
2427		/* Exact half-way case:  apply round-even rule. */
2428		if (word1(rv) & 1) {
2429			if (dsign)
2430				goto rethi1;
2431			goto retlow1;
2432			}
2433		}
2434
2435#ifdef Honor_FLT_ROUNDS
2436 ret1:
2437#endif
2438	return;
2439	}
2440#endif /* NO_STRTOD_BIGCOMP */
2441
2442 double
2443strtod
2444#ifdef KR_headers
2445	(s00, se) CONST char *s00; char **se;
2446#else
2447	(CONST char *s00, char **se)
2448#endif
2449{
2450	int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, e, e1;
2451	int esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
2452	CONST char *s, *s0, *s1;
2453	double aadj, aadj1;
2454	Long L;
2455	U aadj2, adj, rv, rv0;
2456	ULong y, z;
2457	BCinfo bc;
2458	Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
2459#ifdef SET_INEXACT
2460	int oldinexact;
2461#endif
2462#ifdef Honor_FLT_ROUNDS /*{*/
2463#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
2464	bc.rounding = Flt_Rounds;
2465#else /*}{*/
2466	bc.rounding = 1;
2467	switch(fegetround()) {
2468	  case FE_TOWARDZERO:	bc.rounding = 0; break;
2469	  case FE_UPWARD:	bc.rounding = 2; break;
2470	  case FE_DOWNWARD:	bc.rounding = 3;
2471	  }
2472#endif /*}}*/
2473#endif /*}*/
2474#ifdef USE_LOCALE
2475	CONST char *s2;
2476#endif
2477
2478	sign = nz0 = nz = bc.dplen = bc.uflchk = 0;
2479	dval(&rv) = 0.;
2480	for(s = s00;;s++) switch(*s) {
2481		case '-':
2482			sign = 1;
2483			/* no break */
2484		case '+':
2485			if (*++s)
2486				goto break2;
2487			/* no break */
2488		case 0:
2489			goto ret0;
2490		case '\t':
2491		case '\n':
2492		case '\v':
2493		case '\f':
2494		case '\r':
2495		case ' ':
2496			continue;
2497		default:
2498			goto break2;
2499		}
2500 break2:
2501	if (*s == '0') {
2502#ifndef NO_HEX_FP /*{*/
2503		switch(s[1]) {
2504		  case 'x':
2505		  case 'X':
2506#ifdef Honor_FLT_ROUNDS
2507			gethex(&s, &rv, bc.rounding, sign);
2508#else
2509			gethex(&s, &rv, 1, sign);
2510#endif
2511			goto ret;
2512		  }
2513#endif /*}*/
2514		nz0 = 1;
2515		while(*++s == '0') ;
2516		if (!*s)
2517			goto ret;
2518		}
2519	s0 = s;
2520	y = z = 0;
2521	for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
2522		if (nd < 9)
2523			y = 10*y + c - '0';
2524		else if (nd < 16)
2525			z = 10*z + c - '0';
2526	nd0 = nd;
2527	bc.dp0 = bc.dp1 = s - s0;
2528#ifdef USE_LOCALE
2529	s1 = localeconv()->decimal_point;
2530	if (c == *s1) {
2531		c = '.';
2532		if (*++s1) {
2533			s2 = s;
2534			for(;;) {
2535				if (*++s2 != *s1) {
2536					c = 0;
2537					break;
2538					}
2539				if (!*++s1) {
2540					s = s2;
2541					break;
2542					}
2543				}
2544			}
2545		}
2546#endif
2547	if (c == '.') {
2548		c = *++s;
2549		bc.dp1 = s - s0;
2550		bc.dplen = bc.dp1 - bc.dp0;
2551		if (!nd) {
2552			for(; c == '0'; c = *++s)
2553				nz++;
2554			if (c > '0' && c <= '9') {
2555				s0 = s;
2556				nf += nz;
2557				nz = 0;
2558				goto have_dig;
2559				}
2560			goto dig_done;
2561			}
2562		for(; c >= '0' && c <= '9'; c = *++s) {
2563 have_dig:
2564			nz++;
2565			if (c -= '0') {
2566				nf += nz;
2567				for(i = 1; i < nz; i++)
2568					if (nd++ < 9)
2569						y *= 10;
2570					else if (nd <= DBL_DIG + 1)
2571						z *= 10;
2572				if (nd++ < 9)
2573					y = 10*y + c;
2574				else if (nd <= DBL_DIG + 1)
2575					z = 10*z + c;
2576				nz = 0;
2577				}
2578			}
2579		}
2580 dig_done:
2581	e = 0;
2582	if (c == 'e' || c == 'E') {
2583		if (!nd && !nz && !nz0) {
2584			goto ret0;
2585			}
2586		s00 = s;
2587		esign = 0;
2588		switch(c = *++s) {
2589			case '-':
2590				esign = 1;
2591			case '+':
2592				c = *++s;
2593			}
2594		if (c >= '0' && c <= '9') {
2595			while(c == '0')
2596				c = *++s;
2597			if (c > '0' && c <= '9') {
2598				L = c - '0';
2599				s1 = s;
2600				while((c = *++s) >= '0' && c <= '9')
2601					L = 10*L + c - '0';
2602				if (s - s1 > 8 || L > 19999)
2603					/* Avoid confusion from exponents
2604					 * so large that e might overflow.
2605					 */
2606					e = 19999; /* safe for 16 bit ints */
2607				else
2608					e = (int)L;
2609				if (esign)
2610					e = -e;
2611				}
2612			else
2613				e = 0;
2614			}
2615		else
2616			s = s00;
2617		}
2618	if (!nd) {
2619		if (!nz && !nz0) {
2620#ifdef INFNAN_CHECK
2621			/* Check for Nan and Infinity */
2622			if (!bc.dplen)
2623			 switch(c) {
2624			  case 'i':
2625			  case 'I':
2626				if (match(&s,"nf")) {
2627					--s;
2628					if (!match(&s,"inity"))
2629						++s;
2630					word0(&rv) = 0x7ff00000;
2631					word1(&rv) = 0;
2632					goto ret;
2633					}
2634				break;
2635			  case 'n':
2636			  case 'N':
2637				if (match(&s, "an")) {
2638					word0(&rv) = NAN_WORD0;
2639					word1(&rv) = NAN_WORD1;
2640#ifndef No_Hex_NaN
2641					if (*s == '(') /*)*/
2642						hexnan(&rv, &s);
2643#endif
2644					goto ret;
2645					}
2646			  }
2647#endif /* INFNAN_CHECK */
2648 ret0:
2649			s = s00;
2650			sign = 0;
2651			}
2652		goto ret;
2653		}
2654	bc.e0 = e1 = e -= nf;
2655
2656	/* Now we have nd0 digits, starting at s0, followed by a
2657	 * decimal point, followed by nd-nd0 digits.  The number we're
2658	 * after is the integer represented by those digits times
2659	 * 10**e */
2660
2661	if (!nd0)
2662		nd0 = nd;
2663	k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
2664	dval(&rv) = y;
2665	if (k > 9) {
2666#ifdef SET_INEXACT
2667		if (k > DBL_DIG)
2668			oldinexact = get_inexact();
2669#endif
2670		dval(&rv) = tens[k - 9] * dval(&rv) + z;
2671		}
2672	bd0 = 0;
2673	if (nd <= DBL_DIG
2674#ifndef RND_PRODQUOT
2675#ifndef Honor_FLT_ROUNDS
2676		&& Flt_Rounds == 1
2677#endif
2678#endif
2679			) {
2680		if (!e)
2681			goto ret;
2682		if (e > 0) {
2683			if (e <= Ten_pmax) {
2684#ifdef VAX
2685				goto vax_ovfl_check;
2686#else
2687#ifdef Honor_FLT_ROUNDS
2688				/* round correctly FLT_ROUNDS = 2 or 3 */
2689				if (sign) {
2690					rv.d = -rv.d;
2691					sign = 0;
2692					}
2693#endif
2694				/* rv = */ rounded_product(dval(&rv), tens[e]);
2695				goto ret;
2696#endif
2697				}
2698			i = DBL_DIG - nd;
2699			if (e <= Ten_pmax + i) {
2700				/* A fancier test would sometimes let us do
2701				 * this for larger i values.
2702				 */
2703#ifdef Honor_FLT_ROUNDS
2704				/* round correctly FLT_ROUNDS = 2 or 3 */
2705				if (sign) {
2706					rv.d = -rv.d;
2707					sign = 0;
2708					}
2709#endif
2710				e -= i;
2711				dval(&rv) *= tens[i];
2712#ifdef VAX
2713				/* VAX exponent range is so narrow we must
2714				 * worry about overflow here...
2715				 */
2716 vax_ovfl_check:
2717				word0(&rv) -= P*Exp_msk1;
2718				/* rv = */ rounded_product(dval(&rv), tens[e]);
2719				if ((word0(&rv) & Exp_mask)
2720				 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
2721					goto ovfl;
2722				word0(&rv) += P*Exp_msk1;
2723#else
2724				/* rv = */ rounded_product(dval(&rv), tens[e]);
2725#endif
2726				goto ret;
2727				}
2728			}
2729#ifndef Inaccurate_Divide
2730		else if (e >= -Ten_pmax) {
2731#ifdef Honor_FLT_ROUNDS
2732			/* round correctly FLT_ROUNDS = 2 or 3 */
2733			if (sign) {
2734				rv.d = -rv.d;
2735				sign = 0;
2736				}
2737#endif
2738			/* rv = */ rounded_quotient(dval(&rv), tens[-e]);
2739			goto ret;
2740			}
2741#endif
2742		}
2743	e1 += nd - k;
2744
2745#ifdef IEEE_Arith
2746#ifdef SET_INEXACT
2747	bc.inexact = 1;
2748	if (k <= DBL_DIG)
2749		oldinexact = get_inexact();
2750#endif
2751#ifdef Avoid_Underflow
2752	bc.scale = 0;
2753#endif
2754#ifdef Honor_FLT_ROUNDS
2755	if (bc.rounding >= 2) {
2756		if (sign)
2757			bc.rounding = bc.rounding == 2 ? 0 : 2;
2758		else
2759			if (bc.rounding != 2)
2760				bc.rounding = 0;
2761		}
2762#endif
2763#endif /*IEEE_Arith*/
2764
2765	/* Get starting approximation = rv * 10**e1 */
2766
2767	if (e1 > 0) {
2768		i = e1 & 15;
2769		if (i)
2770			dval(&rv) *= tens[i];
2771		if (e1 &= ~15) {
2772			if (e1 > DBL_MAX_10_EXP) {
2773 ovfl:
2774#ifndef NO_ERRNO
2775				errno = ERANGE;
2776#endif
2777				/* Can't trust HUGE_VAL */
2778#ifdef IEEE_Arith
2779#ifdef Honor_FLT_ROUNDS
2780				switch(bc.rounding) {
2781				  case 0: /* toward 0 */
2782				  case 3: /* toward -infinity */
2783					word0(&rv) = Big0;
2784					word1(&rv) = Big1;
2785					break;
2786				  default:
2787					word0(&rv) = Exp_mask;
2788					word1(&rv) = 0;
2789				  }
2790#else /*Honor_FLT_ROUNDS*/
2791				word0(&rv) = Exp_mask;
2792				word1(&rv) = 0;
2793#endif /*Honor_FLT_ROUNDS*/
2794#ifdef SET_INEXACT
2795				/* set overflow bit */
2796				dval(&rv0) = 1e300;
2797				dval(&rv0) *= dval(&rv0);
2798#endif
2799#else /*IEEE_Arith*/
2800				word0(&rv) = Big0;
2801				word1(&rv) = Big1;
2802#endif /*IEEE_Arith*/
2803				goto ret;
2804				}
2805			e1 >>= 4;
2806			for(j = 0; e1 > 1; j++, e1 >>= 1)
2807				if (e1 & 1)
2808					dval(&rv) *= bigtens[j];
2809		/* The last multiplication could overflow. */
2810			word0(&rv) -= P*Exp_msk1;
2811			dval(&rv) *= bigtens[j];
2812			if ((z = word0(&rv) & Exp_mask)
2813			 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
2814				goto ovfl;
2815			if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
2816				/* set to largest number */
2817				/* (Can't trust DBL_MAX) */
2818				word0(&rv) = Big0;
2819				word1(&rv) = Big1;
2820				}
2821			else
2822				word0(&rv) += P*Exp_msk1;
2823			}
2824		}
2825	else if (e1 < 0) {
2826		e1 = -e1;
2827		i = e1 & 15;
2828		if (i)
2829			dval(&rv) /= tens[i];
2830		if (e1 >>= 4) {
2831			if (e1 >= 1 << n_bigtens)
2832				goto undfl;
2833#ifdef Avoid_Underflow
2834			if (e1 & Scale_Bit)
2835				bc.scale = 2*P;
2836			for(j = 0; e1 > 0; j++, e1 >>= 1)
2837				if (e1 & 1)
2838					dval(&rv) *= tinytens[j];
2839			if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
2840						>> Exp_shift)) > 0) {
2841				/* scaled rv is denormal; clear j low bits */
2842				if (j >= 32) {
2843					word1(&rv) = 0;
2844					if (j >= 53)
2845					 word0(&rv) = (P+2)*Exp_msk1;
2846					else
2847					 word0(&rv) &= 0xffffffff << (j-32);
2848					}
2849				else
2850					word1(&rv) &= 0xffffffff << j;
2851				}
2852#else
2853			for(j = 0; e1 > 1; j++, e1 >>= 1)
2854				if (e1 & 1)
2855					dval(&rv) *= tinytens[j];
2856			/* The last multiplication could underflow. */
2857			dval(&rv0) = dval(&rv);
2858			dval(&rv) *= tinytens[j];
2859			if (!dval(&rv)) {
2860				dval(&rv) = 2.*dval(&rv0);
2861				dval(&rv) *= tinytens[j];
2862#endif
2863				if (!dval(&rv)) {
2864 undfl:
2865					dval(&rv) = 0.;
2866#ifndef NO_ERRNO
2867					errno = ERANGE;
2868#endif
2869					goto ret;
2870					}
2871#ifndef Avoid_Underflow
2872				word0(&rv) = Tiny0;
2873				word1(&rv) = Tiny1;
2874				/* The refinement below will clean
2875				 * this approximation up.
2876				 */
2877				}
2878#endif
2879			}
2880		}
2881
2882	/* Now the hard part -- adjusting rv to the correct value.*/
2883
2884	/* Put digits into bd: true value = bd * 10^e */
2885
2886	bc.nd = nd;
2887#ifndef NO_STRTOD_BIGCOMP
2888	bc.nd0 = nd0;	/* Only needed if nd > strtod_diglim, but done here */
2889			/* to silence an erroneous warning about bc.nd0 */
2890			/* possibly not being initialized. */
2891	if (nd > strtod_diglim) {
2892		/* ASSERT(strtod_diglim >= 18); 18 == one more than the */
2893		/* minimum number of decimal digits to distinguish double values */
2894		/* in IEEE arithmetic. */
2895		i = j = 18;
2896		if (i > nd0)
2897			j += bc.dplen;
2898		for(;;) {
2899			if (--j <= bc.dp1 && j >= bc.dp0)
2900				j = bc.dp0 - 1;
2901			if (s0[j] != '0')
2902				break;
2903			--i;
2904			}
2905		e += nd - i;
2906		nd = i;
2907		if (nd0 > nd)
2908			nd0 = nd;
2909		if (nd < 9) { /* must recompute y */
2910			y = 0;
2911			for(i = 0; i < nd0; ++i)
2912				y = 10*y + s0[i] - '0';
2913			for(j = bc.dp1; i < nd; ++i)
2914				y = 10*y + s0[j++] - '0';
2915			}
2916		}
2917#endif
2918	bd0 = s2b(s0, nd0, nd, y, bc.dplen);
2919
2920	for(;;) {
2921		bd = Balloc(bd0->k);
2922		Bcopy(bd, bd0);
2923		bb = d2b(&rv, &bbe, &bbbits);	/* rv = bb * 2^bbe */
2924		bs = i2b(1);
2925
2926		if (e >= 0) {
2927			bb2 = bb5 = 0;
2928			bd2 = bd5 = e;
2929			}
2930		else {
2931			bb2 = bb5 = -e;
2932			bd2 = bd5 = 0;
2933			}
2934		if (bbe >= 0)
2935			bb2 += bbe;
2936		else
2937			bd2 -= bbe;
2938		bs2 = bb2;
2939#ifdef Honor_FLT_ROUNDS
2940		if (bc.rounding != 1)
2941			bs2++;
2942#endif
2943#ifdef Avoid_Underflow
2944		j = bbe - bc.scale;
2945		i = j + bbbits - 1;	/* logb(rv) */
2946		if (i < Emin)	/* denormal */
2947			j += P - Emin;
2948		else
2949			j = P + 1 - bbbits;
2950#else /*Avoid_Underflow*/
2951#ifdef Sudden_Underflow
2952#ifdef IBM
2953		j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
2954#else
2955		j = P + 1 - bbbits;
2956#endif
2957#else /*Sudden_Underflow*/
2958		j = bbe;
2959		i = j + bbbits - 1;	/* logb(rv) */
2960		if (i < Emin)	/* denormal */
2961			j += P - Emin;
2962		else
2963			j = P + 1 - bbbits;
2964#endif /*Sudden_Underflow*/
2965#endif /*Avoid_Underflow*/
2966		bb2 += j;
2967		bd2 += j;
2968#ifdef Avoid_Underflow
2969		bd2 += bc.scale;
2970#endif
2971		i = bb2 < bd2 ? bb2 : bd2;
2972		if (i > bs2)
2973			i = bs2;
2974		if (i > 0) {
2975			bb2 -= i;
2976			bd2 -= i;
2977			bs2 -= i;
2978			}
2979		if (bb5 > 0) {
2980			bs = pow5mult(bs, bb5);
2981			bb1 = mult(bs, bb);
2982			Bfree(bb);
2983			bb = bb1;
2984			}
2985		if (bb2 > 0)
2986			bb = lshift(bb, bb2);
2987		if (bd5 > 0)
2988			bd = pow5mult(bd, bd5);
2989		if (bd2 > 0)
2990			bd = lshift(bd, bd2);
2991		if (bs2 > 0)
2992			bs = lshift(bs, bs2);
2993		delta = diff(bb, bd);
2994		bc.dsign = delta->sign;
2995		delta->sign = 0;
2996		i = cmp(delta, bs);
2997#ifndef NO_STRTOD_BIGCOMP
2998		if (bc.nd > nd && i <= 0) {
2999			if (bc.dsign)
3000				break;	/* Must use bigcomp(). */
3001#ifdef Honor_FLT_ROUNDS
3002			if (bc.rounding != 1) {
3003				if (i < 0)
3004					break;
3005				}
3006			else
3007#endif
3008				{
3009				bc.nd = nd;
3010				i = -1;	/* Discarded digits make delta smaller. */
3011				}
3012			}
3013#endif
3014#ifdef Honor_FLT_ROUNDS
3015		if (bc.rounding != 1) {
3016			if (i < 0) {
3017				/* Error is less than an ulp */
3018				if (!delta->x[0] && delta->wds <= 1) {
3019					/* exact */
3020#ifdef SET_INEXACT
3021					bc.inexact = 0;
3022#endif
3023					break;
3024					}
3025				if (bc.rounding) {
3026					if (bc.dsign) {
3027						adj.d = 1.;
3028						goto apply_adj;
3029						}
3030					}
3031				else if (!bc.dsign) {
3032					adj.d = -1.;
3033					if (!word1(&rv)
3034					 && !(word0(&rv) & Frac_mask)) {
3035						y = word0(&rv) & Exp_mask;
3036#ifdef Avoid_Underflow
3037						if (!bc.scale || y > 2*P*Exp_msk1)
3038#else
3039						if (y)
3040#endif
3041						  {
3042						  delta = lshift(delta,Log2P);
3043						  if (cmp(delta, bs) <= 0)
3044							adj.d = -0.5;
3045						  }
3046						}
3047 apply_adj:
3048#ifdef Avoid_Underflow
3049					if (bc.scale && (y = word0(&rv) & Exp_mask)
3050						<= 2*P*Exp_msk1)
3051					  word0(&adj) += (2*P+1)*Exp_msk1 - y;
3052#else
3053#ifdef Sudden_Underflow
3054					if ((word0(&rv) & Exp_mask) <=
3055							P*Exp_msk1) {
3056						word0(&rv) += P*Exp_msk1;
3057						dval(&rv) += adj.d*ulp(dval(&rv));
3058						word0(&rv) -= P*Exp_msk1;
3059						}
3060					else
3061#endif /*Sudden_Underflow*/
3062#endif /*Avoid_Underflow*/
3063					dval(&rv) += adj.d*ulp(&rv);
3064					}
3065				break;
3066				}
3067			adj.d = ratio(delta, bs);
3068			if (adj.d < 1.)
3069				adj.d = 1.;
3070			if (adj.d <= 0x7ffffffe) {
3071				/* adj = rounding ? ceil(adj) : floor(adj); */
3072				y = adj.d;
3073				if (y != adj.d) {
3074					if (!((bc.rounding>>1) ^ bc.dsign))
3075						y++;
3076					adj.d = y;
3077					}
3078				}
3079#ifdef Avoid_Underflow
3080			if (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
3081				word0(&adj) += (2*P+1)*Exp_msk1 - y;
3082#else
3083#ifdef Sudden_Underflow
3084			if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
3085				word0(&rv) += P*Exp_msk1;
3086				adj.d *= ulp(dval(&rv));
3087				if (bc.dsign)
3088					dval(&rv) += adj.d;
3089				else
3090					dval(&rv) -= adj.d;
3091				word0(&rv) -= P*Exp_msk1;
3092				goto cont;
3093				}
3094#endif /*Sudden_Underflow*/
3095#endif /*Avoid_Underflow*/
3096			adj.d *= ulp(&rv);
3097			if (bc.dsign) {
3098				if (word0(&rv) == Big0 && word1(&rv) == Big1)
3099					goto ovfl;
3100				dval(&rv) += adj.d;
3101				}
3102			else
3103				dval(&rv) -= adj.d;
3104			goto cont;
3105			}
3106#endif /*Honor_FLT_ROUNDS*/
3107
3108		if (i < 0) {
3109			/* Error is less than half an ulp -- check for
3110			 * special case of mantissa a power of two.
3111			 */
3112			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask
3113#ifdef IEEE_Arith
3114#ifdef Avoid_Underflow
3115			 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
3116#else
3117			 || (word0(&rv) & Exp_mask) <= Exp_msk1
3118#endif
3119#endif
3120				) {
3121#ifdef SET_INEXACT
3122				if (!delta->x[0] && delta->wds <= 1)
3123					bc.inexact = 0;
3124#endif
3125				break;
3126				}
3127			if (!delta->x[0] && delta->wds <= 1) {
3128				/* exact result */
3129#ifdef SET_INEXACT
3130				bc.inexact = 0;
3131#endif
3132				break;
3133				}
3134			delta = lshift(delta,Log2P);
3135			if (cmp(delta, bs) > 0)
3136				goto drop_down;
3137			break;
3138			}
3139		if (i == 0) {
3140			/* exactly half-way between */
3141			if (bc.dsign) {
3142				if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
3143				 &&  word1(&rv) == (
3144#ifdef Avoid_Underflow
3145			(bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
3146		? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
3147#endif
3148						   0xffffffff)) {
3149					/*boundary case -- increment exponent*/
3150					word0(&rv) = (word0(&rv) & Exp_mask)
3151						+ Exp_msk1
3152#ifdef IBM
3153						| Exp_msk1 >> 4
3154#endif
3155						;
3156					word1(&rv) = 0;
3157#ifdef Avoid_Underflow
3158					bc.dsign = 0;
3159#endif
3160					break;
3161					}
3162				}
3163			else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
3164 drop_down:
3165				/* boundary case -- decrement exponent */
3166#ifdef Sudden_Underflow /*{{*/
3167				L = word0(&rv) & Exp_mask;
3168#ifdef IBM
3169				if (L <  Exp_msk1)
3170#else
3171#ifdef Avoid_Underflow
3172				if (L <= (bc.scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
3173#else
3174				if (L <= Exp_msk1)
3175#endif /*Avoid_Underflow*/
3176#endif /*IBM*/
3177					{
3178					if (bc.nd >nd) {
3179						bc.uflchk = 1;
3180						break;
3181						}
3182					goto undfl;
3183					}
3184				L -= Exp_msk1;
3185#else /*Sudden_Underflow}{*/
3186#ifdef Avoid_Underflow
3187				if (bc.scale) {
3188					L = word0(&rv) & Exp_mask;
3189					if (L <= (2*P+1)*Exp_msk1) {
3190						if (L > (P+2)*Exp_msk1)
3191							/* round even ==> */
3192							/* accept rv */
3193							break;
3194						/* rv = smallest denormal */
3195						if (bc.nd >nd) {
3196							bc.uflchk = 1;
3197							break;
3198							}
3199						goto undfl;
3200						}
3201					}
3202#endif /*Avoid_Underflow*/
3203				L = (word0(&rv) & Exp_mask) - Exp_msk1;
3204#endif /*Sudden_Underflow}}*/
3205				word0(&rv) = L | Bndry_mask1;
3206				word1(&rv) = 0xffffffff;
3207#ifdef IBM
3208				goto cont;
3209#else
3210				break;
3211#endif
3212				}
3213#ifndef ROUND_BIASED
3214			if (!(word1(&rv) & LSB))
3215				break;
3216#endif
3217			if (bc.dsign)
3218				dval(&rv) += ulp(&rv);
3219#ifndef ROUND_BIASED
3220			else {
3221				dval(&rv) -= ulp(&rv);
3222#ifndef Sudden_Underflow
3223				if (!dval(&rv)) {
3224					if (bc.nd >nd) {
3225						bc.uflchk = 1;
3226						break;
3227						}
3228					goto undfl;
3229					}
3230#endif
3231				}
3232#ifdef Avoid_Underflow
3233			bc.dsign = 1 - bc.dsign;
3234#endif
3235#endif
3236			break;
3237			}
3238		if ((aadj = ratio(delta, bs)) <= 2.) {
3239			if (bc.dsign)
3240				aadj = aadj1 = 1.;
3241			else if (word1(&rv) || word0(&rv) & Bndry_mask) {
3242#ifndef Sudden_Underflow
3243				if (word1(&rv) == Tiny1 && !word0(&rv)) {
3244					if (bc.nd >nd) {
3245						bc.uflchk = 1;
3246						break;
3247						}
3248					goto undfl;
3249					}
3250#endif
3251				aadj = 1.;
3252				aadj1 = -1.;
3253				}
3254			else {
3255				/* special case -- power of FLT_RADIX to be */
3256				/* rounded down... */
3257
3258				if (aadj < 2./FLT_RADIX)
3259					aadj = 1./FLT_RADIX;
3260				else
3261					aadj *= 0.5;
3262				aadj1 = -aadj;
3263				}
3264			}
3265		else {
3266			aadj *= 0.5;
3267			aadj1 = bc.dsign ? aadj : -aadj;
3268#ifdef Check_FLT_ROUNDS
3269			switch(bc.rounding) {
3270				case 2: /* towards +infinity */
3271					aadj1 -= 0.5;
3272					break;
3273				case 0: /* towards 0 */
3274				case 3: /* towards -infinity */
3275					aadj1 += 0.5;
3276				}
3277#else
3278			if (Flt_Rounds == 0)
3279				aadj1 += 0.5;
3280#endif /*Check_FLT_ROUNDS*/
3281			}
3282		y = word0(&rv) & Exp_mask;
3283
3284		/* Check for overflow */
3285
3286		if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
3287			dval(&rv0) = dval(&rv);
3288			word0(&rv) -= P*Exp_msk1;
3289			adj.d = aadj1 * ulp(&rv);
3290			dval(&rv) += adj.d;
3291			if ((word0(&rv) & Exp_mask) >=
3292					Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
3293				if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
3294					goto ovfl;
3295				word0(&rv) = Big0;
3296				word1(&rv) = Big1;
3297				goto cont;
3298				}
3299			else
3300				word0(&rv) += P*Exp_msk1;
3301			}
3302		else {
3303#ifdef Avoid_Underflow
3304			if (bc.scale && y <= 2*P*Exp_msk1) {
3305				if (aadj <= 0x7fffffff) {
3306					if ((z = (ULong)aadj) <= 0)
3307						z = 1;
3308					aadj = z;
3309					aadj1 = bc.dsign ? aadj : -aadj;
3310					}
3311				dval(&aadj2) = aadj1;
3312				word0(&aadj2) += (2*P+1)*Exp_msk1 - y;
3313				aadj1 = dval(&aadj2);
3314				}
3315			adj.d = aadj1 * ulp(&rv);
3316			dval(&rv) += adj.d;
3317#else
3318#ifdef Sudden_Underflow
3319			if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
3320				dval(&rv0) = dval(&rv);
3321				word0(&rv) += P*Exp_msk1;
3322				adj.d = aadj1 * ulp(&rv);
3323				dval(&rv) += adj.d;
3324#ifdef IBM
3325				if ((word0(&rv) & Exp_mask) <  P*Exp_msk1)
3326#else
3327				if ((word0(&rv) & Exp_mask) <= P*Exp_msk1)
3328#endif
3329					{
3330					if (word0(&rv0) == Tiny0
3331					 && word1(&rv0) == Tiny1) {
3332						if (bc.nd >nd) {
3333							bc.uflchk = 1;
3334							break;
3335							}
3336						goto undfl;
3337						}
3338					word0(&rv) = Tiny0;
3339					word1(&rv) = Tiny1;
3340					goto cont;
3341					}
3342				else
3343					word0(&rv) -= P*Exp_msk1;
3344				}
3345			else {
3346				adj.d = aadj1 * ulp(&rv);
3347				dval(&rv) += adj.d;
3348				}
3349#else /*Sudden_Underflow*/
3350			/* Compute adj so that the IEEE rounding rules will
3351			 * correctly round rv + adj in some half-way cases.
3352			 * If rv * ulp(rv) is denormalized (i.e.,
3353			 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
3354			 * trouble from bits lost to denormalization;
3355			 * example: 1.2e-307 .
3356			 */
3357			if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
3358				aadj1 = (double)(int)(aadj + 0.5);
3359				if (!bc.dsign)
3360					aadj1 = -aadj1;
3361				}
3362			adj.d = aadj1 * ulp(&rv);
3363			dval(&rv) += adj.d;
3364#endif /*Sudden_Underflow*/
3365#endif /*Avoid_Underflow*/
3366			}
3367		z = word0(&rv) & Exp_mask;
3368#ifndef SET_INEXACT
3369		if (bc.nd == nd) {
3370#ifdef Avoid_Underflow
3371		if (!bc.scale)
3372#endif
3373		if (y == z) {
3374			/* Can we stop now? */
3375			L = (Long)aadj;
3376			aadj -= L;
3377			/* The tolerances below are conservative. */
3378			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
3379				if (aadj < .4999999 || aadj > .5000001)
3380					break;
3381				}
3382			else if (aadj < .4999999/FLT_RADIX)
3383				break;
3384			}
3385		}
3386#endif
3387 cont:
3388		Bfree(bb);
3389		Bfree(bd);
3390		Bfree(bs);
3391		Bfree(delta);
3392		}
3393	Bfree(bb);
3394	Bfree(bd);
3395	Bfree(bs);
3396	Bfree(bd0);
3397	Bfree(delta);
3398#ifndef NO_STRTOD_BIGCOMP
3399	if (bc.nd > nd)
3400		bigcomp(&rv, s0, &bc);
3401#endif
3402#ifdef SET_INEXACT
3403	if (bc.inexact) {
3404		if (!oldinexact) {
3405			word0(&rv0) = Exp_1 + (70 << Exp_shift);
3406			word1(&rv0) = 0;
3407			dval(&rv0) += 1.;
3408			}
3409		}
3410	else if (!oldinexact)
3411		clear_inexact();
3412#endif
3413#ifdef Avoid_Underflow
3414	if (bc.scale) {
3415		word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
3416		word1(&rv0) = 0;
3417		dval(&rv) *= dval(&rv0);
3418#ifndef NO_ERRNO
3419		/* try to avoid the bug of testing an 8087 register value */
3420#ifdef IEEE_Arith
3421		if (!(word0(&rv) & Exp_mask))
3422#else
3423		if (word0(&rv) == 0 && word1(&rv) == 0)
3424#endif
3425			errno = ERANGE;
3426#endif
3427		}
3428#endif /* Avoid_Underflow */
3429#ifdef SET_INEXACT
3430	if (bc.inexact && !(word0(&rv) & Exp_mask)) {
3431		/* set underflow bit */
3432		dval(&rv0) = 1e-300;
3433		dval(&rv0) *= dval(&rv0);
3434		}
3435#endif
3436 ret:
3437	if (se)
3438		*se = (char *)s;
3439	return sign ? -dval(&rv) : dval(&rv);
3440	}
3441
3442#ifndef MULTIPLE_THREADS
3443 static char *dtoa_result;
3444#endif
3445
3446 static char *
3447#ifdef KR_headers
3448rv_alloc(i) int i;
3449#else
3450rv_alloc(int i)
3451#endif
3452{
3453	int j, k, *r;
3454
3455	j = sizeof(ULong);
3456	for(k = 0;
3457		sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (size_t)i;
3458		j <<= 1)
3459			k++;
3460	r = (int*)Balloc(k);
3461	*r = k;
3462	return
3463#ifndef MULTIPLE_THREADS
3464	dtoa_result =
3465#endif
3466		(char *)(r+1);
3467	}
3468
3469 static char *
3470#ifdef KR_headers
3471nrv_alloc(s, rve, n) char *s, **rve; int n;
3472#else
3473nrv_alloc(CONST char *s, char **rve, int n)
3474#endif
3475{
3476	char *rv, *t;
3477
3478	t = rv = rv_alloc(n);
3479	for(*t = *s++; *t; *t = *s++) t++;
3480	if (rve)
3481		*rve = t;
3482	return rv;
3483	}
3484
3485/* freedtoa(s) must be used to free values s returned by dtoa
3486 * when MULTIPLE_THREADS is #defined.  It should be used in all cases,
3487 * but for consistency with earlier versions of dtoa, it is optional
3488 * when MULTIPLE_THREADS is not defined.
3489 */
3490
3491 void
3492#ifdef KR_headers
3493freedtoa(s) char *s;
3494#else
3495freedtoa(char *s)
3496#endif
3497{
3498	Bigint *b = (Bigint *)((int *)s - 1);
3499	b->maxwds = 1 << (b->k = *(int*)b);
3500	Bfree(b);
3501#ifndef MULTIPLE_THREADS
3502	if (s == dtoa_result)
3503		dtoa_result = 0;
3504#endif
3505	}
3506
3507/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
3508 *
3509 * Inspired by "How to Print Floating-Point Numbers Accurately" by
3510 * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
3511 *
3512 * Modifications:
3513 *	1. Rather than iterating, we use a simple numeric overestimate
3514 *	   to determine k = floor(log10(d)).  We scale relevant
3515 *	   quantities using O(log2(k)) rather than O(k) multiplications.
3516 *	2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
3517 *	   try to generate digits strictly left to right.  Instead, we
3518 *	   compute with fewer bits and propagate the carry if necessary
3519 *	   when rounding the final digit up.  This is often faster.
3520 *	3. Under the assumption that input will be rounded nearest,
3521 *	   mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
3522 *	   That is, we allow equality in stopping tests when the
3523 *	   round-nearest rule will give the same floating-point value
3524 *	   as would satisfaction of the stopping test with strict
3525 *	   inequality.
3526 *	4. We remove common factors of powers of 2 from relevant
3527 *	   quantities.
3528 *	5. When converting floating-point integers less than 1e16,
3529 *	   we use floating-point arithmetic rather than resorting
3530 *	   to multiple-precision integers.
3531 *	6. When asked to produce fewer than 15 digits, we first try
3532 *	   to get by with floating-point arithmetic; we resort to
3533 *	   multiple-precision integer arithmetic only if we cannot
3534 *	   guarantee that the floating-point calculation has given
3535 *	   the correctly rounded result.  For k requested digits and
3536 *	   "uniformly" distributed input, the probability is
3537 *	   something like 10^(k-15) that we must resort to the Long
3538 *	   calculation.
3539 */
3540
3541 char *
3542dtoa
3543#ifdef KR_headers
3544	(dd, mode, ndigits, decpt, sign, rve)
3545	double dd; int mode, ndigits, *decpt, *sign; char **rve;
3546#else
3547	(double dd, int mode, int ndigits, int *decpt, int *sign, char **rve)
3548#endif
3549{
3550 /*	Arguments ndigits, decpt, sign are similar to those
3551	of ecvt and fcvt; trailing zeros are suppressed from
3552	the returned string.  If not null, *rve is set to point
3553	to the end of the return value.  If d is +-Infinity or NaN,
3554	then *decpt is set to 9999.
3555
3556	mode:
3557		0 ==> shortest string that yields d when read in
3558			and rounded to nearest.
3559		1 ==> like 0, but with Steele & White stopping rule;
3560			e.g. with IEEE P754 arithmetic , mode 0 gives
3561			1e23 whereas mode 1 gives 9.999999999999999e22.
3562		2 ==> max(1,ndigits) significant digits.  This gives a
3563			return value similar to that of ecvt, except
3564			that trailing zeros are suppressed.
3565		3 ==> through ndigits past the decimal point.  This
3566			gives a return value similar to that from fcvt,
3567			except that trailing zeros are suppressed, and
3568			ndigits can be negative.
3569		4,5 ==> similar to 2 and 3, respectively, but (in
3570			round-nearest mode) with the tests of mode 0 to
3571			possibly return a shorter string that rounds to d.
3572			With IEEE arithmetic and compilation with
3573			-DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
3574			as modes 2 and 3 when FLT_ROUNDS != 1.
3575		6-9 ==> Debugging modes similar to mode - 4:  don't try
3576			fast floating-point estimate (if applicable).
3577
3578		Values of mode other than 0-9 are treated as mode 0.
3579
3580		Sufficient space is allocated to the return value
3581		to hold the suppressed trailing zeros.
3582	*/
3583
3584	int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
3585		j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
3586		spec_case, try_quick;
3587	Long L;
3588#ifndef Sudden_Underflow
3589	int denorm;
3590	ULong x;
3591#endif
3592	Bigint *b, *b1, *delta, *mlo = NULL, *mhi, *S;
3593	U d2, eps, u;
3594	double ds;
3595	char *s, *s0;
3596#ifdef SET_INEXACT
3597	int inexact, oldinexact;
3598#endif
3599#ifdef Honor_FLT_ROUNDS /*{*/
3600	int Rounding;
3601#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
3602	Rounding = Flt_Rounds;
3603#else /*}{*/
3604	Rounding = 1;
3605	switch(fegetround()) {
3606	  case FE_TOWARDZERO:	Rounding = 0; break;
3607	  case FE_UPWARD:	Rounding = 2; break;
3608	  case FE_DOWNWARD:	Rounding = 3;
3609	  }
3610#endif /*}}*/
3611#endif /*}*/
3612
3613#ifndef MULTIPLE_THREADS
3614	if (dtoa_result) {
3615		freedtoa(dtoa_result);
3616		dtoa_result = 0;
3617		}
3618#endif
3619
3620	u.d = dd;
3621	if (word0(&u) & Sign_bit) {
3622		/* set sign for everything, including 0's and NaNs */
3623		*sign = 1;
3624		word0(&u) &= ~Sign_bit;	/* clear sign bit */
3625		}
3626	else
3627		*sign = 0;
3628
3629#if defined(IEEE_Arith) + defined(VAX)
3630#ifdef IEEE_Arith
3631	if ((word0(&u) & Exp_mask) == Exp_mask)
3632#else
3633	if (word0(&u)  == 0x8000)
3634#endif
3635		{
3636		/* Infinity or NaN */
3637		*decpt = 9999;
3638#ifdef IEEE_Arith
3639		if (!word1(&u) && !(word0(&u) & 0xfffff))
3640			return nrv_alloc("Infinity", rve, 8);
3641#endif
3642		return nrv_alloc("NaN", rve, 3);
3643		}
3644#endif
3645#ifdef IBM
3646	dval(&u) += 0; /* normalize */
3647#endif
3648	if (!dval(&u)) {
3649		*decpt = 1;
3650		return nrv_alloc("0", rve, 1);
3651		}
3652
3653#ifdef SET_INEXACT
3654	try_quick = oldinexact = get_inexact();
3655	inexact = 1;
3656#endif
3657#ifdef Honor_FLT_ROUNDS
3658	if (Rounding >= 2) {
3659		if (*sign)
3660			Rounding = Rounding == 2 ? 0 : 2;
3661		else
3662			if (Rounding != 2)
3663				Rounding = 0;
3664		}
3665#endif
3666
3667	b = d2b(&u, &be, &bbits);
3668	i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
3669#ifndef Sudden_Underflow
3670	if (i) {
3671#endif
3672		dval(&d2) = dval(&u);
3673		word0(&d2) &= Frac_mask1;
3674		word0(&d2) |= Exp_11;
3675#ifdef IBM
3676		if (j = 11 - hi0bits(word0(&d2) & Frac_mask))
3677			dval(&d2) /= 1 << j;
3678#endif
3679
3680		/* log(x)	~=~ log(1.5) + (x-1.5)/1.5
3681		 * log10(x)	 =  log(x) / log(10)
3682		 *		~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
3683		 * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
3684		 *
3685		 * This suggests computing an approximation k to log10(d) by
3686		 *
3687		 * k = (i - Bias)*0.301029995663981
3688		 *	+ ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
3689		 *
3690		 * We want k to be too large rather than too small.
3691		 * The error in the first-order Taylor series approximation
3692		 * is in our favor, so we just round up the constant enough
3693		 * to compensate for any error in the multiplication of
3694		 * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
3695		 * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
3696		 * adding 1e-13 to the constant term more than suffices.
3697		 * Hence we adjust the constant term to 0.1760912590558.
3698		 * (We could get a more accurate k by invoking log10,
3699		 *  but this is probably not worthwhile.)
3700		 */
3701
3702		i -= Bias;
3703#ifdef IBM
3704		i <<= 2;
3705		i += j;
3706#endif
3707#ifndef Sudden_Underflow
3708		denorm = 0;
3709		}
3710	else {
3711		/* d is denormalized */
3712
3713		i = bbits + be + (Bias + (P-1) - 1);
3714		x = i > 32  ? word0(&u) << (64 - i) | word1(&u) >> (i - 32)
3715			    : word1(&u) << (32 - i);
3716		dval(&d2) = x;
3717		word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
3718		i -= (Bias + (P-1) - 1) + 1;
3719		denorm = 1;
3720		}
3721#endif
3722	ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
3723	k = (int)ds;
3724	if (ds < 0. && ds != k)
3725		k--;	/* want k = floor(ds) */
3726	k_check = 1;
3727	if (k >= 0 && k <= Ten_pmax) {
3728		if (dval(&u) < tens[k])
3729			k--;
3730		k_check = 0;
3731		}
3732	j = bbits - i - 1;
3733	if (j >= 0) {
3734		b2 = 0;
3735		s2 = j;
3736		}
3737	else {
3738		b2 = -j;
3739		s2 = 0;
3740		}
3741	if (k >= 0) {
3742		b5 = 0;
3743		s5 = k;
3744		s2 += k;
3745		}
3746	else {
3747		b2 -= k;
3748		b5 = -k;
3749		s5 = 0;
3750		}
3751	if (mode < 0 || mode > 9)
3752		mode = 0;
3753
3754#ifndef SET_INEXACT
3755#ifdef Check_FLT_ROUNDS
3756	try_quick = Rounding == 1;
3757#else
3758	try_quick = 1;
3759#endif
3760#endif /*SET_INEXACT*/
3761
3762	if (mode > 5) {
3763		mode -= 4;
3764		try_quick = 0;
3765		}
3766	leftright = 1;
3767	ilim = ilim1 = -1;	/* Values for cases 0 and 1; done here to */
3768				/* silence erroneous "gcc -Wall" warning. */
3769	switch(mode) {
3770		case 0:
3771		case 1:
3772			i = 18;
3773			ndigits = 0;
3774			break;
3775		case 2:
3776			leftright = 0;
3777			/* no break */
3778		case 4:
3779			if (ndigits <= 0)
3780				ndigits = 1;
3781			ilim = ilim1 = i = ndigits;
3782			break;
3783		case 3:
3784			leftright = 0;
3785			/* no break */
3786		case 5:
3787			i = ndigits + k + 1;
3788			ilim = i;
3789			ilim1 = i - 1;
3790			if (i <= 0)
3791				i = 1;
3792		}
3793	s = s0 = rv_alloc(i);
3794
3795#ifdef Honor_FLT_ROUNDS
3796	if (mode > 1 && Rounding != 1)
3797		leftright = 0;
3798#endif
3799
3800	if (ilim >= 0 && ilim <= Quick_max && try_quick) {
3801
3802		/* Try to get by with floating-point arithmetic. */
3803
3804		i = 0;
3805		dval(&d2) = dval(&u);
3806		k0 = k;
3807		ilim0 = ilim;
3808		ieps = 2; /* conservative */
3809		if (k > 0) {
3810			ds = tens[k&0xf];
3811			j = k >> 4;
3812			if (j & Bletch) {
3813				/* prevent overflows */
3814				j &= Bletch - 1;
3815				dval(&u) /= bigtens[n_bigtens-1];
3816				ieps++;
3817				}
3818			for(; j; j >>= 1, i++)
3819				if (j & 1) {
3820					ieps++;
3821					ds *= bigtens[i];
3822					}
3823			dval(&u) /= ds;
3824			}
3825		else {
3826			j1 = -k;
3827			if (j1) {
3828				dval(&u) *= tens[j1 & 0xf];
3829				for(j = j1 >> 4; j; j >>= 1, i++)
3830					if (j & 1) {
3831						ieps++;
3832						dval(&u) *= bigtens[i];
3833						}
3834				}
3835			}
3836		if (k_check && dval(&u) < 1. && ilim > 0) {
3837			if (ilim1 <= 0)
3838				goto fast_failed;
3839			ilim = ilim1;
3840			k--;
3841			dval(&u) *= 10.;
3842			ieps++;
3843			}
3844		dval(&eps) = ieps*dval(&u) + 7.;
3845		word0(&eps) -= (P-1)*Exp_msk1;
3846		if (ilim == 0) {
3847			S = mhi = 0;
3848			dval(&u) -= 5.;
3849			if (dval(&u) > dval(&eps))
3850				goto one_digit;
3851			if (dval(&u) < -dval(&eps))
3852				goto no_digits;
3853			goto fast_failed;
3854			}
3855#ifndef No_leftright
3856		if (leftright) {
3857			/* Use Steele & White method of only
3858			 * generating digits needed.
3859			 */
3860			dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
3861			for(i = 0;;) {
3862				L = (long)dval(&u);
3863				dval(&u) -= L;
3864				*s++ = '0' + (char)L;
3865				if (dval(&u) < dval(&eps))
3866					goto ret1;
3867				if (1. - dval(&u) < dval(&eps))
3868					goto bump_up;
3869				if (++i >= ilim)
3870					break;
3871				dval(&eps) *= 10.;
3872				dval(&u) *= 10.;
3873				}
3874			}
3875		else {
3876#endif
3877			/* Generate ilim digits, then fix them up. */
3878			dval(&eps) *= tens[ilim-1];
3879			for(i = 1;; i++, dval(&u) *= 10.) {
3880				L = (Long)(dval(&u));
3881				if (!(dval(&u) -= L))
3882					ilim = i;
3883				*s++ = '0' + (char)L;
3884				if (i == ilim) {
3885					if (dval(&u) > 0.5 + dval(&eps))
3886						goto bump_up;
3887					else if (dval(&u) < 0.5 - dval(&eps)) {
3888						while(*--s == '0') {}
3889						s++;
3890						goto ret1;
3891						}
3892					break;
3893					}
3894				}
3895#ifndef No_leftright
3896			}
3897#endif
3898 fast_failed:
3899		s = s0;
3900		dval(&u) = dval(&d2);
3901		k = k0;
3902		ilim = ilim0;
3903		}
3904
3905	/* Do we have a "small" integer? */
3906
3907	if (be >= 0 && k <= Int_max) {
3908		/* Yes. */
3909		ds = tens[k];
3910		if (ndigits < 0 && ilim <= 0) {
3911			S = mhi = 0;
3912			if (ilim < 0 || dval(&u) <= 5*ds)
3913				goto no_digits;
3914			goto one_digit;
3915			}
3916		for(i = 1; i <= k + 1; i++, dval(&u) *= 10.) {
3917			L = (Long)(dval(&u) / ds);
3918			dval(&u) -= L*ds;
3919#ifdef Check_FLT_ROUNDS
3920			/* If FLT_ROUNDS == 2, L will usually be high by 1 */
3921			if (dval(&u) < 0) {
3922				L--;
3923				dval(&u) += ds;
3924				}
3925#endif
3926			*s++ = '0' + (char)L;
3927			if (!dval(&u)) {
3928#ifdef SET_INEXACT
3929				inexact = 0;
3930#endif
3931				break;
3932				}
3933			if (i == ilim) {
3934#ifdef Honor_FLT_ROUNDS
3935				if (mode > 1)
3936				switch(Rounding) {
3937				  case 0: goto ret1;
3938				  case 2: goto bump_up;
3939				  }
3940#endif
3941				dval(&u) += dval(&u);
3942				if (dval(&u) > ds || (dval(&u) == ds && L & 1)) {
3943 bump_up:
3944					while(*--s == '9')
3945						if (s == s0) {
3946							k++;
3947							*s = '0';
3948							break;
3949							}
3950					++*s++;
3951					}
3952				break;
3953				}
3954			}
3955		goto ret1;
3956		}
3957
3958	m2 = b2;
3959	m5 = b5;
3960	mhi = mlo = 0;
3961	if (leftright) {
3962		i =
3963#ifndef Sudden_Underflow
3964			denorm ? be + (Bias + (P-1) - 1 + 1) :
3965#endif
3966#ifdef IBM
3967			1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
3968#else
3969			1 + P - bbits;
3970#endif
3971		b2 += i;
3972		s2 += i;
3973		mhi = i2b(1);
3974		}
3975	if (m2 > 0 && s2 > 0) {
3976		i = m2 < s2 ? m2 : s2;
3977		b2 -= i;
3978		m2 -= i;
3979		s2 -= i;
3980		}
3981	if (b5 > 0) {
3982		if (leftright) {
3983			if (m5 > 0) {
3984				mhi = pow5mult(mhi, m5);
3985				b1 = mult(mhi, b);
3986				Bfree(b);
3987				b = b1;
3988				}
3989			j = b5 - m5;
3990			if (j)
3991				b = pow5mult(b, j);
3992			}
3993		else
3994			b = pow5mult(b, b5);
3995		}
3996	S = i2b(1);
3997	if (s5 > 0)
3998		S = pow5mult(S, s5);
3999
4000	/* Check for special case that d is a normalized power of 2. */
4001
4002	spec_case = 0;
4003	if ((mode < 2 || leftright)
4004#ifdef Honor_FLT_ROUNDS
4005			&& Rounding == 1
4006#endif
4007				) {
4008		if (!word1(&u) && !(word0(&u) & Bndry_mask)
4009#ifndef Sudden_Underflow
4010		 && word0(&u) & (Exp_mask & ~Exp_msk1)
4011#endif
4012				) {
4013			/* The special case */
4014			b2 += Log2P;
4015			s2 += Log2P;
4016			spec_case = 1;
4017			}
4018		}
4019
4020	/* Arrange for convenient computation of quotients:
4021	 * shift left if necessary so divisor has 4 leading 0 bits.
4022	 *
4023	 * Perhaps we should just compute leading 28 bits of S once
4024	 * and for all and pass them and a shift to quorem, so it
4025	 * can do shifts and ors to compute the numerator for q.
4026	 */
4027#ifdef Pack_32
4028	i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f;
4029	if (i)
4030		i = 32 - i;
4031#define iInc 28
4032#else
4033	if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf)
4034		i = 16 - i;
4035#define iInc 12
4036#endif
4037	i = dshift(S, s2);
4038	b2 += i;
4039	m2 += i;
4040	s2 += i;
4041	if (b2 > 0)
4042		b = lshift(b, b2);
4043	if (s2 > 0)
4044		S = lshift(S, s2);
4045	if (k_check) {
4046		if (cmp(b,S) < 0) {
4047			k--;
4048			b = multadd(b, 10, 0);	/* we botched the k estimate */
4049			if (leftright)
4050				mhi = multadd(mhi, 10, 0);
4051			ilim = ilim1;
4052			}
4053		}
4054	if (ilim <= 0 && (mode == 3 || mode == 5)) {
4055		if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {
4056			/* no digits, fcvt style */
4057 no_digits:
4058			k = -1 - ndigits;
4059			goto ret;
4060			}
4061 one_digit:
4062		*s++ = '1';
4063		k++;
4064		goto ret;
4065		}
4066	if (leftright) {
4067		if (m2 > 0)
4068			mhi = lshift(mhi, m2);
4069
4070		/* Compute mlo -- check for special case
4071		 * that d is a normalized power of 2.
4072		 */
4073
4074		mlo = mhi;
4075		if (spec_case) {
4076			mhi = Balloc(mhi->k);
4077			Bcopy(mhi, mlo);
4078			mhi = lshift(mhi, Log2P);
4079			}
4080
4081		for(i = 1;;i++) {
4082			dig = quorem(b,S) + '0';
4083			/* Do we yet have the shortest decimal string
4084			 * that will round to d?
4085			 */
4086			j = cmp(b, mlo);
4087			delta = diff(S, mhi);
4088			j1 = delta->sign ? 1 : cmp(b, delta);
4089			Bfree(delta);
4090#ifndef ROUND_BIASED
4091			if (j1 == 0 && mode != 1 && !(word1(&u) & 1)
4092#ifdef Honor_FLT_ROUNDS
4093				&& Rounding >= 1
4094#endif
4095								   ) {
4096				if (dig == '9')
4097					goto round_9_up;
4098				if (j > 0)
4099					dig++;
4100#ifdef SET_INEXACT
4101				else if (!b->x[0] && b->wds <= 1)
4102					inexact = 0;
4103#endif
4104				*s++ = (char)dig;
4105				goto ret;
4106				}
4107#endif
4108			if (j < 0 || (j == 0 && mode != 1
4109#ifndef ROUND_BIASED
4110							&& !(word1(&u) & 1)
4111#endif
4112					)) {
4113				if (!b->x[0] && b->wds <= 1) {
4114#ifdef SET_INEXACT
4115					inexact = 0;
4116#endif
4117					goto accept_dig;
4118					}
4119#ifdef Honor_FLT_ROUNDS
4120				if (mode > 1)
4121				 switch(Rounding) {
4122				  case 0: goto accept_dig;
4123				  case 2: goto keep_dig;
4124				  }
4125#endif /*Honor_FLT_ROUNDS*/
4126				if (j1 > 0) {
4127					b = lshift(b, 1);
4128					j1 = cmp(b, S);
4129					if ((j1 > 0 || (j1 == 0 && dig & 1))
4130					&& dig++ == '9')
4131						goto round_9_up;
4132					}
4133 accept_dig:
4134				*s++ = (char)dig;
4135				goto ret;
4136				}
4137			if (j1 > 0) {
4138#ifdef Honor_FLT_ROUNDS
4139				if (!Rounding)
4140					goto accept_dig;
4141#endif
4142				if (dig == '9') { /* possible if i == 1 */
4143 round_9_up:
4144					*s++ = '9';
4145					goto roundoff;
4146					}
4147				*s++ = (char)dig + 1;
4148				goto ret;
4149				}
4150#ifdef Honor_FLT_ROUNDS
4151 keep_dig:
4152#endif
4153			*s++ = (char)dig;
4154			if (i == ilim)
4155				break;
4156			b = multadd(b, 10, 0);
4157			if (mlo == mhi)
4158				mlo = mhi = multadd(mhi, 10, 0);
4159			else {
4160				mlo = multadd(mlo, 10, 0);
4161				mhi = multadd(mhi, 10, 0);
4162				}
4163			}
4164		}
4165	else
4166		for(i = 1;; i++) {
4167			dig = quorem(b,S) + '0';
4168			*s++ = (char)dig;
4169			if (!b->x[0] && b->wds <= 1) {
4170#ifdef SET_INEXACT
4171				inexact = 0;
4172#endif
4173				goto ret;
4174				}
4175			if (i >= ilim)
4176				break;
4177			b = multadd(b, 10, 0);
4178			}
4179
4180	/* Round off last digit */
4181
4182#ifdef Honor_FLT_ROUNDS
4183	switch(Rounding) {
4184	  case 0: goto trimzeros;
4185	  case 2: goto roundoff;
4186	  }
4187#endif
4188	b = lshift(b, 1);
4189	j = cmp(b, S);
4190	if (j > 0 || (j == 0 && dig & 1)) {
4191 roundoff:
4192		while(*--s == '9')
4193			if (s == s0) {
4194				k++;
4195				*s++ = '1';
4196				goto ret;
4197				}
4198		++*s++;
4199		}
4200	else {
4201#ifdef Honor_FLT_ROUNDS
4202 trimzeros:
4203#endif
4204		while(*--s == '0') {}
4205		s++;
4206		}
4207 ret:
4208	Bfree(S);
4209	if (mhi) {
4210		if (mlo && mlo != mhi)
4211			Bfree(mlo);
4212		Bfree(mhi);
4213		}
4214 ret1:
4215#ifdef SET_INEXACT
4216	if (inexact) {
4217		if (!oldinexact) {
4218			word0(&u) = Exp_1 + (70 << Exp_shift);
4219			word1(&u) = 0;
4220			dval(&u) += 1.;
4221			}
4222		}
4223	else if (!oldinexact)
4224		clear_inexact();
4225#endif
4226	Bfree(b);
4227	*s = 0;
4228	*decpt = k + 1;
4229	if (rve)
4230		*rve = s;
4231	return s0;
4232	}
4233
4234}  // namespace dmg_fp
4235