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