dtoa.c revision add282346765a8d61d0d8d7ecaa201492f1facd2
1b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/****************************************************************
2b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
3b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * The author of this software is David M. Gay.
4b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
5b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
6b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
7b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * Permission to use, copy, modify, and distribute this software for any
8b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * purpose without fee is hereby granted, provided that this entire notice
9b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * is included in all copies of any software which is or includes a copy
10b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * or modification of this software and in all copies of the supporting
11b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * documentation for such software.
12b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
13b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
14b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
15b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
16b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
17b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
18b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson ***************************************************************/
19b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
20b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/****************************************************************
21b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * This is dtoa.c by David M. Gay, downloaded from
22b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * http://www.netlib.org/fp/dtoa.c on April 15, 2009 and modified for
23b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * inclusion into the Python core by Mark E. T. Dickinson and Eric V. Smith.
247f0ea323ee99a06cb8075151403125e0b928137cMark Dickinson *
257f0ea323ee99a06cb8075151403125e0b928137cMark Dickinson * Please remember to check http://www.netlib.org/fp regularly (and especially
267f0ea323ee99a06cb8075151403125e0b928137cMark Dickinson * before any Python release) for bugfixes and updates.
277f0ea323ee99a06cb8075151403125e0b928137cMark Dickinson *
287f0ea323ee99a06cb8075151403125e0b928137cMark Dickinson * The major modifications from Gay's original code are as follows:
29b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
30b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *  0. The original code has been specialized to Python's needs by removing
31b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     many of the #ifdef'd sections.  In particular, code to support VAX and
32b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     IBM floating-point formats, hex NaNs, hex floats, locale-aware
33b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     treatment of the decimal point, and setting of the inexact flag have
34b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     been removed.
35b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
36b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *  1. We use PyMem_Malloc and PyMem_Free in place of malloc and free.
37b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
38b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *  2. The public functions strtod, dtoa and freedtoa all now have
39b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     a _Py_dg_ prefix.
40b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
41b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *  3. Instead of assuming that PyMem_Malloc always succeeds, we thread
42b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     PyMem_Malloc failures through the code.  The functions
43b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
44b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *       Balloc, multadd, s2b, i2b, mult, pow5mult, lshift, diff, d2b
45b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
46b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     of return type *Bigint all return NULL to indicate a malloc failure.
47b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     Similarly, rv_alloc and nrv_alloc (return type char *) return NULL on
48b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     failure.  bigcomp now has return type int (it used to be void) and
49b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     returns -1 on failure and 0 otherwise.  _Py_dg_dtoa returns NULL
50b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     on failure.  _Py_dg_strtod indicates failure due to malloc failure
51b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     by returning -1.0, setting errno=ENOMEM and *se to s00.
52b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
53b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *  4. The static variable dtoa_result has been removed.  Callers of
54b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     _Py_dg_dtoa are expected to call _Py_dg_freedtoa to free
55b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     the memory allocated by _Py_dg_dtoa.
56b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
57b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *  5. The code has been reformatted to better fit with Python's
58b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *     C style guide (PEP 7).
59b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
607f0ea323ee99a06cb8075151403125e0b928137cMark Dickinson *  6. A bug in the memory allocation has been fixed: to avoid FREEing memory
617f0ea323ee99a06cb8075151403125e0b928137cMark Dickinson *     that hasn't been MALLOC'ed, private_mem should only be used when k <=
627f0ea323ee99a06cb8075151403125e0b928137cMark Dickinson *     Kmax.
637f0ea323ee99a06cb8075151403125e0b928137cMark Dickinson *
64725bfd8489e444aedd8dfd686a27ffc308657155Mark Dickinson *  7. _Py_dg_strtod has been modified so that it doesn't accept strings with
65725bfd8489e444aedd8dfd686a27ffc308657155Mark Dickinson *     leading whitespace.
66725bfd8489e444aedd8dfd686a27ffc308657155Mark Dickinson *
67b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson ***************************************************************/
68b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
69b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Please send bug reports for the original dtoa.c code to David M. Gay (dmg
70b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * at acm dot org, with " at " changed at "@" and " dot " changed to ".").
71b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * Please report bugs for this modified version using the Python issue tracker
72b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * (http://bugs.python.org). */
73b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
74b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* On a machine with IEEE extended-precision registers, it is
75b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * necessary to specify double-precision (53-bit) rounding precision
76b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * before invoking strtod or dtoa.  If the machine uses (the equivalent
77b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * of) Intel 80x87 arithmetic, the call
78b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *      _control87(PC_53, MCW_PC);
79b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * does this with many compilers.  Whether this or another call is
80b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * appropriate depends on the compiler; for this to work, it may be
81b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * necessary to #include "float.h" or another system-dependent header
82b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * file.
83b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson */
84b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
85b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
86b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
87b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * This strtod returns a nearest machine number to the input decimal
88b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * string (or sets errno to ERANGE).  With IEEE arithmetic, ties are
89b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * broken by the IEEE round-even rule.  Otherwise ties are broken by
90b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * biased rounding (add half and chop).
91b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
92b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * Inspired loosely by William D. Clinger's paper "How to Read Floating
93b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
94b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
95b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * Modifications:
96b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
97b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *      1. We only require IEEE, IBM, or VAX double-precision
98b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *              arithmetic (not IEEE double-extended).
99b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *      2. We get by with floating-point arithmetic in a case that
100b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *              Clinger missed -- when we're computing d * 10^n
101b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *              for a small integer d and the integer n is not too
102b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *              much larger than 22 (the maximum integer k for which
103b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *              we can represent 10^k exactly), we may be able to
104b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *              compute (d*10^k) * 10^(e-k) with just one roundoff.
105b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *      3. Rather than a bit-at-a-time adjustment of the binary
106b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *              result in the hard case, we use floating-point
107b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *              arithmetic to determine the adjustment to within
108b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *              one bit; only in really hard cases do we need to
109b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *              compute a second residual.
110b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *      4. Because of 3., we don't need a large table of powers of 10
111b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *              for ten-to-e (just some small tables, e.g. of 10^k
112b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *              for 0 <= k <= 22).
113b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson */
114b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
115b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Linking of Python's #defines to Gay's #defines starts here. */
116b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
117b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#include "Python.h"
118b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
119b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* if PY_NO_SHORT_FLOAT_REPR is defined, then don't even try to compile
120b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   the following code */
121b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifndef PY_NO_SHORT_FLOAT_REPR
122b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
123b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#include "float.h"
124b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
125b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define MALLOC PyMem_Malloc
126b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define FREE PyMem_Free
127b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
128b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* This code should also work for ARM mixed-endian format on little-endian
129b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   machines, where doubles have byte order 45670123 (in increasing address
130b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   order, 0 being the least significant byte). */
131b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef DOUBLE_IS_LITTLE_ENDIAN_IEEE754
132b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#  define IEEE_8087
133b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
134b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#if defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) ||  \
135b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson  defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754)
136b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#  define IEEE_MC68k
137b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
138b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#if defined(IEEE_8087) + defined(IEEE_MC68k) != 1
139b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#error "Exactly one of IEEE_8087 or IEEE_MC68k should be defined."
140b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
141b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
142b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* The code below assumes that the endianness of integers matches the
143b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   endianness of the two 32-bit words of a double.  Check this. */
144b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#if defined(WORDS_BIGENDIAN) && (defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) || \
145b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                                 defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754))
146b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#error "doubles and ints have incompatible endianness"
147b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
148b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
149b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#if !defined(WORDS_BIGENDIAN) && defined(DOUBLE_IS_BIG_ENDIAN_IEEE754)
150b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#error "doubles and ints have incompatible endianness"
151b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
152b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
153b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
154b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#if defined(HAVE_UINT32_T) && defined(HAVE_INT32_T)
155b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsontypedef PY_UINT32_T ULong;
156b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsontypedef PY_INT32_T Long;
157b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
158b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#error "Failed to find an exact-width 32-bit integer type"
159b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
160b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
161b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#if defined(HAVE_UINT64_T)
162b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define ULLong PY_UINT64_T
163b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
164b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#undef ULLong
165b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
166b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
167b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#undef DEBUG
168b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef Py_DEBUG
169b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define DEBUG
170b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
171b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
172b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* End Python #define linking */
173b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
174b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef DEBUG
175b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
176b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
177b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
178b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifndef PRIVATE_MEM
179b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define PRIVATE_MEM 2304
180b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
181b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
182b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic double private_mem[PRIVATE_mem], *pmem_next = private_mem;
183b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
184b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef __cplusplus
185b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonextern "C" {
186b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
187b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
188b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsontypedef union { double d; ULong L[2]; } U;
189b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
190b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef IEEE_8087
191b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define word0(x) (x)->L[1]
192b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define word1(x) (x)->L[0]
193b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
194b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define word0(x) (x)->L[0]
195b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define word1(x) (x)->L[1]
196b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
197b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define dval(x) (x)->d
198b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
199b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifndef STRTOD_DIGLIM
200b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define STRTOD_DIGLIM 40
201b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
202b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
20381612e877870c52bae7c590076eec642b9803138Mark Dickinson/* maximum permitted exponent value for strtod; exponents larger than
20481612e877870c52bae7c590076eec642b9803138Mark Dickinson   MAX_ABS_EXP in absolute value get truncated to +-MAX_ABS_EXP.  MAX_ABS_EXP
20581612e877870c52bae7c590076eec642b9803138Mark Dickinson   should fit into an int. */
20681612e877870c52bae7c590076eec642b9803138Mark Dickinson#ifndef MAX_ABS_EXP
20781612e877870c52bae7c590076eec642b9803138Mark Dickinson#define MAX_ABS_EXP 19999U
208b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
209b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
210b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* The following definition of Storeinc is appropriate for MIPS processors.
211b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * An alternative that might be better on some machines is
212b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
213b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson */
214b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#if defined(IEEE_8087)
215b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b,  \
216b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                         ((unsigned short *)a)[0] = (unsigned short)c, a++)
217b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
218b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b,  \
219b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                         ((unsigned short *)a)[1] = (unsigned short)c, a++)
220b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
221b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
222b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* #define P DBL_MANT_DIG */
223b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Ten_pmax = floor(P*log(2)/log(5)) */
224b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
225b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
226b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
227b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
228b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Exp_shift  20
229b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Exp_shift1 20
230b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Exp_msk1    0x100000
231b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Exp_msk11   0x100000
232b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Exp_mask  0x7ff00000
233b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define P 53
234b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Nbits 53
235b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Bias 1023
236b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Emax 1023
237b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Emin (-1022)
238b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Exp_1  0x3ff00000
239b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Exp_11 0x3ff00000
240b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Ebits 11
241b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Frac_mask  0xfffff
242b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Frac_mask1 0xfffff
243b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Ten_pmax 22
244b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Bletch 0x10
245b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Bndry_mask  0xfffff
246b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Bndry_mask1 0xfffff
247b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define LSB 1
248b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Sign_bit 0x80000000
249b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Log2P 1
250b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Tiny0 0
251b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Tiny1 1
252b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Quick_max 14
253b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Int_max 14
254b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
255b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifndef Flt_Rounds
256b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef FLT_ROUNDS
257b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Flt_Rounds FLT_ROUNDS
258b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
259b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Flt_Rounds 1
260b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
261b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif /*Flt_Rounds*/
262b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
263b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Rounding Flt_Rounds
264b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
265b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
266b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Big1 0xffffffff
267b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
268b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* struct BCinfo is used to pass information from _Py_dg_strtod to bigcomp */
269b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
270b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsontypedef struct BCinfo BCinfo;
271b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstruct
272b08a53a99def3fa949643974f713b5b189e21bc7Mark DickinsonBCinfo {
273add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    int e0, nd, nd0, scale;
274b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson};
275b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
276b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define FFFFFFFF 0xffffffffUL
277b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
278b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Kmax 7
279b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
280b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* struct Bigint is used to represent arbitrary-precision integers.  These
281b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   integers are stored in sign-magnitude format, with the magnitude stored as
282b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   an array of base 2**32 digits.  Bigints are always normalized: if x is a
283b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   Bigint then x->wds >= 1, and either x->wds == 1 or x[wds-1] is nonzero.
284b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
285b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   The Bigint fields are as follows:
286b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
287b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     - next is a header used by Balloc and Bfree to keep track of lists
288b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         of freed Bigints;  it's also used for the linked list of
289b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         powers of 5 of the form 5**2**i used by pow5mult.
290b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     - k indicates which pool this Bigint was allocated from
291b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     - maxwds is the maximum number of words space was allocated for
292b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson       (usually maxwds == 2**k)
293b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     - sign is 1 for negative Bigints, 0 for positive.  The sign is unused
294b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson       (ignored on inputs, set to 0 on outputs) in almost all operations
295b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson       involving Bigints: a notable exception is the diff function, which
296b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson       ignores signs on inputs but sets the sign of the output correctly.
297b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     - wds is the actual number of significant words
298b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     - x contains the vector of words (digits) for this Bigint, from least
299b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson       significant (x[0]) to most significant (x[wds-1]).
300b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson*/
301b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
302b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstruct
303b08a53a99def3fa949643974f713b5b189e21bc7Mark DickinsonBigint {
304b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    struct Bigint *next;
305b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int k, maxwds, sign, wds;
306b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong x[1];
307b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson};
308b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
309b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsontypedef struct Bigint Bigint;
310b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
311de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson#ifndef Py_USING_MEMORY_DEBUGGER
312de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
313b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Memory management: memory is allocated from, and returned to, Kmax+1 pools
314b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   of memory, where pool k (0 <= k <= Kmax) is for Bigints b with b->maxwds ==
315b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   1 << k.  These pools are maintained as linked lists, with freelist[k]
316b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   pointing to the head of the list for pool k.
317b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
318b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   On allocation, if there's no free slot in the appropriate pool, MALLOC is
319b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   called to get more memory.  This memory is not returned to the system until
320b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   Python quits.  There's also a private memory pool that's allocated from
321b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   in preference to using MALLOC.
322b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
323b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   For Bigints with more than (1 << Kmax) digits (which implies at least 1233
324b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   decimal digits), memory is directly allocated using MALLOC, and freed using
325b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   FREE.
326b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
327b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   XXX: it would be easy to bypass this memory-management system and
328b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   translate each call to Balloc into a call to PyMem_Malloc, and each
329b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   Bfree to PyMem_Free.  Investigate whether this has any significant
330b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   performance on impact. */
331b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
332b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic Bigint *freelist[Kmax+1];
333b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
334b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Allocate space for a Bigint with up to 1<<k digits */
335b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
336b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic Bigint *
337b08a53a99def3fa949643974f713b5b189e21bc7Mark DickinsonBalloc(int k)
338b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
339b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int x;
340b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bigint *rv;
341b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    unsigned int len;
342b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
343b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (k <= Kmax && (rv = freelist[k]))
344b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        freelist[k] = rv->next;
345b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else {
346b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        x = 1 << k;
347b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
348b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            /sizeof(double);
3497f0ea323ee99a06cb8075151403125e0b928137cMark Dickinson        if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {
350b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            rv = (Bigint*)pmem_next;
351b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            pmem_next += len;
352b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
353b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else {
354b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            rv = (Bigint*)MALLOC(len*sizeof(double));
355b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (rv == NULL)
356b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                return NULL;
357b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
358b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        rv->k = k;
359b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        rv->maxwds = x;
360b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
361b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    rv->sign = rv->wds = 0;
362b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return rv;
363b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
364b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
365b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Free a Bigint allocated with Balloc */
366b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
367b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic void
368b08a53a99def3fa949643974f713b5b189e21bc7Mark DickinsonBfree(Bigint *v)
369b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
370b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (v) {
371b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (v->k > Kmax)
372b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            FREE((void*)v);
373b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else {
374b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            v->next = freelist[v->k];
375b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            freelist[v->k] = v;
376b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
377b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
378b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
379b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
380de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson#else
381de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
382de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson/* Alternative versions of Balloc and Bfree that use PyMem_Malloc and
383de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson   PyMem_Free directly in place of the custom memory allocation scheme above.
384de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson   These are provided for the benefit of memory debugging tools like
385de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson   Valgrind. */
386de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
387de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson/* Allocate space for a Bigint with up to 1<<k digits */
388de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
389de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinsonstatic Bigint *
390de5080038f29628db12f0639a3b5df1aa1a93868Mark DickinsonBalloc(int k)
391de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson{
392de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    int x;
393de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    Bigint *rv;
394de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    unsigned int len;
395de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
396de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    x = 1 << k;
397de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
398de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        /sizeof(double);
399de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
400de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    rv = (Bigint*)MALLOC(len*sizeof(double));
401de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    if (rv == NULL)
402de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        return NULL;
403de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
404de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    rv->k = k;
405de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    rv->maxwds = x;
406de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    rv->sign = rv->wds = 0;
407de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    return rv;
408de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson}
409de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
410de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson/* Free a Bigint allocated with Balloc */
411de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
412de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinsonstatic void
413de5080038f29628db12f0639a3b5df1aa1a93868Mark DickinsonBfree(Bigint *v)
414de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson{
415de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    if (v) {
416de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        FREE((void*)v);
417de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    }
418de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson}
419de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
420de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson#endif /* Py_USING_MEMORY_DEBUGGER */
421de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
422b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign,   \
423b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                          y->wds*sizeof(Long) + 2*sizeof(int))
424b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
425b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Multiply a Bigint b by m and add a.  Either modifies b in place and returns
426b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   a pointer to the modified b, or Bfrees b and returns a pointer to a copy.
427b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   On failure, return NULL.  In this case, b will have been already freed. */
428b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
429b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic Bigint *
430b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonmultadd(Bigint *b, int m, int a)       /* multiply by m and add a */
431b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
432b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int i, wds;
433b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef ULLong
434b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong *x;
435b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULLong carry, y;
436b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
437b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong carry, *x, y;
438b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong xi, z;
439b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
440b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bigint *b1;
441b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
442b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    wds = b->wds;
443b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    x = b->x;
444b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    i = 0;
445b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    carry = a;
446b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    do {
447b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef ULLong
448b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        y = *x * (ULLong)m + carry;
449b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        carry = y >> 32;
450fd2ad8b4f2c88cba76d6b2cbca92612fc3fc8b61Mark Dickinson        *x++ = (ULong)(y & FFFFFFFF);
451b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
452b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        xi = *x;
453b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        y = (xi & 0xffff) * m + carry;
454b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        z = (xi >> 16) * m + (y >> 16);
455b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        carry = z >> 16;
456b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *x++ = (z << 16) + (y & 0xffff);
457b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
458b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
459b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    while(++i < wds);
460b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (carry) {
461b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (wds >= b->maxwds) {
462b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            b1 = Balloc(b->k+1);
463b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (b1 == NULL){
464b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(b);
465b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                return NULL;
466b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
467b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bcopy(b1, b);
468b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(b);
469b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            b = b1;
470b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
471b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b->x[wds++] = (ULong)carry;
472b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b->wds = wds;
473b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
474b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return b;
475b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
476b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
477b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* convert a string s containing nd decimal digits (possibly containing a
478b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   decimal separator at position nd0, which is ignored) to a Bigint.  This
479b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   function carries on where the parsing code in _Py_dg_strtod leaves off: on
480b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   entry, y9 contains the result of converting the first 9 digits.  Returns
481b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   NULL on failure. */
482b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
483b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic Bigint *
484853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinsons2b(const char *s, int nd0, int nd, ULong y9)
485b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
486b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bigint *b;
487b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int i, k;
488b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Long x, y;
489b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
490b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    x = (nd + 8) / 9;
491b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    for(k = 0, y = 1; x > y; y <<= 1, k++) ;
492b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    b = Balloc(k);
493b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (b == NULL)
494b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return NULL;
495b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    b->x[0] = y9;
496b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    b->wds = 1;
497b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
498853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    if (nd <= 9)
499853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson      return b;
500853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
501853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    s += 9;
502853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    for (i = 9; i < nd0; i++) {
503853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        b = multadd(b, 10, *s++ - '0');
504853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        if (b == NULL)
505853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson            return NULL;
506b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
507853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    s++;
508b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    for(; i < nd; i++) {
509b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b = multadd(b, 10, *s++ - '0');
510b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (b == NULL)
511b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return NULL;
512b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
513b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return b;
514b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
515b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
516b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* count leading 0 bits in the 32-bit integer x. */
517b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
518b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic int
519b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonhi0bits(ULong x)
520b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
521b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int k = 0;
522b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
523b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!(x & 0xffff0000)) {
524b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k = 16;
525b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        x <<= 16;
526b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
527b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!(x & 0xff000000)) {
528b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k += 8;
529b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        x <<= 8;
530b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
531b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!(x & 0xf0000000)) {
532b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k += 4;
533b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        x <<= 4;
534b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
535b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!(x & 0xc0000000)) {
536b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k += 2;
537b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        x <<= 2;
538b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
539b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!(x & 0x80000000)) {
540b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k++;
541b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (!(x & 0x40000000))
542b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return 32;
543b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
544b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return k;
545b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
546b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
547b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* count trailing 0 bits in the 32-bit integer y, and shift y right by that
548b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   number of bits. */
549b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
550b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic int
551b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonlo0bits(ULong *y)
552b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
553b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int k;
554b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong x = *y;
555b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
556b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (x & 7) {
557b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (x & 1)
558b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return 0;
559b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (x & 2) {
560b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            *y = x >> 1;
561b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return 1;
562b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
563b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *y = x >> 2;
564b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return 2;
565b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
566b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    k = 0;
567b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!(x & 0xffff)) {
568b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k = 16;
569b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        x >>= 16;
570b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
571b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!(x & 0xff)) {
572b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k += 8;
573b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        x >>= 8;
574b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
575b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!(x & 0xf)) {
576b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k += 4;
577b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        x >>= 4;
578b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
579b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!(x & 0x3)) {
580b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k += 2;
581b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        x >>= 2;
582b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
583b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!(x & 1)) {
584b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k++;
585b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        x >>= 1;
586b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (!x)
587b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return 32;
588b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
589b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    *y = x;
590b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return k;
591b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
592b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
593b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* convert a small nonnegative integer to a Bigint */
594b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
595b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic Bigint *
596b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsoni2b(int i)
597b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
598b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bigint *b;
599b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
600b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    b = Balloc(1);
601b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (b == NULL)
602b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return NULL;
603b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    b->x[0] = i;
604b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    b->wds = 1;
605b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return b;
606b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
607b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
608b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* multiply two Bigints.  Returns a new Bigint, or NULL on failure.  Ignores
609b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   the signs of a and b. */
610b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
611b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic Bigint *
612b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonmult(Bigint *a, Bigint *b)
613b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
614b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bigint *c;
615b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int k, wa, wb, wc;
616b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
617b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong y;
618b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef ULLong
619b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULLong carry, z;
620b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
621b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong carry, z;
622b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong z2;
623b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
624b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
625b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (a->wds < b->wds) {
626b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        c = a;
627b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        a = b;
628b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b = c;
629b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
630b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    k = a->k;
631b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    wa = a->wds;
632b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    wb = b->wds;
633b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    wc = wa + wb;
634b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (wc > a->maxwds)
635b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k++;
636b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    c = Balloc(k);
637b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (c == NULL)
638b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return NULL;
639b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    for(x = c->x, xa = x + wc; x < xa; x++)
640b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *x = 0;
641b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xa = a->x;
642b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xae = xa + wa;
643b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xb = b->x;
644b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xbe = xb + wb;
645b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xc0 = c->x;
646b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef ULLong
647b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    for(; xb < xbe; xc0++) {
648b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if ((y = *xb++)) {
649b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            x = xa;
650b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            xc = xc0;
651b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            carry = 0;
652b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            do {
653b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                z = *x++ * (ULLong)y + *xc + carry;
654b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                carry = z >> 32;
655fd2ad8b4f2c88cba76d6b2cbca92612fc3fc8b61Mark Dickinson                *xc++ = (ULong)(z & FFFFFFFF);
656b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
657b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            while(x < xae);
658b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            *xc = (ULong)carry;
659b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
660b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
661b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
662b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    for(; xb < xbe; xb++, xc0++) {
663b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (y = *xb & 0xffff) {
664b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            x = xa;
665b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            xc = xc0;
666b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            carry = 0;
667b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            do {
668b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
669b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                carry = z >> 16;
670b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
671b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                carry = z2 >> 16;
672b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Storeinc(xc, z2, z);
673b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
674b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            while(x < xae);
675b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            *xc = carry;
676b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
677b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (y = *xb >> 16) {
678b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            x = xa;
679b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            xc = xc0;
680b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            carry = 0;
681b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            z2 = *xc;
682b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            do {
683b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                z = (*x & 0xffff) * y + (*xc >> 16) + carry;
684b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                carry = z >> 16;
685b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Storeinc(xc, z, z2);
686b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
687b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                carry = z2 >> 16;
688b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
689b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            while(x < xae);
690b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            *xc = z2;
691b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
692b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
693b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
694b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
695b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    c->wds = wc;
696b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return c;
697b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
698b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
699de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson#ifndef Py_USING_MEMORY_DEBUGGER
700de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
701b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* p5s is a linked list of powers of 5 of the form 5**(2**i), i >= 2 */
702b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
703b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic Bigint *p5s;
704b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
705b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* multiply the Bigint b by 5**k.  Returns a pointer to the result, or NULL on
706b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   failure; if the returned pointer is distinct from b then the original
707b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   Bigint b will have been Bfree'd.   Ignores the sign of b. */
708b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
709b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic Bigint *
710b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonpow5mult(Bigint *b, int k)
711b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
712b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bigint *b1, *p5, *p51;
713b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int i;
714b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    static int p05[3] = { 5, 25, 125 };
715b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
716b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if ((i = k & 3)) {
717b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b = multadd(b, p05[i-1], 0);
718b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (b == NULL)
719b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return NULL;
720b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
721b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
722b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!(k >>= 2))
723b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return b;
724b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    p5 = p5s;
725b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!p5) {
726b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /* first time */
727b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        p5 = i2b(625);
728b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (p5 == NULL) {
729b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(b);
730b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return NULL;
731b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
732b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        p5s = p5;
733b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        p5->next = 0;
734b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
735b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    for(;;) {
736b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (k & 1) {
737b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            b1 = mult(b, p5);
738b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(b);
739b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            b = b1;
740b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (b == NULL)
741b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                return NULL;
742b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
743b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (!(k >>= 1))
744b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            break;
745b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        p51 = p5->next;
746b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (!p51) {
747b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            p51 = mult(p5,p5);
748b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (p51 == NULL) {
749b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(b);
750b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                return NULL;
751b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
752b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            p51->next = 0;
753b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            p5->next = p51;
754b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
755b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        p5 = p51;
756b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
757b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return b;
758b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
759b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
760de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson#else
761de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
762de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson/* Version of pow5mult that doesn't cache powers of 5. Provided for
763de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson   the benefit of memory debugging tools like Valgrind. */
764de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
765de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinsonstatic Bigint *
766de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinsonpow5mult(Bigint *b, int k)
767de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson{
768de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    Bigint *b1, *p5, *p51;
769de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    int i;
770de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    static int p05[3] = { 5, 25, 125 };
771de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
772de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    if ((i = k & 3)) {
773de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        b = multadd(b, p05[i-1], 0);
774de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        if (b == NULL)
775de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson            return NULL;
776de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    }
777de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
778de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    if (!(k >>= 2))
779de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        return b;
780de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    p5 = i2b(625);
781de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    if (p5 == NULL) {
782de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        Bfree(b);
783de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        return NULL;
784de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    }
785de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
786de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    for(;;) {
787de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        if (k & 1) {
788de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson            b1 = mult(b, p5);
789de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson            Bfree(b);
790de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson            b = b1;
791de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson            if (b == NULL) {
792de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson                Bfree(p5);
793de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson                return NULL;
794de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson            }
795de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        }
796de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        if (!(k >>= 1))
797de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson            break;
798de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        p51 = mult(p5, p5);
799de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        Bfree(p5);
800de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        p5 = p51;
801de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        if (p5 == NULL) {
802de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson            Bfree(b);
803de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson            return NULL;
804de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson        }
805de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    }
806de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    Bfree(p5);
807de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson    return b;
808de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson}
809de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
810de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson#endif /* Py_USING_MEMORY_DEBUGGER */
811de5080038f29628db12f0639a3b5df1aa1a93868Mark Dickinson
812b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* shift a Bigint b left by k bits.  Return a pointer to the shifted result,
813b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   or NULL on failure.  If the returned pointer is distinct from b then the
814b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   original b will have been Bfree'd.   Ignores the sign of b. */
815b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
816b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic Bigint *
817b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonlshift(Bigint *b, int k)
818b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
819b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int i, k1, n, n1;
820b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bigint *b1;
821b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong *x, *x1, *xe, z;
822b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
823b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    n = k >> 5;
824b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    k1 = b->k;
825b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    n1 = n + b->wds + 1;
826b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    for(i = b->maxwds; n1 > i; i <<= 1)
827b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k1++;
828b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    b1 = Balloc(k1);
829b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (b1 == NULL) {
830b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bfree(b);
831b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return NULL;
832b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
833b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    x1 = b1->x;
834b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    for(i = 0; i < n; i++)
835b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *x1++ = 0;
836b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    x = b->x;
837b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xe = x + b->wds;
838b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (k &= 0x1f) {
839b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k1 = 32 - k;
840b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        z = 0;
841b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        do {
842b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            *x1++ = *x << k | z;
843b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            z = *x++ >> k1;
844b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
845b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        while(x < xe);
846b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if ((*x1 = z))
847b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            ++n1;
848b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
849b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else do
850b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson             *x1++ = *x++;
851b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        while(x < xe);
852b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    b1->wds = n1 - 1;
853b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bfree(b);
854b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return b1;
855b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
856b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
857b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Do a three-way compare of a and b, returning -1 if a < b, 0 if a == b and
858b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   1 if a > b.  Ignores signs of a and b. */
859b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
860b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic int
861b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsoncmp(Bigint *a, Bigint *b)
862b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
863b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong *xa, *xa0, *xb, *xb0;
864b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int i, j;
865b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
866b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    i = a->wds;
867b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    j = b->wds;
868b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef DEBUG
869b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (i > 1 && !a->x[i-1])
870b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bug("cmp called with a->x[a->wds-1] == 0");
871b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (j > 1 && !b->x[j-1])
872b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bug("cmp called with b->x[b->wds-1] == 0");
873b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
874b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (i -= j)
875b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return i;
876b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xa0 = a->x;
877b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xa = xa0 + j;
878b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xb0 = b->x;
879b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xb = xb0 + j;
880b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    for(;;) {
881b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (*--xa != *--xb)
882b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return *xa < *xb ? -1 : 1;
883b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (xa <= xa0)
884b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            break;
885b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
886b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return 0;
887b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
888b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
889b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Take the difference of Bigints a and b, returning a new Bigint.  Returns
890b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   NULL on failure.  The signs of a and b are ignored, but the sign of the
891b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   result is set appropriately. */
892b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
893b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic Bigint *
894b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsondiff(Bigint *a, Bigint *b)
895b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
896b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bigint *c;
897b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int i, wa, wb;
898b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong *xa, *xae, *xb, *xbe, *xc;
899b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef ULLong
900b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULLong borrow, y;
901b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
902b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong borrow, y;
903b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong z;
904b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
905b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
906b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    i = cmp(a,b);
907b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!i) {
908b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        c = Balloc(0);
909b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (c == NULL)
910b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return NULL;
911b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        c->wds = 1;
912b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        c->x[0] = 0;
913b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return c;
914b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
915b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (i < 0) {
916b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        c = a;
917b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        a = b;
918b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b = c;
919b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i = 1;
920b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
921b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else
922b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i = 0;
923b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    c = Balloc(a->k);
924b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (c == NULL)
925b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return NULL;
926b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    c->sign = i;
927b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    wa = a->wds;
928b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xa = a->x;
929b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xae = xa + wa;
930b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    wb = b->wds;
931b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xb = b->x;
932b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xbe = xb + wb;
933b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xc = c->x;
934b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    borrow = 0;
935b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef ULLong
936b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    do {
937b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        y = (ULLong)*xa++ - *xb++ - borrow;
938b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        borrow = y >> 32 & (ULong)1;
939fd2ad8b4f2c88cba76d6b2cbca92612fc3fc8b61Mark Dickinson        *xc++ = (ULong)(y & FFFFFFFF);
940b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
941b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    while(xb < xbe);
942b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    while(xa < xae) {
943b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        y = *xa++ - borrow;
944b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        borrow = y >> 32 & (ULong)1;
945fd2ad8b4f2c88cba76d6b2cbca92612fc3fc8b61Mark Dickinson        *xc++ = (ULong)(y & FFFFFFFF);
946b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
947b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
948b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    do {
949b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
950b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        borrow = (y & 0x10000) >> 16;
951b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
952b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        borrow = (z & 0x10000) >> 16;
953b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Storeinc(xc, z, y);
954b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
955b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    while(xb < xbe);
956b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    while(xa < xae) {
957b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        y = (*xa & 0xffff) - borrow;
958b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        borrow = (y & 0x10000) >> 16;
959b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        z = (*xa++ >> 16) - borrow;
960b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        borrow = (z & 0x10000) >> 16;
961b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Storeinc(xc, z, y);
962b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
963b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
964b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    while(!*--xc)
965b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        wa--;
966b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    c->wds = wa;
967b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return c;
968b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
969b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
970add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson/* Given a positive normal double x, return the difference between x and the
971add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson   next double up.  Doesn't give correct results for subnormals. */
972b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
973b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic double
974b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonulp(U *x)
975b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
976b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Long L;
977b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    U u;
978b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
979b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
980b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    word0(&u) = L;
981b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    word1(&u) = 0;
982b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return dval(&u);
983b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
984b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
985b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Convert a Bigint to a double plus an exponent */
986b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
987b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic double
988b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonb2d(Bigint *a, int *e)
989b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
990b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong *xa, *xa0, w, y, z;
991b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int k;
992b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    U d;
993b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
994b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xa0 = a->x;
995b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    xa = xa0 + a->wds;
996b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    y = *--xa;
997b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef DEBUG
998b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!y) Bug("zero y in b2d");
999b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
1000b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    k = hi0bits(y);
1001b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    *e = 32 - k;
1002b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (k < Ebits) {
1003b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word0(&d) = Exp_1 | y >> (Ebits - k);
1004b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        w = xa > xa0 ? *--xa : 0;
1005b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word1(&d) = y << ((32-Ebits) + k) | w >> (Ebits - k);
1006b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        goto ret_d;
1007b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1008b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    z = xa > xa0 ? *--xa : 0;
1009b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (k -= Ebits) {
1010b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word0(&d) = Exp_1 | y << k | z >> (32 - k);
1011b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        y = xa > xa0 ? *--xa : 0;
1012b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word1(&d) = z << k | y >> (32 - k);
1013b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1014b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else {
1015b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word0(&d) = Exp_1 | y;
1016b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word1(&d) = z;
1017b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1018b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson  ret_d:
1019b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return dval(&d);
1020b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
1021b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1022b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Convert a double to a Bigint plus an exponent.  Return NULL on failure.
1023b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1024b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   Given a finite nonzero double d, return an odd Bigint b and exponent *e
1025b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   such that fabs(d) = b * 2**e.  On return, *bbits gives the number of
1026180e4cd54de7a08ba363ac18412fb74b8f10ec31Mark Dickinson   significant bits of b; that is, 2**(*bbits-1) <= b < 2**(*bbits).
1027b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1028b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   If d is zero, then b == 0, *e == -1010, *bbits = 0.
1029b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson */
1030b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1031b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1032b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic Bigint *
1033b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsond2b(U *d, int *e, int *bits)
1034b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
1035b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bigint *b;
1036b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int de, k;
1037b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong *x, y, z;
1038b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int i;
1039b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1040b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    b = Balloc(1);
1041b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (b == NULL)
1042b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return NULL;
1043b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    x = b->x;
1044b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1045b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    z = word0(d) & Frac_mask;
1046b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    word0(d) &= 0x7fffffff;   /* clear sign bit, which we ignore */
1047b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if ((de = (int)(word0(d) >> Exp_shift)))
1048b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        z |= Exp_msk1;
1049b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if ((y = word1(d))) {
1050b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if ((k = lo0bits(&y))) {
1051b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            x[0] = y | z << (32 - k);
1052b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            z >>= k;
1053b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1054b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else
1055b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            x[0] = y;
1056b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i =
1057b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            b->wds = (x[1] = z) ? 2 : 1;
1058b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1059b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else {
1060b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k = lo0bits(&z);
1061b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        x[0] = z;
1062b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i =
1063b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            b->wds = 1;
1064b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k += 32;
1065b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1066b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (de) {
1067b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *e = de - Bias - (P-1) + k;
1068b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *bits = P - k;
1069b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1070b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else {
1071b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *e = de - Bias - (P-1) + 1 + k;
1072b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *bits = 32*i - hi0bits(x[i-1]);
1073b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1074b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return b;
1075b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
1076b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1077b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Compute the ratio of two Bigints, as a double.  The result may have an
1078b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   error of up to 2.5 ulps. */
1079b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1080b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic double
1081b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonratio(Bigint *a, Bigint *b)
1082b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
1083b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    U da, db;
1084b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int k, ka, kb;
1085b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1086b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    dval(&da) = b2d(a, &ka);
1087b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    dval(&db) = b2d(b, &kb);
1088b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    k = ka - kb + 32*(a->wds - b->wds);
1089b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (k > 0)
1090b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word0(&da) += k*Exp_msk1;
1091b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else {
1092b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k = -k;
1093b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word0(&db) += k*Exp_msk1;
1094b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1095b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return dval(&da) / dval(&db);
1096b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
1097b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1098b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic const double
1099b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsontens[] = {
1100b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1101b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1102b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    1e20, 1e21, 1e22
1103b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson};
1104b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1105b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic const double
1106b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonbigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
1107b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
1108b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                                   9007199254740992.*9007199254740992.e-256
1109b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                                   /* = 2^106 * 1e-256 */
1110b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson};
1111b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */
1112b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* flag unnecessarily.  It leads to a song and dance at the end of strtod. */
1113b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define Scale_Bit 0x10
1114b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define n_bigtens 5
1115b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1116b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define ULbits 32
1117b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define kshift 5
1118b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define kmask 31
1119b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1120b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1121b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic int
1122b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsondshift(Bigint *b, int p2)
1123b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
1124b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int rv = hi0bits(b->x[b->wds-1]) - 4;
1125b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (p2 > 0)
1126b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        rv -= p2;
1127b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return rv & kmask;
1128b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
1129b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1130b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* special case of Bigint division.  The quotient is always in the range 0 <=
1131b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   quotient < 10, and on entry the divisor S is normalized so that its top 4
1132b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   bits (28--31) are zero and bit 27 is set. */
1133b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1134b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic int
1135b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonquorem(Bigint *b, Bigint *S)
1136b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
1137b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int n;
1138b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong *bx, *bxe, q, *sx, *sxe;
1139b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef ULLong
1140b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULLong borrow, carry, y, ys;
1141b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
1142b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong borrow, carry, y, ys;
1143b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong si, z, zs;
1144b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
1145b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1146b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    n = S->wds;
1147b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef DEBUG
1148b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /*debug*/ if (b->wds > n)
1149b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /*debug*/       Bug("oversize b in quorem");
1150b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
1151b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (b->wds < n)
1152b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return 0;
1153b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    sx = S->x;
1154b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    sxe = sx + --n;
1155b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    bx = b->x;
1156b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    bxe = bx + n;
1157b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    q = *bxe / (*sxe + 1);      /* ensure q <= true quotient */
1158b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef DEBUG
1159b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /*debug*/ if (q > 9)
1160b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /*debug*/       Bug("oversized quotient in quorem");
1161b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
1162b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (q) {
1163b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        borrow = 0;
1164b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        carry = 0;
1165b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        do {
1166b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef ULLong
1167b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            ys = *sx++ * (ULLong)q + carry;
1168b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            carry = ys >> 32;
1169b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            y = *bx - (ys & FFFFFFFF) - borrow;
1170b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            borrow = y >> 32 & (ULong)1;
1171fd2ad8b4f2c88cba76d6b2cbca92612fc3fc8b61Mark Dickinson            *bx++ = (ULong)(y & FFFFFFFF);
1172b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
1173b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            si = *sx++;
1174b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            ys = (si & 0xffff) * q + carry;
1175b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            zs = (si >> 16) * q + (ys >> 16);
1176b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            carry = zs >> 16;
1177b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
1178b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            borrow = (y & 0x10000) >> 16;
1179b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            z = (*bx >> 16) - (zs & 0xffff) - borrow;
1180b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            borrow = (z & 0x10000) >> 16;
1181b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Storeinc(bx, z, y);
1182b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
1183b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1184b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        while(sx <= sxe);
1185b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (!*bxe) {
1186b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bx = b->x;
1187b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            while(--bxe > bx && !*bxe)
1188b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                --n;
1189b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            b->wds = n;
1190b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1191b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1192b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (cmp(b, S) >= 0) {
1193b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        q++;
1194b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        borrow = 0;
1195b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        carry = 0;
1196b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        bx = b->x;
1197b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        sx = S->x;
1198b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        do {
1199b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef ULLong
1200b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            ys = *sx++ + carry;
1201b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            carry = ys >> 32;
1202b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            y = *bx - (ys & FFFFFFFF) - borrow;
1203b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            borrow = y >> 32 & (ULong)1;
1204fd2ad8b4f2c88cba76d6b2cbca92612fc3fc8b61Mark Dickinson            *bx++ = (ULong)(y & FFFFFFFF);
1205b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#else
1206b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            si = *sx++;
1207b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            ys = (si & 0xffff) + carry;
1208b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            zs = (si >> 16) + (ys >> 16);
1209b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            carry = zs >> 16;
1210b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
1211b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            borrow = (y & 0x10000) >> 16;
1212b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            z = (*bx >> 16) - (zs & 0xffff) - borrow;
1213b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            borrow = (z & 0x10000) >> 16;
1214b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Storeinc(bx, z, y);
1215b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
1216b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1217b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        while(sx <= sxe);
1218b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        bx = b->x;
1219b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        bxe = bx + n;
1220b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (!*bxe) {
1221b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            while(--bxe > bx && !*bxe)
1222b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                --n;
1223b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            b->wds = n;
1224b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1225b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1226b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return q;
1227b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
1228b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1229853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson/* sulp(x) is a version of ulp(x) that takes bc.scale into account.
123081612e877870c52bae7c590076eec642b9803138Mark Dickinson
1231853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   Assuming that x is finite and nonnegative (positive zero is fine
1232853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   here) and x / 2^bc.scale is exactly representable as a double,
1233853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   sulp(x) is equivalent to 2^bc.scale * ulp(x / 2^bc.scale). */
123481612e877870c52bae7c590076eec642b9803138Mark Dickinson
123581612e877870c52bae7c590076eec642b9803138Mark Dickinsonstatic double
123681612e877870c52bae7c590076eec642b9803138Mark Dickinsonsulp(U *x, BCinfo *bc)
123781612e877870c52bae7c590076eec642b9803138Mark Dickinson{
123881612e877870c52bae7c590076eec642b9803138Mark Dickinson    U u;
123981612e877870c52bae7c590076eec642b9803138Mark Dickinson
1240853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    if (bc->scale && 2*P + 1 > (int)((word0(x) & Exp_mask) >> Exp_shift)) {
124181612e877870c52bae7c590076eec642b9803138Mark Dickinson        /* rv/2^bc->scale is subnormal */
124281612e877870c52bae7c590076eec642b9803138Mark Dickinson        word0(&u) = (P+2)*Exp_msk1;
124381612e877870c52bae7c590076eec642b9803138Mark Dickinson        word1(&u) = 0;
124481612e877870c52bae7c590076eec642b9803138Mark Dickinson        return u.d;
124581612e877870c52bae7c590076eec642b9803138Mark Dickinson    }
1246853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    else {
1247853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        assert(word0(x) || word1(x)); /* x != 0.0 */
124881612e877870c52bae7c590076eec642b9803138Mark Dickinson        return ulp(x);
1249853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    }
125081612e877870c52bae7c590076eec642b9803138Mark Dickinson}
1251b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1252853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson/* The bigcomp function handles some hard cases for strtod, for inputs
1253853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   with more than STRTOD_DIGLIM digits.  It's called once an initial
1254853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   estimate for the double corresponding to the input string has
1255853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   already been obtained by the code in _Py_dg_strtod.
1256853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1257853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   The bigcomp function is only called after _Py_dg_strtod has found a
1258853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   double value rv such that either rv or rv + 1ulp represents the
1259853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   correctly rounded value corresponding to the original string.  It
1260853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   determines which of these two values is the correct one by
1261853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   computing the decimal digits of rv + 0.5ulp and comparing them with
1262853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   the corresponding digits of s0.
1263853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1264853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   In the following, write dv for the absolute value of the number represented
1265853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   by the input string.
1266853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1267853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   Inputs:
1268853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1269853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson     s0 points to the first significant digit of the input string.
1270853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1271853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson     rv is a (possibly scaled) estimate for the closest double value to the
1272853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        value represented by the original input to _Py_dg_strtod.  If
1273853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        bc->scale is nonzero, then rv/2^(bc->scale) is the approximation to
1274853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        the input value.
1275853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1276853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson     bc is a struct containing information gathered during the parsing and
1277853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        estimation steps of _Py_dg_strtod.  Description of fields follows:
1278853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1279853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        bc->e0 gives the exponent of the input value, such that dv = (integer
1280853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson           given by the bd->nd digits of s0) * 10**e0
1281853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1282853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        bc->nd gives the total number of significant digits of s0.  It will
1283853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson           be at least 1.
1284853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1285853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        bc->nd0 gives the number of significant digits of s0 before the
1286853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson           decimal separator.  If there's no decimal separator, bc->nd0 ==
1287853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson           bc->nd.
1288853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1289853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        bc->scale is the value used to scale rv to avoid doing arithmetic with
1290853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson           subnormal values.  It's either 0 or 2*P (=106).
1291853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1292853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson   Outputs:
1293853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1294853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson     On successful exit, rv/2^(bc->scale) is the closest double to dv.
1295853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1296853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson     Returns 0 on success, -1 on failure (e.g., due to a failed malloc call). */
1297b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1298b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic int
1299b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonbigcomp(U *rv, const char *s0, BCinfo *bc)
1300b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
1301b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bigint *b, *d;
1302853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    int b2, bbits, d2, dd, i, nd, nd0, odd, p2, p5;
1303b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1304853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    dd = 0; /* silence compiler warning about possibly unused variable */
1305b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    nd = bc->nd;
1306b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    nd0 = bc->nd0;
130781612e877870c52bae7c590076eec642b9803138Mark Dickinson    p5 = nd + bc->e0;
1308853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    if (rv->d == 0.) {
1309853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        /* special case because d2b doesn't handle 0.0 */
1310853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        b = i2b(0);
1311b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (b == NULL)
1312b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return -1;
1313853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        p2 = Emin - P + 1; /* = -1074 for IEEE 754 binary64 */
1314853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        bbits = 0;
1315b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1316853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    else {
1317b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b = d2b(rv, &p2, &bbits);
1318b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (b == NULL)
1319b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return -1;
1320853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        p2 -= bc->scale;
1321b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1322853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    /* now rv/2^(bc->scale) = b * 2**p2, and b has bbits significant bits */
1323853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1324853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    /* Replace (b, p2) by (b << i, p2 - i), with i the largest integer such
1325853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson       that b << i has at most P significant bits and p2 - i >= Emin - P +
1326853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson       1. */
1327b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    i = P - bbits;
1328853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    if (i > p2 - (Emin - P + 1))
1329853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        i = p2 - (Emin - P + 1);
1330853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    /* increment i so that we shift b by an extra bit;  then or-ing a 1 into
1331853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson       the lsb of b gives us rv/2^(bc->scale) + 0.5ulp. */
1332853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    b = lshift(b, ++i);
1333853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    if (b == NULL)
1334853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        return -1;
1335853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    /* record whether the lsb of rv/2^(bc->scale) is odd:  in the exact halfway
1336853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson       case, this is used for round to even. */
1337853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    odd = b->x[0] & 2;
1338853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    b->x[0] |= 1;
1339853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1340b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    p2 -= p5 + i;
1341b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    d = i2b(1);
1342b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (d == NULL) {
1343b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bfree(b);
1344b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return -1;
1345b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1346b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /* Arrange for convenient computation of quotients:
1347b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     * shift left if necessary so divisor has 4 leading 0 bits.
1348b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     */
1349b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (p5 > 0) {
1350b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        d = pow5mult(d, p5);
1351b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (d == NULL) {
1352b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(b);
1353b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return -1;
1354b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1355b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1356b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else if (p5 < 0) {
1357b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b = pow5mult(b, -p5);
1358b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (b == NULL) {
1359b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(d);
1360b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return -1;
1361b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1362b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1363b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (p2 > 0) {
1364b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b2 = p2;
1365b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        d2 = 0;
1366b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1367b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else {
1368b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b2 = 0;
1369b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        d2 = -p2;
1370b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1371b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    i = dshift(d, d2);
1372b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if ((b2 += i) > 0) {
1373b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b = lshift(b, b2);
1374b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (b == NULL) {
1375b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(d);
1376b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return -1;
1377b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1378b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1379b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if ((d2 += i) > 0) {
1380b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        d = lshift(d, d2);
1381b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (d == NULL) {
1382b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(b);
1383b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return -1;
1384b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1385b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1386b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1387add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* Compare s0 with b/d: set dd to -1, 0, or 1 according as s0 < b/d, s0 ==
1388add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson     * b/d, or s0 > b/d.  Here the digits of s0 are thought of as representing
1389add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson     * a number in the range [0.1, 1). */
1390add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    if (cmp(b, d) >= 0)
1391add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* b/d >= 1 */
139281612e877870c52bae7c590076eec642b9803138Mark Dickinson        dd = -1;
1393add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    else {
1394add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        i = 0;
1395add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        for(;;) {
1396add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            b = multadd(b, 10, 0);
1397add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            if (b == NULL) {
1398add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                Bfree(d);
1399add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                return -1;
1400add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            }
1401add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            dd = s0[i < nd0 ? i : i+1] - '0' - quorem(b, d);
1402add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            i++;
1403b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1404add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            if (dd)
1405add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                break;
1406add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            if (!b->x[0] && b->wds == 1) {
1407add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                /* b/d == 0 */
1408add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                dd = i < nd;
1409add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                break;
1410add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            }
1411add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            if (!(i < nd)) {
1412add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                /* b/d != 0, but digits of s0 exhausted */
1413add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                dd = -1;
1414add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                break;
1415add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            }
1416853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        }
1417b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1418b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bfree(b);
1419b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bfree(d);
1420853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    if (dd > 0 || (dd == 0 && odd))
1421853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson        dval(rv) += sulp(rv, bc);
1422b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return 0;
1423b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
1424b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1425b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsondouble
1426b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson_Py_dg_strtod(const char *s00, char **se)
1427b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
1428add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, e, e1, error;
1429add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    int esign, i, j, k, lz, nd, nd0, sign;
1430b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    const char *s, *s0, *s1;
1431b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    double aadj, aadj1;
1432b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    U aadj2, adj, rv, rv0;
1433add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    ULong y, z, abs_exp;
143445b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson    Long L;
1435b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    BCinfo bc;
1436b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
1437b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1438b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    dval(&rv) = 0.;
1439add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1440add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* Start parsing. */
1441add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    c = *(s = s00);
1442add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1443add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* Parse optional sign, if present. */
1444add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    sign = 0;
1445add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    switch (c) {
1446add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    case '-':
1447add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        sign = 1;
1448add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* no break */
1449add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    case '+':
1450add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        c = *++s;
1451b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1452add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1453add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* Skip leading zeros: lz is true iff there were leading zeros. */
1454add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    s1 = s;
1455add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    while (c == '0')
1456add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        c = *++s;
1457add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    lz = s != s1;
1458add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1459add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* Point s0 at the first nonzero digit (if any).  nd0 will be the position
1460add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson       of the point relative to s0.  nd will be the total number of digits
1461add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson       ignoring leading zeros. */
1462add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    s0 = s1 = s;
1463add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    while ('0' <= c && c <= '9')
1464add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        c = *++s;
1465add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    nd0 = nd = s - s1;
1466add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1467add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* Parse decimal point and following digits. */
1468b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (c == '.') {
1469b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        c = *++s;
1470b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (!nd) {
1471add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            s1 = s;
1472add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            while (c == '0')
1473add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                c = *++s;
1474add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            lz = lz || s != s1;
1475add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            nd0 -= s - s1;
1476add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            s0 = s;
1477b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1478add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        s1 = s;
1479add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        while ('0' <= c && c <= '9')
1480add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            c = *++s;
1481add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        nd += s - s1;
1482add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    }
1483add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1484add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* Now lz is true if and only if there were leading zero digits, and nd
1485add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson       gives the total number of digits ignoring leading zeros.  A valid input
1486add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson       must have at least one digit. */
1487add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    if (!nd && !lz) {
1488add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        if (se)
1489add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            *se = (char *)s00;
1490add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        goto parse_error;
1491b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1492add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1493add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* Parse exponent. */
1494b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    e = 0;
1495b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (c == 'e' || c == 'E') {
1496b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        s00 = s;
1497add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        c = *++s;
1498add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1499add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* Exponent sign. */
1500b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        esign = 0;
1501add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        switch (c) {
1502b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        case '-':
1503b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            esign = 1;
1504add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            /* no break */
1505b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        case '+':
1506b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            c = *++s;
1507b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1508add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1509add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* Skip zeros.  lz is true iff there are leading zeros. */
1510add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        s1 = s;
1511add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        while (c == '0')
1512add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            c = *++s;
1513add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        lz = s != s1;
1514add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1515add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* Get absolute value of the exponent. */
1516add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        s1 = s;
1517add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        abs_exp = 0;
1518add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        while ('0' <= c && c <= '9') {
1519add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            abs_exp = 10*abs_exp + (c - '0');
1520add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            c = *++s;
1521b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1522add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1523add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* abs_exp will be correct modulo 2**32.  But 10**9 < 2**32, so if
1524add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           there are at most 9 significant exponent digits then overflow is
1525add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           impossible. */
1526add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        if (s - s1 > 9 || abs_exp > MAX_ABS_EXP)
1527add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            e = (int)MAX_ABS_EXP;
1528b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else
1529add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            e = (int)abs_exp;
1530add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        if (esign)
1531add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            e = -e;
1532add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1533add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* A valid exponent must have at least one digit. */
1534add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        if (s == s1 && !lz)
1535b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            s = s00;
1536b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1537add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1538add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* Adjust exponent to take into account position of the point. */
1539add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    e -= nd - nd0;
1540add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    if (nd0 <= 0)
154145b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson        nd0 = nd;
154245b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson
1543add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* Finished parsing.  Set se to indicate how far we parsed */
1544add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    if (se)
1545add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        *se = (char *)s;
1546add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1547add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* If all digits were zero, exit with return value +-0.0.  Otherwise,
1548add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson       strip trailing zeros: scan back until we hit a nonzero digit. */
1549add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    if (!nd)
1550add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        goto ret;
155145b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson    for (i = nd; i > 0; ) {
155245b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson        --i;
155345b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson        if (s0[i < nd0 ? i : i+1] != '0') {
155445b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson            ++i;
155545b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson            break;
155645b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson        }
155745b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson    }
155845b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson    e += nd - i;
155945b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson    nd = i;
156045b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson    if (nd0 > nd)
156145b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson        nd0 = nd;
1562b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1563add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* Summary of parsing results.  After parsing, and dealing with zero
1564add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson     * inputs, we have values s0, nd0, nd, e, sign, where:
156545b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *
1566add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson     *  - s0 points to the first significant digit of the input string
156745b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *
156845b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *  - nd is the total number of significant digits (here, and
156945b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *    below, 'significant digits' means the set of digits of the
157045b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *    significand of the input that remain after ignoring leading
1571add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson     *    and trailing zeros).
157245b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *
1573add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson     *  - nd0 indicates the position of the decimal point, if present; it
1574add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson     *    satisfies 1 <= nd0 <= nd.  The nd significant digits are in
1575add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson     *    s0[0:nd0] and s0[nd0+1:nd+1] using the usual Python half-open slice
1576add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson     *    notation.  (If nd0 < nd, then s0[nd0] contains a '.'  character; if
1577add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson     *    nd0 == nd, then s0[nd0] could be any non-digit character.)
157845b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *
157945b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *  - e is the adjusted exponent: the absolute value of the number
158045b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *    represented by the original input string is n * 10**e, where
158145b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *    n is the integer represented by the concatenation of
158245b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *    s0[0:nd0] and s0[nd0+1:nd+1]
158345b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *
158445b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *  - sign gives the sign of the input:  1 for negative, 0 for positive
158545b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *
158645b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *  - the first and last significant digits are nonzero
158745b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     */
158845b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson
158945b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson    /* put first DBL_DIG+1 digits into integer y and z.
159045b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *
159145b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *  - y contains the value represented by the first min(9, nd)
159245b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *    significant digits
159345b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *
159445b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *  - if nd > 9, z contains the value represented by significant digits
159545b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *    with indices in [9, min(16, nd)).  So y * 10**(min(16, nd) - 9) + z
159645b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     *    gives the value represented by the first min(16, nd) sig. digits.
159745b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson     */
159845b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson
1599add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    bc.e0 = e1 = e;
160045b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson    y = z = 0;
160145b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson    for (i = 0; i < nd; i++) {
160245b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson        if (i < 9)
160345b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson            y = 10*y + s0[i < nd0 ? i : i+1] - '0';
160445b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson        else if (i < DBL_DIG+1)
160545b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson            z = 10*z + s0[i < nd0 ? i : i+1] - '0';
160645b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson        else
160745b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson            break;
160845b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson    }
160945b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson
1610b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
1611b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    dval(&rv) = y;
1612b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (k > 9) {
1613b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        dval(&rv) = tens[k - 9] * dval(&rv) + z;
1614b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1615b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    bd0 = 0;
1616b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (nd <= DBL_DIG
1617b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        && Flt_Rounds == 1
1618b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        ) {
1619b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (!e)
1620b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto ret;
1621b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (e > 0) {
1622b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (e <= Ten_pmax) {
1623b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                dval(&rv) *= tens[e];
1624b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto ret;
1625b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1626b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            i = DBL_DIG - nd;
1627b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (e <= Ten_pmax + i) {
1628b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                /* A fancier test would sometimes let us do
1629b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                 * this for larger i values.
1630b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                 */
1631b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                e -= i;
1632b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                dval(&rv) *= tens[i];
1633b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                dval(&rv) *= tens[e];
1634b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto ret;
1635b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1636b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1637b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else if (e >= -Ten_pmax) {
1638b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&rv) /= tens[-e];
1639b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto ret;
1640b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1641b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1642b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    e1 += nd - k;
1643b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1644b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    bc.scale = 0;
1645b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1646b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /* Get starting approximation = rv * 10**e1 */
1647b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1648b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (e1 > 0) {
1649b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if ((i = e1 & 15))
1650b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&rv) *= tens[i];
1651b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (e1 &= ~15) {
1652add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            if (e1 > DBL_MAX_10_EXP)
1653add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                goto ovfl;
1654b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            e1 >>= 4;
1655b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            for(j = 0; e1 > 1; j++, e1 >>= 1)
1656b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (e1 & 1)
1657b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    dval(&rv) *= bigtens[j];
1658b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            /* The last multiplication could overflow. */
1659b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            word0(&rv) -= P*Exp_msk1;
1660b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&rv) *= bigtens[j];
1661b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if ((z = word0(&rv) & Exp_mask)
1662b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                > Exp_msk1*(DBL_MAX_EXP+Bias-P))
1663b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto ovfl;
1664b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
1665b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                /* set to largest number */
1666b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                /* (Can't trust DBL_MAX) */
1667b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                word0(&rv) = Big0;
1668b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                word1(&rv) = Big1;
1669b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1670b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            else
1671b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                word0(&rv) += P*Exp_msk1;
1672b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1673b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1674b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else if (e1 < 0) {
1675add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* The input decimal value lies in [10**e1, 10**(e1+16)).
1676add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1677add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           If e1 <= -512, underflow immediately.
1678add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           If e1 <= -256, set bc.scale to 2*P.
1679add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1680add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           So for input value < 1e-256, bc.scale is always set;
1681add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           for input value >= 1e-240, bc.scale is never set.
1682add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           For input values in [1e-256, 1e-240), bc.scale may or may
1683add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           not be set. */
1684add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1685b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        e1 = -e1;
1686b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if ((i = e1 & 15))
1687b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&rv) /= tens[i];
1688b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (e1 >>= 4) {
1689b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (e1 >= 1 << n_bigtens)
1690b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto undfl;
1691b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (e1 & Scale_Bit)
1692b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                bc.scale = 2*P;
1693b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            for(j = 0; e1 > 0; j++, e1 >>= 1)
1694b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (e1 & 1)
1695b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    dval(&rv) *= tinytens[j];
1696b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
1697b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                                            >> Exp_shift)) > 0) {
1698b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                /* scaled rv is denormal; clear j low bits */
1699b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (j >= 32) {
1700b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    word1(&rv) = 0;
1701b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    if (j >= 53)
1702b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        word0(&rv) = (P+2)*Exp_msk1;
1703b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    else
1704b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        word0(&rv) &= 0xffffffff << (j-32);
1705b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
1706b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                else
1707b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    word1(&rv) &= 0xffffffff << j;
1708b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1709add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            if (!dval(&rv))
1710add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                goto undfl;
1711b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1712b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1713b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1714b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /* Now the hard part -- adjusting rv to the correct value.*/
1715b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1716b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /* Put digits into bd: true value = bd * 10^e */
1717b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1718b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    bc.nd = nd;
171981612e877870c52bae7c590076eec642b9803138Mark Dickinson    bc.nd0 = nd0;       /* Only needed if nd > STRTOD_DIGLIM, but done here */
1720b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        /* to silence an erroneous warning about bc.nd0 */
1721b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        /* possibly not being initialized. */
172281612e877870c52bae7c590076eec642b9803138Mark Dickinson    if (nd > STRTOD_DIGLIM) {
172381612e877870c52bae7c590076eec642b9803138Mark Dickinson        /* ASSERT(STRTOD_DIGLIM >= 18); 18 == one more than the */
1724b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /* minimum number of decimal digits to distinguish double values */
1725b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /* in IEEE arithmetic. */
172645b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson
172745b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson        /* Truncate input to 18 significant digits, then discard any trailing
172845b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson           zeros on the result by updating nd, nd0, e and y suitably. (There's
172945b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson           no need to update z; it's not reused beyond this point.) */
173045b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson        for (i = 18; i > 0; ) {
173145b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson            /* scan back until we hit a nonzero digit.  significant digit 'i'
173245b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson            is s0[i] if i < nd0, s0[i+1] if i >= nd0. */
1733b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            --i;
173445b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson            if (s0[i < nd0 ? i : i+1] != '0') {
173545b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson                ++i;
173645b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson                break;
173745b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson            }
1738b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1739b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        e += nd - i;
1740b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        nd = i;
1741b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (nd0 > nd)
1742b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            nd0 = nd;
1743b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (nd < 9) { /* must recompute y */
1744b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            y = 0;
1745b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            for(i = 0; i < nd0; ++i)
1746b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                y = 10*y + s0[i] - '0';
174745b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson            for(; i < nd; ++i)
174845b6365974b6611c3dc1c2e48c55d36ca0e500d9Mark Dickinson                y = 10*y + s0[i+1] - '0';
1749b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1750b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
1751853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson    bd0 = s2b(s0, nd0, nd, y);
1752b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (bd0 == NULL)
1753b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        goto failed_malloc;
1754b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1755add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* Notation for the comments below.  Write:
1756add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1757add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson         - dv for the absolute value of the number represented by the original
1758add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           decimal input string.
1759add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1760add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson         - if we've truncated dv, write tdv for the truncated value.
1761add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           Otherwise, set tdv == dv.
1762add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1763add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson         - srv for the quantity rv/2^bc.scale; so srv is the current binary
1764add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           approximation to tdv (and dv).  It should be exactly representable
1765add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           in an IEEE 754 double.
1766add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    */
1767add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1768b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    for(;;) {
1769add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1770add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* This is the main correction loop for _Py_dg_strtod.
1771add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1772add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           We've got a decimal value tdv, and a floating-point approximation
1773add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           srv=rv/2^bc.scale to tdv.  The aim is to determine whether srv is
1774add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           close enough (i.e., within 0.5 ulps) to tdv, and to compute a new
1775add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           approximation if not.
1776add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1777add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           To determine whether srv is close enough to tdv, compute integers
1778add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           bd, bb and bs proportional to tdv, srv and 0.5 ulp(srv)
1779add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           respectively, and then use integer arithmetic to determine whether
1780add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           |tdv - srv| is less than, equal to, or greater than 0.5 ulp(srv).
1781add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        */
1782add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1783b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        bd = Balloc(bd0->k);
1784b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (bd == NULL) {
1785b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(bd0);
1786b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto failed_malloc;
1787b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1788b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bcopy(bd, bd0);
1789b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        bb = d2b(&rv, &bbe, &bbbits);   /* rv = bb * 2^bbe */
1790b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (bb == NULL) {
1791b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(bd);
1792b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(bd0);
1793b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto failed_malloc;
1794b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1795add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* tdv = bd * 10^e;  srv = bb * 2^(bbe - scale) */
1796b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        bs = i2b(1);
1797b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (bs == NULL) {
1798b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(bb);
1799b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(bd);
1800b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(bd0);
1801b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto failed_malloc;
1802b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1803b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1804b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (e >= 0) {
1805b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bb2 = bb5 = 0;
1806b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bd2 = bd5 = e;
1807b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1808b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else {
1809b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bb2 = bb5 = -e;
1810b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bd2 = bd5 = 0;
1811b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1812b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (bbe >= 0)
1813b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bb2 += bbe;
1814b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else
1815b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bd2 -= bbe;
1816add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1817add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* At this stage e = bd2 - bb2 + bbe = bd5 - bb5, so:
1818add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1819add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson              tdv = bd * 2^(bbe + bd2 - bb2) * 5^(bd5 - bb5)
1820add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson              srv = bb * 2^(bbe - scale).
1821add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1822add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           Compute j such that
1823add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1824add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson              0.5 ulp(srv) = 2^(bbe - scale - j)
1825add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        */
1826add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1827b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        bs2 = bb2;
1828b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        j = bbe - bc.scale;
1829b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i = j + bbbits - 1;     /* logb(rv) */
1830b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (i < Emin)   /* denormal */
1831b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            j += P - Emin;
1832b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else
1833b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            j = P + 1 - bbbits;
1834add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1835add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson       /* Now we have:
1836add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1837add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson              M * tdv = bd * 2^(bd2 + scale + j) * 5^bd5
1838add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson              M * srv = bb * 2^(bb2 + j) * 5^bb5
1839add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson              M * 0.5 ulp(srv) = 2^bs2 * 5^bb5
1840add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1841add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           where M is the constant (currently) represented by 2^(j + scale +
1842add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           bb2 - bbe) * 5^bb5.
1843add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        */
1844add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1845b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        bb2 += j;
1846b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        bd2 += j;
1847b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        bd2 += bc.scale;
1848add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1849add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* After the adjustments above, tdv, srv and 0.5 ulp(srv) are
1850add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           proportional to: bd * 2^bd2 * 5^bd5, bb * 2^bb2 * 5^bb5, and
1851add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           bs * 2^bs2 * 5^bb5, respectively. */
1852add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1853add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* Remove excess powers of 2. i = min(bb2, bd2, bs2). */
1854b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i = bb2 < bd2 ? bb2 : bd2;
1855b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (i > bs2)
1856b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            i = bs2;
1857b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (i > 0) {
1858b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bb2 -= i;
1859b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bd2 -= i;
1860b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bs2 -= i;
1861b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1862add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1863add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* Scale bb, bd, bs by the appropriate powers of 2 and 5. */
1864b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (bb5 > 0) {
1865b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bs = pow5mult(bs, bb5);
1866b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (bs == NULL) {
1867b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bb);
1868b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bd);
1869b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bd0);
1870b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
1871b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1872b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bb1 = mult(bs, bb);
1873b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(bb);
1874b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bb = bb1;
1875b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (bb == NULL) {
1876b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bs);
1877b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bd);
1878b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bd0);
1879b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
1880b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1881b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1882b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (bb2 > 0) {
1883b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bb = lshift(bb, bb2);
1884b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (bb == NULL) {
1885b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bs);
1886b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bd);
1887b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bd0);
1888b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
1889b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1890b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1891b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (bd5 > 0) {
1892b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bd = pow5mult(bd, bd5);
1893b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (bd == NULL) {
1894b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bb);
1895b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bs);
1896b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bd0);
1897b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
1898b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1899b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1900b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (bd2 > 0) {
1901b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bd = lshift(bd, bd2);
1902b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (bd == NULL) {
1903b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bb);
1904b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bs);
1905b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bd0);
1906b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
1907b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1908b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1909b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (bs2 > 0) {
1910b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            bs = lshift(bs, bs2);
1911b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (bs == NULL) {
1912b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bb);
1913b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bd);
1914b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bd0);
1915b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
1916b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1917b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1918add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1919add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        /* Now bd, bb and bs are scaled versions of tdv, srv and 0.5 ulp(srv),
1920add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           respectively.  Compute the difference |tdv - srv|, and compare
1921add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson           with 0.5 ulp(srv). */
1922add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
1923b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        delta = diff(bb, bd);
1924b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (delta == NULL) {
1925b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(bb);
1926b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(bs);
1927b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(bd);
1928b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(bd0);
1929b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto failed_malloc;
1930b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1931add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson        dsign = delta->sign;
1932b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        delta->sign = 0;
1933b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i = cmp(delta, bs);
1934b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (bc.nd > nd && i <= 0) {
1935add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            if (dsign)
1936b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                break;  /* Must use bigcomp(). */
1937853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1938853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson            /* Here rv overestimates the truncated decimal value by at most
1939853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson               0.5 ulp(rv).  Hence rv either overestimates the true decimal
1940853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson               value by <= 0.5 ulp(rv), or underestimates it by some small
1941853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson               amount (< 0.1 ulp(rv)); either way, rv is within 0.5 ulps of
1942853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson               the true decimal value, so it's possible to exit.
1943853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1944853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson               Exception: if scaled rv is a normal exact power of 2, but not
1945853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson               DBL_MIN, then rv - 0.5 ulp(rv) takes us all the way down to the
1946853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson               next double, so the correctly rounded result is either rv - 0.5
1947853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson               ulp(rv) or rv; in this case, use bigcomp to distinguish. */
1948853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1949853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson            if (!word1(&rv) && !(word0(&rv) & Bndry_mask)) {
1950853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson                /* rv can't be 0, since it's an overestimate for some
1951853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson                   nonzero value.  So rv is a normal power of 2. */
1952853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson                j = (int)(word0(&rv) & Exp_mask) >> Exp_shift;
1953853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson                /* rv / 2^bc.scale = 2^(j - 1023 - bc.scale); use bigcomp if
1954853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson                   rv / 2^bc.scale >= 2^-1021. */
1955853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson                if (j - bc.scale >= 2) {
1956853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson                    dval(&rv) -= 0.5 * sulp(&rv, &bc);
1957add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                    break; /* Use bigcomp. */
1958853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson                }
1959853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson            }
1960853c3bbc4c10c84f66471ff9423d572301f3015bMark Dickinson
1961b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            {
1962b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                bc.nd = nd;
1963b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                i = -1; /* Discarded digits make delta smaller. */
1964b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1965b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1966b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
1967b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (i < 0) {
1968b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            /* Error is less than half an ulp -- check for
1969b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson             * special case of mantissa a power of two.
1970b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson             */
1971add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            if (dsign || word1(&rv) || word0(&rv) & Bndry_mask
1972b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
1973b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                ) {
1974b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                break;
1975b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1976b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (!delta->x[0] && delta->wds <= 1) {
1977b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                /* exact result */
1978b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                break;
1979b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1980b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            delta = lshift(delta,Log2P);
1981b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (delta == NULL) {
1982b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bb);
1983b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bs);
1984b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bd);
1985b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(bd0);
1986b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
1987b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
1988b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (cmp(delta, bs) > 0)
1989b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto drop_down;
1990b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            break;
1991b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
1992b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (i == 0) {
1993b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            /* exactly half-way between */
1994add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            if (dsign) {
1995b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
1996b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    &&  word1(&rv) == (
1997b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        (bc.scale &&
1998b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                         (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) ?
1999b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
2000b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        0xffffffff)) {
2001b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    /*boundary case -- increment exponent*/
2002b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    word0(&rv) = (word0(&rv) & Exp_mask)
2003b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        + Exp_msk1
2004b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        ;
2005b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    word1(&rv) = 0;
2006add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                    dsign = 0;
2007b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    break;
2008b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
2009b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2010b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
2011b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson              drop_down:
2012b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                /* boundary case -- decrement exponent */
2013b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (bc.scale) {
2014b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    L = word0(&rv) & Exp_mask;
2015b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    if (L <= (2*P+1)*Exp_msk1) {
2016b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        if (L > (P+2)*Exp_msk1)
2017b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                            /* round even ==> */
2018b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                            /* accept rv */
2019b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                            break;
2020b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        /* rv = smallest denormal */
2021add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                        if (bc.nd > nd)
2022b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                            break;
2023b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        goto undfl;
2024b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    }
2025b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
2026b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                L = (word0(&rv) & Exp_mask) - Exp_msk1;
2027b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                word0(&rv) = L | Bndry_mask1;
2028b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                word1(&rv) = 0xffffffff;
2029b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                break;
2030b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2031b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (!(word1(&rv) & LSB))
2032b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                break;
2033add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            if (dsign)
2034b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                dval(&rv) += ulp(&rv);
2035b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            else {
2036b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                dval(&rv) -= ulp(&rv);
2037b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (!dval(&rv)) {
203881612e877870c52bae7c590076eec642b9803138Mark Dickinson                    if (bc.nd >nd)
2039b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        break;
2040b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto undfl;
2041b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
2042b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2043add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            dsign = 1 - dsign;
2044b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            break;
2045b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2046b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if ((aadj = ratio(delta, bs)) <= 2.) {
2047add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            if (dsign)
2048b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                aadj = aadj1 = 1.;
2049b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            else if (word1(&rv) || word0(&rv) & Bndry_mask) {
2050b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (word1(&rv) == Tiny1 && !word0(&rv)) {
205181612e877870c52bae7c590076eec642b9803138Mark Dickinson                    if (bc.nd >nd)
2052b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        break;
2053b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto undfl;
2054b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
2055b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                aadj = 1.;
2056b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                aadj1 = -1.;
2057b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2058b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            else {
2059b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                /* special case -- power of FLT_RADIX to be */
2060b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                /* rounded down... */
2061b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2062b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (aadj < 2./FLT_RADIX)
2063b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    aadj = 1./FLT_RADIX;
2064b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                else
2065b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    aadj *= 0.5;
2066b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                aadj1 = -aadj;
2067b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2068b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2069b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else {
2070b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            aadj *= 0.5;
2071add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson            aadj1 = dsign ? aadj : -aadj;
2072b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (Flt_Rounds == 0)
2073b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                aadj1 += 0.5;
2074b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2075b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        y = word0(&rv) & Exp_mask;
2076b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2077b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /* Check for overflow */
2078b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2079b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
2080b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&rv0) = dval(&rv);
2081b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            word0(&rv) -= P*Exp_msk1;
2082b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            adj.d = aadj1 * ulp(&rv);
2083b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&rv) += adj.d;
2084b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if ((word0(&rv) & Exp_mask) >=
2085b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
2086c4f1868e88b950d758f200080baadd7989dae593Mark Dickinson                if (word0(&rv0) == Big0 && word1(&rv0) == Big1) {
2087c4f1868e88b950d758f200080baadd7989dae593Mark Dickinson                    Bfree(bb);
2088c4f1868e88b950d758f200080baadd7989dae593Mark Dickinson                    Bfree(bd);
2089c4f1868e88b950d758f200080baadd7989dae593Mark Dickinson                    Bfree(bs);
2090c4f1868e88b950d758f200080baadd7989dae593Mark Dickinson                    Bfree(bd0);
2091c4f1868e88b950d758f200080baadd7989dae593Mark Dickinson                    Bfree(delta);
2092b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto ovfl;
2093c4f1868e88b950d758f200080baadd7989dae593Mark Dickinson                }
2094b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                word0(&rv) = Big0;
2095b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                word1(&rv) = Big1;
2096b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto cont;
2097b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2098b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            else
2099b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                word0(&rv) += P*Exp_msk1;
2100b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2101b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else {
2102b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (bc.scale && y <= 2*P*Exp_msk1) {
2103b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (aadj <= 0x7fffffff) {
2104b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    if ((z = (ULong)aadj) <= 0)
2105b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        z = 1;
2106b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    aadj = z;
2107add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                    aadj1 = dsign ? aadj : -aadj;
2108b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
2109b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                dval(&aadj2) = aadj1;
2110b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                word0(&aadj2) += (2*P+1)*Exp_msk1 - y;
2111b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                aadj1 = dval(&aadj2);
2112b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2113b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            adj.d = aadj1 * ulp(&rv);
2114b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&rv) += adj.d;
2115b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2116b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        z = word0(&rv) & Exp_mask;
2117b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (bc.nd == nd) {
2118b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (!bc.scale)
2119b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (y == z) {
2120b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    /* Can we stop now? */
2121b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    L = (Long)aadj;
2122b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    aadj -= L;
2123b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    /* The tolerances below are conservative. */
2124add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson                    if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
2125b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        if (aadj < .4999999 || aadj > .5000001)
2126b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                            break;
2127b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    }
2128b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    else if (aadj < .4999999/FLT_RADIX)
2129b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        break;
2130b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
2131b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2132b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson      cont:
2133b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bfree(bb);
2134b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bfree(bd);
2135b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bfree(bs);
2136b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bfree(delta);
2137b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2138b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bfree(bb);
2139b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bfree(bd);
2140b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bfree(bs);
2141b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bfree(bd0);
2142b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bfree(delta);
2143b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (bc.nd > nd) {
2144b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        error = bigcomp(&rv, s0, &bc);
2145b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (error)
2146b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto failed_malloc;
2147b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2148b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2149b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (bc.scale) {
2150b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
2151b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word1(&rv0) = 0;
2152b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        dval(&rv) *= dval(&rv0);
2153b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2154add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
2155b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson  ret:
2156b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return sign ? -dval(&rv) : dval(&rv);
2157b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2158add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson  parse_error:
2159add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    return 0.0;
2160add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
2161b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson  failed_malloc:
2162b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    errno = ENOMEM;
2163b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return -1.0;
2164add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
2165add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson  undfl:
2166add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    return sign ? -0.0 : 0.0;
2167add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
2168add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson  ovfl:
2169add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    errno = ERANGE;
2170add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    /* Can't trust HUGE_VAL */
2171add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    word0(&rv) = Exp_mask;
2172add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    word1(&rv) = 0;
2173add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson    return sign ? -dval(&rv) : dval(&rv);
2174add282346765a8d61d0d8d7ecaa201492f1facd2Mark Dickinson
2175b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
2176b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2177b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic char *
2178b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonrv_alloc(int i)
2179b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
2180b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int j, k, *r;
2181b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2182b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    j = sizeof(ULong);
2183b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    for(k = 0;
2184b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (unsigned)i;
2185b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        j <<= 1)
2186b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k++;
2187b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    r = (int*)Balloc(k);
2188b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (r == NULL)
2189b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return NULL;
2190b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    *r = k;
2191b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return (char *)(r+1);
2192b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
2193b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2194b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonstatic char *
2195b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonnrv_alloc(char *s, char **rve, int n)
2196b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
2197b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    char *rv, *t;
2198b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2199b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    rv = rv_alloc(n);
2200b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (rv == NULL)
2201b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return NULL;
2202b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    t = rv;
2203b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    while((*t = *s++)) t++;
2204b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (rve)
2205b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *rve = t;
2206b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return rv;
2207b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
2208b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2209b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* freedtoa(s) must be used to free values s returned by dtoa
2210b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * when MULTIPLE_THREADS is #defined.  It should be used in all cases,
2211b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * but for consistency with earlier versions of dtoa, it is optional
2212b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * when MULTIPLE_THREADS is not defined.
2213b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson */
2214b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2215b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonvoid
2216b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson_Py_dg_freedtoa(char *s)
2217b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
2218b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bigint *b = (Bigint *)((int *)s - 1);
2219b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    b->maxwds = 1 << (b->k = *(int*)b);
2220b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bfree(b);
2221b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
2222b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2223b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
2224b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
2225b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * Inspired by "How to Print Floating-Point Numbers Accurately" by
2226b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
2227b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *
2228b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson * Modifications:
2229b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *      1. Rather than iterating, we use a simple numeric overestimate
2230b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         to determine k = floor(log10(d)).  We scale relevant
2231b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         quantities using O(log2(k)) rather than O(k) multiplications.
2232b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *      2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
2233b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         try to generate digits strictly left to right.  Instead, we
2234b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         compute with fewer bits and propagate the carry if necessary
2235b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         when rounding the final digit up.  This is often faster.
2236b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *      3. Under the assumption that input will be rounded nearest,
2237b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
2238b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         That is, we allow equality in stopping tests when the
2239b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         round-nearest rule will give the same floating-point value
2240b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         as would satisfaction of the stopping test with strict
2241b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         inequality.
2242b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *      4. We remove common factors of powers of 2 from relevant
2243b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         quantities.
2244b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *      5. When converting floating-point integers less than 1e16,
2245b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         we use floating-point arithmetic rather than resorting
2246b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         to multiple-precision integers.
2247b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *      6. When asked to produce fewer than 15 digits, we first try
2248b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         to get by with floating-point arithmetic; we resort to
2249b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         multiple-precision integer arithmetic only if we cannot
2250b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         guarantee that the floating-point calculation has given
2251b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         the correctly rounded result.  For k requested digits and
2252b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         "uniformly" distributed input, the probability is
2253b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         something like 10^(k-15) that we must resort to the Long
2254b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson *         calculation.
2255b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson */
2256b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2257b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* Additional notes (METD): (1) returns NULL on failure.  (2) to avoid memory
2258b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   leakage, a successful call to _Py_dg_dtoa should always be matched by a
2259b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   call to _Py_dg_freedtoa. */
2260b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2261b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinsonchar *
2262b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson_Py_dg_dtoa(double dd, int mode, int ndigits,
2263b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            int *decpt, int *sign, char **rve)
2264b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson{
2265b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /*  Arguments ndigits, decpt, sign are similar to those
2266b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        of ecvt and fcvt; trailing zeros are suppressed from
2267b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        the returned string.  If not null, *rve is set to point
2268b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        to the end of the return value.  If d is +-Infinity or NaN,
2269b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        then *decpt is set to 9999.
2270b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2271b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        mode:
2272b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        0 ==> shortest string that yields d when read in
2273b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        and rounded to nearest.
2274b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        1 ==> like 0, but with Steele & White stopping rule;
2275b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        e.g. with IEEE P754 arithmetic , mode 0 gives
2276b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        1e23 whereas mode 1 gives 9.999999999999999e22.
2277b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        2 ==> max(1,ndigits) significant digits.  This gives a
2278b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return value similar to that of ecvt, except
2279b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        that trailing zeros are suppressed.
2280b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        3 ==> through ndigits past the decimal point.  This
2281b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        gives a return value similar to that from fcvt,
2282b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        except that trailing zeros are suppressed, and
2283b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        ndigits can be negative.
2284b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        4,5 ==> similar to 2 and 3, respectively, but (in
2285b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        round-nearest mode) with the tests of mode 0 to
2286b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        possibly return a shorter string that rounds to d.
2287b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        With IEEE arithmetic and compilation with
2288b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
2289b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        as modes 2 and 3 when FLT_ROUNDS != 1.
2290b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        6-9 ==> Debugging modes similar to mode - 4:  don't try
2291b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        fast floating-point estimate (if applicable).
2292b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2293b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Values of mode other than 0-9 are treated as mode 0.
2294b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2295b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Sufficient space is allocated to the return value
2296b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        to hold the suppressed trailing zeros.
2297b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    */
2298b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2299b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
2300b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
2301b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        spec_case, try_quick;
2302b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Long L;
2303b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    int denorm;
2304b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ULong x;
2305b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bigint *b, *b1, *delta, *mlo, *mhi, *S;
2306b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    U d2, eps, u;
2307b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    double ds;
2308b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    char *s, *s0;
2309b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2310b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /* set pointers to NULL, to silence gcc compiler warnings and make
2311b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson       cleanup easier on error */
2312b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    mlo = mhi = b = S = 0;
2313b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    s0 = 0;
2314b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2315b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    u.d = dd;
2316b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (word0(&u) & Sign_bit) {
2317b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /* set sign for everything, including 0's and NaNs */
2318b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *sign = 1;
2319b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word0(&u) &= ~Sign_bit; /* clear sign bit */
2320b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2321b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else
2322b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *sign = 0;
2323b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2324b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /* quick return for Infinities, NaNs and zeros */
2325b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if ((word0(&u) & Exp_mask) == Exp_mask)
2326b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    {
2327b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /* Infinity or NaN */
2328b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *decpt = 9999;
2329b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (!word1(&u) && !(word0(&u) & 0xfffff))
2330b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            return nrv_alloc("Infinity", rve, 8);
2331b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return nrv_alloc("NaN", rve, 3);
2332b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2333b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (!dval(&u)) {
2334b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *decpt = 1;
2335b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        return nrv_alloc("0", rve, 1);
2336b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2337b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2338b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /* compute k = floor(log10(d)).  The computation may leave k
2339b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson       one too large, but should never leave k too small. */
2340b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    b = d2b(&u, &be, &bbits);
2341b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (b == NULL)
2342b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        goto failed_malloc;
2343b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {
2344b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        dval(&d2) = dval(&u);
2345b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word0(&d2) &= Frac_mask1;
2346b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word0(&d2) |= Exp_11;
2347b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2348b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /* log(x)       ~=~ log(1.5) + (x-1.5)/1.5
2349b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * log10(x)      =  log(x) / log(10)
2350b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         *              ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
2351b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
2352b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         *
2353b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * This suggests computing an approximation k to log10(d) by
2354b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         *
2355b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * k = (i - Bias)*0.301029995663981
2356b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         *      + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
2357b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         *
2358b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * We want k to be too large rather than too small.
2359b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * The error in the first-order Taylor series approximation
2360b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * is in our favor, so we just round up the constant enough
2361b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * to compensate for any error in the multiplication of
2362b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
2363b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
2364b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * adding 1e-13 to the constant term more than suffices.
2365b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * Hence we adjust the constant term to 0.1760912590558.
2366b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * (We could get a more accurate k by invoking log10,
2367b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         *  but this is probably not worthwhile.)
2368b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         */
2369b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2370b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i -= Bias;
2371b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        denorm = 0;
2372b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2373b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else {
2374b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /* d is denormalized */
2375b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2376b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i = bbits + be + (Bias + (P-1) - 1);
2377b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        x = i > 32  ? word0(&u) << (64 - i) | word1(&u) >> (i - 32)
2378b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            : word1(&u) << (32 - i);
2379b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        dval(&d2) = x;
2380b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
2381b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i -= (Bias + (P-1) - 1) + 1;
2382b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        denorm = 1;
2383b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2384b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 +
2385b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i*0.301029995663981;
2386b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    k = (int)ds;
2387b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (ds < 0. && ds != k)
2388b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k--;    /* want k = floor(ds) */
2389b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    k_check = 1;
2390b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (k >= 0 && k <= Ten_pmax) {
2391b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (dval(&u) < tens[k])
2392b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            k--;
2393b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k_check = 0;
2394b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2395b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    j = bbits - i - 1;
2396b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (j >= 0) {
2397b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b2 = 0;
2398b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        s2 = j;
2399b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2400b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else {
2401b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b2 = -j;
2402b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        s2 = 0;
2403b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2404b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (k >= 0) {
2405b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b5 = 0;
2406b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        s5 = k;
2407b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        s2 += k;
2408b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2409b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else {
2410b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b2 -= k;
2411b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b5 = -k;
2412b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        s5 = 0;
2413b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2414b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (mode < 0 || mode > 9)
2415b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        mode = 0;
2416b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2417b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    try_quick = 1;
2418b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2419b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (mode > 5) {
2420b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        mode -= 4;
2421b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        try_quick = 0;
2422b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2423b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    leftright = 1;
2424b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    ilim = ilim1 = -1;  /* Values for cases 0 and 1; done here to */
2425b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /* silence erroneous "gcc -Wall" warning. */
2426b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    switch(mode) {
2427b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    case 0:
2428b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    case 1:
2429b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i = 18;
2430b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        ndigits = 0;
2431b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        break;
2432b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    case 2:
2433b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        leftright = 0;
2434b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /* no break */
2435b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    case 4:
2436b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (ndigits <= 0)
2437b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            ndigits = 1;
2438b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        ilim = ilim1 = i = ndigits;
2439b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        break;
2440b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    case 3:
2441b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        leftright = 0;
2442b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /* no break */
2443b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    case 5:
2444b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i = ndigits + k + 1;
2445b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        ilim = i;
2446b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        ilim1 = i - 1;
2447b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (i <= 0)
2448b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            i = 1;
2449b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2450b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    s0 = rv_alloc(i);
2451b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (s0 == NULL)
2452b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        goto failed_malloc;
2453b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    s = s0;
2454b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2455b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2456b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (ilim >= 0 && ilim <= Quick_max && try_quick) {
2457b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2458b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /* Try to get by with floating-point arithmetic. */
2459b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2460b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i = 0;
2461b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        dval(&d2) = dval(&u);
2462b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k0 = k;
2463b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        ilim0 = ilim;
2464b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        ieps = 2; /* conservative */
2465b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (k > 0) {
2466b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            ds = tens[k&0xf];
2467b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            j = k >> 4;
2468b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (j & Bletch) {
2469b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                /* prevent overflows */
2470b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                j &= Bletch - 1;
2471b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                dval(&u) /= bigtens[n_bigtens-1];
2472b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                ieps++;
2473b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2474b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            for(; j; j >>= 1, i++)
2475b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (j & 1) {
2476b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    ieps++;
2477b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    ds *= bigtens[i];
2478b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
2479b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&u) /= ds;
2480b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2481b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else if ((j1 = -k)) {
2482b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&u) *= tens[j1 & 0xf];
2483b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            for(j = j1 >> 4; j; j >>= 1, i++)
2484b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (j & 1) {
2485b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    ieps++;
2486b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    dval(&u) *= bigtens[i];
2487b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
2488b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2489b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (k_check && dval(&u) < 1. && ilim > 0) {
2490b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (ilim1 <= 0)
2491b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto fast_failed;
2492b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            ilim = ilim1;
2493b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            k--;
2494b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&u) *= 10.;
2495b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            ieps++;
2496b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2497b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        dval(&eps) = ieps*dval(&u) + 7.;
2498b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        word0(&eps) -= (P-1)*Exp_msk1;
2499b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (ilim == 0) {
2500b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            S = mhi = 0;
2501b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&u) -= 5.;
2502b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (dval(&u) > dval(&eps))
2503b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto one_digit;
2504b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (dval(&u) < -dval(&eps))
2505b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto no_digits;
2506b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto fast_failed;
2507b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2508b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (leftright) {
2509b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            /* Use Steele & White method of only
2510b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson             * generating digits needed.
2511b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson             */
2512b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
2513b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            for(i = 0;;) {
2514b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                L = (Long)dval(&u);
2515b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                dval(&u) -= L;
2516b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                *s++ = '0' + (int)L;
2517b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (dval(&u) < dval(&eps))
2518b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto ret1;
2519b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (1. - dval(&u) < dval(&eps))
2520b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto bump_up;
2521b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (++i >= ilim)
2522b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    break;
2523b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                dval(&eps) *= 10.;
2524b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                dval(&u) *= 10.;
2525b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2526b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2527b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else {
2528b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            /* Generate ilim digits, then fix them up. */
2529b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&eps) *= tens[ilim-1];
2530b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            for(i = 1;; i++, dval(&u) *= 10.) {
2531b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                L = (Long)(dval(&u));
2532b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (!(dval(&u) -= L))
2533b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    ilim = i;
2534b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                *s++ = '0' + (int)L;
2535b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (i == ilim) {
2536b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    if (dval(&u) > 0.5 + dval(&eps))
2537b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        goto bump_up;
2538b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    else if (dval(&u) < 0.5 - dval(&eps)) {
2539b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        while(*--s == '0');
2540b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        s++;
2541b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        goto ret1;
2542b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    }
2543b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    break;
2544b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
2545b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2546b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2547b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson      fast_failed:
2548b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        s = s0;
2549b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        dval(&u) = dval(&d2);
2550b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k = k0;
2551b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        ilim = ilim0;
2552b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2553b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2554b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /* Do we have a "small" integer? */
2555b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2556b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (be >= 0 && k <= Int_max) {
2557b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /* Yes. */
2558b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        ds = tens[k];
2559b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (ndigits < 0 && ilim <= 0) {
2560b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            S = mhi = 0;
2561b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (ilim < 0 || dval(&u) <= 5*ds)
2562b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto no_digits;
2563b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto one_digit;
2564b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2565b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        for(i = 1;; i++, dval(&u) *= 10.) {
2566b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            L = (Long)(dval(&u) / ds);
2567b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dval(&u) -= L*ds;
2568b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            *s++ = '0' + (int)L;
2569b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (!dval(&u)) {
2570b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                break;
2571b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2572b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (i == ilim) {
2573b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                dval(&u) += dval(&u);
2574b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (dval(&u) > ds || (dval(&u) == ds && L & 1)) {
2575b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                  bump_up:
2576b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    while(*--s == '9')
2577b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        if (s == s0) {
2578b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                            k++;
2579b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                            *s = '0';
2580b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                            break;
2581b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        }
2582b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    ++*s++;
2583b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
2584b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                break;
2585b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2586b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2587b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        goto ret1;
2588b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2589b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2590b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    m2 = b2;
2591b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    m5 = b5;
2592b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (leftright) {
2593b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i =
2594b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            denorm ? be + (Bias + (P-1) - 1 + 1) :
2595b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            1 + P - bbits;
2596b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b2 += i;
2597b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        s2 += i;
2598b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        mhi = i2b(1);
2599b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (mhi == NULL)
2600b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto failed_malloc;
2601b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2602b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (m2 > 0 && s2 > 0) {
2603b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i = m2 < s2 ? m2 : s2;
2604b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b2 -= i;
2605b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        m2 -= i;
2606b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        s2 -= i;
2607b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2608b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (b5 > 0) {
2609b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (leftright) {
2610b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (m5 > 0) {
2611b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                mhi = pow5mult(mhi, m5);
2612b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (mhi == NULL)
2613b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto failed_malloc;
2614b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                b1 = mult(mhi, b);
2615b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                Bfree(b);
2616b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                b = b1;
2617b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (b == NULL)
2618b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto failed_malloc;
2619b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2620b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if ((j = b5 - m5)) {
2621b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                b = pow5mult(b, j);
2622b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (b == NULL)
2623b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto failed_malloc;
2624b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2625b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2626b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else {
2627b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            b = pow5mult(b, b5);
2628b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (b == NULL)
2629b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
2630b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2631b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2632b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    S = i2b(1);
2633b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (S == NULL)
2634b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        goto failed_malloc;
2635b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (s5 > 0) {
2636b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        S = pow5mult(S, s5);
2637b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (S == NULL)
2638b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto failed_malloc;
2639b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2640b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2641b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /* Check for special case that d is a normalized power of 2. */
2642b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2643b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    spec_case = 0;
2644b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if ((mode < 2 || leftright)
2645b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        ) {
2646b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (!word1(&u) && !(word0(&u) & Bndry_mask)
2647b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            && word0(&u) & (Exp_mask & ~Exp_msk1)
2648b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            ) {
2649b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            /* The special case */
2650b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            b2 += Log2P;
2651b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            s2 += Log2P;
2652b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            spec_case = 1;
2653b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2654b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2655b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2656b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /* Arrange for convenient computation of quotients:
2657b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     * shift left if necessary so divisor has 4 leading 0 bits.
2658b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     *
2659b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     * Perhaps we should just compute leading 28 bits of S once
2660b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     * and for all and pass them and a shift to quorem, so it
2661b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     * can do shifts and ors to compute the numerator for q.
2662b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson     */
2663b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f))
2664b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        i = 32 - i;
2665b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define iInc 28
2666b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    i = dshift(S, s2);
2667b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    b2 += i;
2668b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    m2 += i;
2669b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    s2 += i;
2670b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (b2 > 0) {
2671b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        b = lshift(b, b2);
2672b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (b == NULL)
2673b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto failed_malloc;
2674b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2675b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (s2 > 0) {
2676b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        S = lshift(S, s2);
2677b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (S == NULL)
2678b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto failed_malloc;
2679b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2680b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (k_check) {
2681b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (cmp(b,S) < 0) {
2682b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            k--;
2683b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            b = multadd(b, 10, 0);      /* we botched the k estimate */
2684b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (b == NULL)
2685b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
2686b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (leftright) {
2687b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                mhi = multadd(mhi, 10, 0);
2688b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (mhi == NULL)
2689b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto failed_malloc;
2690b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2691b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            ilim = ilim1;
2692b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2693b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2694b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (ilim <= 0 && (mode == 3 || mode == 5)) {
2695b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (ilim < 0) {
2696b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            /* no digits, fcvt style */
2697b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson          no_digits:
2698b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            k = -1 - ndigits;
2699b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            goto ret;
2700b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2701b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        else {
2702b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            S = multadd(S, 5, 0);
2703b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (S == NULL)
2704b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
2705b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (cmp(b, S) <= 0)
2706b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto no_digits;
2707b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2708b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson      one_digit:
2709b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *s++ = '1';
2710b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        k++;
2711b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        goto ret;
2712b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2713b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (leftright) {
2714b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (m2 > 0) {
2715b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            mhi = lshift(mhi, m2);
2716b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (mhi == NULL)
2717b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
2718b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2719b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2720b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        /* Compute mlo -- check for special case
2721b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         * that d is a normalized power of 2.
2722b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson         */
2723b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2724b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        mlo = mhi;
2725b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (spec_case) {
2726b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            mhi = Balloc(mhi->k);
2727b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (mhi == NULL)
2728b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
2729b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bcopy(mhi, mlo);
2730b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            mhi = lshift(mhi, Log2P);
2731b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (mhi == NULL)
2732b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
2733b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2734b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2735b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        for(i = 1;;i++) {
2736b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            dig = quorem(b,S) + '0';
2737b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            /* Do we yet have the shortest decimal string
2738b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson             * that will round to d?
2739b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson             */
2740b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            j = cmp(b, mlo);
2741b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            delta = diff(S, mhi);
2742b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (delta == NULL)
2743b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
2744b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            j1 = delta->sign ? 1 : cmp(b, delta);
2745b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(delta);
2746b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (j1 == 0 && mode != 1 && !(word1(&u) & 1)
2747b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                ) {
2748b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (dig == '9')
2749b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto round_9_up;
2750b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (j > 0)
2751b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    dig++;
2752b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                *s++ = dig;
2753b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto ret;
2754b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2755b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (j < 0 || (j == 0 && mode != 1
2756b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                          && !(word1(&u) & 1)
2757b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    )) {
2758b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (!b->x[0] && b->wds <= 1) {
2759b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto accept_dig;
2760b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
2761b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (j1 > 0) {
2762b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    b = lshift(b, 1);
2763b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    if (b == NULL)
2764b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        goto failed_malloc;
2765b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    j1 = cmp(b, S);
2766b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    if ((j1 > 0 || (j1 == 0 && dig & 1))
2767b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        && dig++ == '9')
2768b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                        goto round_9_up;
2769b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
2770b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson              accept_dig:
2771b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                *s++ = dig;
2772b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto ret;
2773b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2774b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (j1 > 0) {
2775b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (dig == '9') { /* possible if i == 1 */
2776b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                  round_9_up:
2777b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    *s++ = '9';
2778b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto roundoff;
2779b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                }
2780b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                *s++ = dig + 1;
2781b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto ret;
2782b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2783b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            *s++ = dig;
2784b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (i == ilim)
2785b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                break;
2786b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            b = multadd(b, 10, 0);
2787b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (b == NULL)
2788b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
2789b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (mlo == mhi) {
2790b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                mlo = mhi = multadd(mhi, 10, 0);
2791b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (mlo == NULL)
2792b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto failed_malloc;
2793b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2794b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            else {
2795b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                mlo = multadd(mlo, 10, 0);
2796b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (mlo == NULL)
2797b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto failed_malloc;
2798b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                mhi = multadd(mhi, 10, 0);
2799b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                if (mhi == NULL)
2800b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                    goto failed_malloc;
2801b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2802b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2803b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2804b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else
2805b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        for(i = 1;; i++) {
2806b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            *s++ = dig = quorem(b,S) + '0';
2807b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (!b->x[0] && b->wds <= 1) {
2808b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto ret;
2809b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2810b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (i >= ilim)
2811b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                break;
2812b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            b = multadd(b, 10, 0);
2813b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (b == NULL)
2814b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto failed_malloc;
2815b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        }
2816b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2817b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    /* Round off last digit */
2818b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2819b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    b = lshift(b, 1);
2820b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (b == NULL)
2821b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        goto failed_malloc;
2822b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    j = cmp(b, S);
2823b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (j > 0 || (j == 0 && dig & 1)) {
2824b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson      roundoff:
2825b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        while(*--s == '9')
2826b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            if (s == s0) {
2827b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                k++;
2828b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                *s++ = '1';
2829b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson                goto ret;
2830b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            }
2831b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        ++*s++;
2832b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2833b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    else {
2834b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        while(*--s == '0');
2835b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        s++;
2836b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2837b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson  ret:
2838b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bfree(S);
2839b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (mhi) {
2840b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        if (mlo && mlo != mhi)
2841b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson            Bfree(mlo);
2842b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bfree(mhi);
2843b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    }
2844b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson  ret1:
2845b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    Bfree(b);
2846b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    *s = 0;
2847b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    *decpt = k + 1;
2848b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (rve)
2849b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        *rve = s;
2850b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return s0;
2851b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson  failed_malloc:
2852b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (S)
2853b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bfree(S);
2854b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (mlo && mlo != mhi)
2855b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bfree(mlo);
2856b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (mhi)
2857b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bfree(mhi);
2858b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (b)
2859b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        Bfree(b);
2860b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    if (s0)
2861b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson        _Py_dg_freedtoa(s0);
2862b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    return NULL;
2863b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
2864b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#ifdef __cplusplus
2865b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson}
2866b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
2867b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
2868b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif  /* PY_NO_SHORT_FLOAT_REPR */
2869