dtoa.c revision 19428060139151e3047283f132e8baf16436745e
1bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/****************************************************************
2bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
3bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * The author of this software is David M. Gay.
4bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
5bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
6bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
7bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * Permission to use, copy, modify, and distribute this software for any
8bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * purpose without fee is hereby granted, provided that this entire notice
9bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * is included in all copies of any software which is or includes a copy
10bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * or modification of this software and in all copies of the supporting
11bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * documentation for such software.
12bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
13bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
14bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
15bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
16bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
17bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
18bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson ***************************************************************/
19bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
20bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/****************************************************************
21bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * This is dtoa.c by David M. Gay, downloaded from
22bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * http://www.netlib.org/fp/dtoa.c on April 15, 2009 and modified for
23bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * inclusion into the Python core by Mark E. T. Dickinson and Eric V. Smith.
24bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
25bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * Please remember to check http://www.netlib.org/fp regularly (and especially
26bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * before any Python release) for bugfixes and updates.
27bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
28bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * The major modifications from Gay's original code are as follows:
29bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
30bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *  0. The original code has been specialized to Python's needs by removing
31bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     many of the #ifdef'd sections.  In particular, code to support VAX and
32bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     IBM floating-point formats, hex NaNs, hex floats, locale-aware
33bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     treatment of the decimal point, and setting of the inexact flag have
34bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     been removed.
35bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
36bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *  1. We use PyMem_Malloc and PyMem_Free in place of malloc and free.
37bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
38bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *  2. The public functions strtod, dtoa and freedtoa all now have
39bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     a _Py_dg_ prefix.
40bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
41bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *  3. Instead of assuming that PyMem_Malloc always succeeds, we thread
42bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     PyMem_Malloc failures through the code.  The functions
43bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
44bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *       Balloc, multadd, s2b, i2b, mult, pow5mult, lshift, diff, d2b
45bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
46bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     of return type *Bigint all return NULL to indicate a malloc failure.
47bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     Similarly, rv_alloc and nrv_alloc (return type char *) return NULL on
48bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     failure.  bigcomp now has return type int (it used to be void) and
49bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     returns -1 on failure and 0 otherwise.  _Py_dg_dtoa returns NULL
50bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     on failure.  _Py_dg_strtod indicates failure due to malloc failure
51bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     by returning -1.0, setting errno=ENOMEM and *se to s00.
52bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
53bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *  4. The static variable dtoa_result has been removed.  Callers of
54bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     _Py_dg_dtoa are expected to call _Py_dg_freedtoa to free
55bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     the memory allocated by _Py_dg_dtoa.
56bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
57bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *  5. The code has been reformatted to better fit with Python's
58bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     C style guide (PEP 7).
59bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
60bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *  6. A bug in the memory allocation has been fixed: to avoid FREEing memory
61bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     that hasn't been MALLOC'ed, private_mem should only be used when k <=
62bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     Kmax.
63bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
64bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *  7. _Py_dg_strtod has been modified so that it doesn't accept strings with
65bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *     leading whitespace.
66bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
67bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson ***************************************************************/
68bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
69bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Please send bug reports for the original dtoa.c code to David M. Gay (dmg
70bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * at acm dot org, with " at " changed at "@" and " dot " changed to ".").
71bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * Please report bugs for this modified version using the Python issue tracker
72bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * (http://bugs.python.org). */
73bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
74bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* On a machine with IEEE extended-precision registers, it is
75bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * necessary to specify double-precision (53-bit) rounding precision
76bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * before invoking strtod or dtoa.  If the machine uses (the equivalent
77bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * of) Intel 80x87 arithmetic, the call
78bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      _control87(PC_53, MCW_PC);
79bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * does this with many compilers.  Whether this or another call is
80bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * appropriate depends on the compiler; for this to work, it may be
81bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * necessary to #include "float.h" or another system-dependent header
82bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * file.
83bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson */
84bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
85bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
86bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
87bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * This strtod returns a nearest machine number to the input decimal
88bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * string (or sets errno to ERANGE).  With IEEE arithmetic, ties are
89bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * broken by the IEEE round-even rule.  Otherwise ties are broken by
90bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * biased rounding (add half and chop).
91bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
92bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * Inspired loosely by William D. Clinger's paper "How to Read Floating
93bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
94bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
95bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * Modifications:
96bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
97bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      1. We only require IEEE, IBM, or VAX double-precision
98bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *              arithmetic (not IEEE double-extended).
99bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      2. We get by with floating-point arithmetic in a case that
100bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *              Clinger missed -- when we're computing d * 10^n
101bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *              for a small integer d and the integer n is not too
102bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *              much larger than 22 (the maximum integer k for which
103bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *              we can represent 10^k exactly), we may be able to
104bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *              compute (d*10^k) * 10^(e-k) with just one roundoff.
105bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      3. Rather than a bit-at-a-time adjustment of the binary
106bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *              result in the hard case, we use floating-point
107bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *              arithmetic to determine the adjustment to within
108bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *              one bit; only in really hard cases do we need to
109bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *              compute a second residual.
110bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      4. Because of 3., we don't need a large table of powers of 10
111bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *              for ten-to-e (just some small tables, e.g. of 10^k
112bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *              for 0 <= k <= 22).
113bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson */
114bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
115bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Linking of Python's #defines to Gay's #defines starts here. */
116bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
117bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#include "Python.h"
118bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
119bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* if PY_NO_SHORT_FLOAT_REPR is defined, then don't even try to compile
120bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   the following code */
121bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifndef PY_NO_SHORT_FLOAT_REPR
122bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
123bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#include "float.h"
124bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
125bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define MALLOC PyMem_Malloc
126bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define FREE PyMem_Free
127bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
128bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* This code should also work for ARM mixed-endian format on little-endian
129bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   machines, where doubles have byte order 45670123 (in increasing address
130bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   order, 0 being the least significant byte). */
131bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef DOUBLE_IS_LITTLE_ENDIAN_IEEE754
132bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#  define IEEE_8087
133bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
134bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#if defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) ||  \
135bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson  defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754)
136bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#  define IEEE_MC68k
137bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
138bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#if defined(IEEE_8087) + defined(IEEE_MC68k) != 1
139bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#error "Exactly one of IEEE_8087 or IEEE_MC68k should be defined."
140bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
141bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
142bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* The code below assumes that the endianness of integers matches the
143bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   endianness of the two 32-bit words of a double.  Check this. */
144bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#if defined(WORDS_BIGENDIAN) && (defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) || \
145bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                                 defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754))
146bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#error "doubles and ints have incompatible endianness"
147bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
148bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
149bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#if !defined(WORDS_BIGENDIAN) && defined(DOUBLE_IS_BIG_ENDIAN_IEEE754)
150bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#error "doubles and ints have incompatible endianness"
151bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
152bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
153bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
154bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#if defined(HAVE_UINT32_T) && defined(HAVE_INT32_T)
155bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsontypedef PY_UINT32_T ULong;
156bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsontypedef PY_INT32_T Long;
157bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
158bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#error "Failed to find an exact-width 32-bit integer type"
159bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
160bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
161bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#if defined(HAVE_UINT64_T)
162bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define ULLong PY_UINT64_T
163bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
164bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#undef ULLong
165bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
166bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
167bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#undef DEBUG
168bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef Py_DEBUG
169bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define DEBUG
170bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
171bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
172bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* End Python #define linking */
173bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
174bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef DEBUG
175bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
176bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
177bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
178bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifndef PRIVATE_MEM
179bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define PRIVATE_MEM 2304
180bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
181bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
182bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic double private_mem[PRIVATE_mem], *pmem_next = private_mem;
183bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
184bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef __cplusplus
185bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonextern "C" {
186bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
187bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
188bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsontypedef union { double d; ULong L[2]; } U;
189bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
190bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef IEEE_8087
191bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define word0(x) (x)->L[1]
192bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define word1(x) (x)->L[0]
193bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
194bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define word0(x) (x)->L[0]
195bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define word1(x) (x)->L[1]
196bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
197bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define dval(x) (x)->d
198bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
199bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifndef STRTOD_DIGLIM
200bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define STRTOD_DIGLIM 40
201bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
202bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2030ca7452794bef03b66f56cc996a73cac066d0ec1Mark Dickinson/* maximum permitted exponent value for strtod; exponents larger than
2040ca7452794bef03b66f56cc996a73cac066d0ec1Mark Dickinson   MAX_ABS_EXP in absolute value get truncated to +-MAX_ABS_EXP.  MAX_ABS_EXP
2050ca7452794bef03b66f56cc996a73cac066d0ec1Mark Dickinson   should fit into an int. */
2060ca7452794bef03b66f56cc996a73cac066d0ec1Mark Dickinson#ifndef MAX_ABS_EXP
2070ca7452794bef03b66f56cc996a73cac066d0ec1Mark Dickinson#define MAX_ABS_EXP 19999U
2080ca7452794bef03b66f56cc996a73cac066d0ec1Mark Dickinson#endif
2090ca7452794bef03b66f56cc996a73cac066d0ec1Mark Dickinson
210bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* The following definition of Storeinc is appropriate for MIPS processors.
211bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * An alternative that might be better on some machines is
212bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
213bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson */
214bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#if defined(IEEE_8087)
215bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b,  \
216bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                         ((unsigned short *)a)[0] = (unsigned short)c, a++)
217bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
218bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b,  \
219bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                         ((unsigned short *)a)[1] = (unsigned short)c, a++)
220bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
221bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
222bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* #define P DBL_MANT_DIG */
223bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Ten_pmax = floor(P*log(2)/log(5)) */
224bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
225bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
226bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
227bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
228bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_shift  20
229bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_shift1 20
230bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_msk1    0x100000
231bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_msk11   0x100000
232bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_mask  0x7ff00000
233bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define P 53
234bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Nbits 53
235bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Bias 1023
236bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Emax 1023
237bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Emin (-1022)
238bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_1  0x3ff00000
239bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_11 0x3ff00000
240bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Ebits 11
241bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Frac_mask  0xfffff
242bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Frac_mask1 0xfffff
243bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Ten_pmax 22
244bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Bletch 0x10
245bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Bndry_mask  0xfffff
246bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Bndry_mask1 0xfffff
247bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define LSB 1
248bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Sign_bit 0x80000000
249bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Log2P 1
250bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Tiny0 0
251bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Tiny1 1
252bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Quick_max 14
253bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Int_max 14
254bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
255bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifndef Flt_Rounds
256bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef FLT_ROUNDS
257bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Flt_Rounds FLT_ROUNDS
258bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
259bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Flt_Rounds 1
260bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
261bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif /*Flt_Rounds*/
262bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
263bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Rounding Flt_Rounds
264bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
265bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
266bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Big1 0xffffffff
267bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
268bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* struct BCinfo is used to pass information from _Py_dg_strtod to bigcomp */
269bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
270bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsontypedef struct BCinfo BCinfo;
271bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstruct
272bb28285ea2f01e97a26bc595d49da43fbee62913Mark DickinsonBCinfo {
2734141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    int e0, nd, nd0, scale;
274bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson};
275bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
276bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define FFFFFFFF 0xffffffffUL
277bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
278bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Kmax 7
279bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
280bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* struct Bigint is used to represent arbitrary-precision integers.  These
281bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   integers are stored in sign-magnitude format, with the magnitude stored as
282bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   an array of base 2**32 digits.  Bigints are always normalized: if x is a
283bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   Bigint then x->wds >= 1, and either x->wds == 1 or x[wds-1] is nonzero.
284bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
285bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   The Bigint fields are as follows:
286bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
287bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     - next is a header used by Balloc and Bfree to keep track of lists
288bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         of freed Bigints;  it's also used for the linked list of
289bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         powers of 5 of the form 5**2**i used by pow5mult.
290bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     - k indicates which pool this Bigint was allocated from
291bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     - maxwds is the maximum number of words space was allocated for
292bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       (usually maxwds == 2**k)
293bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     - sign is 1 for negative Bigints, 0 for positive.  The sign is unused
294bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       (ignored on inputs, set to 0 on outputs) in almost all operations
295bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       involving Bigints: a notable exception is the diff function, which
296bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       ignores signs on inputs but sets the sign of the output correctly.
297bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     - wds is the actual number of significant words
298bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     - x contains the vector of words (digits) for this Bigint, from least
299bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       significant (x[0]) to most significant (x[wds-1]).
300bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson*/
301bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
302bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstruct
303bb28285ea2f01e97a26bc595d49da43fbee62913Mark DickinsonBigint {
304bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    struct Bigint *next;
305bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int k, maxwds, sign, wds;
306bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong x[1];
307bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson};
308bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
309bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsontypedef struct Bigint Bigint;
310bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
3119481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson#ifndef Py_USING_MEMORY_DEBUGGER
3129481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
313bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Memory management: memory is allocated from, and returned to, Kmax+1 pools
314bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   of memory, where pool k (0 <= k <= Kmax) is for Bigints b with b->maxwds ==
315bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   1 << k.  These pools are maintained as linked lists, with freelist[k]
316bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   pointing to the head of the list for pool k.
317bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
318bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   On allocation, if there's no free slot in the appropriate pool, MALLOC is
319bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   called to get more memory.  This memory is not returned to the system until
320bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   Python quits.  There's also a private memory pool that's allocated from
321bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   in preference to using MALLOC.
322bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
323bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   For Bigints with more than (1 << Kmax) digits (which implies at least 1233
324bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   decimal digits), memory is directly allocated using MALLOC, and freed using
325bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   FREE.
326bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
327bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   XXX: it would be easy to bypass this memory-management system and
328bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   translate each call to Balloc into a call to PyMem_Malloc, and each
329bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   Bfree to PyMem_Free.  Investigate whether this has any significant
330bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   performance on impact. */
331bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
332bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *freelist[Kmax+1];
333bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
334bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Allocate space for a Bigint with up to 1<<k digits */
335bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
336bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
337bb28285ea2f01e97a26bc595d49da43fbee62913Mark DickinsonBalloc(int k)
338bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
339bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int x;
340bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *rv;
341bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    unsigned int len;
342bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
343bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k <= Kmax && (rv = freelist[k]))
344bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        freelist[k] = rv->next;
345bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
346bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x = 1 << k;
347bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
348bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /sizeof(double);
349bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {
350bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            rv = (Bigint*)pmem_next;
351bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            pmem_next += len;
352bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
353bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
354bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            rv = (Bigint*)MALLOC(len*sizeof(double));
355bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (rv == NULL)
356bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                return NULL;
357bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
358bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        rv->k = k;
359bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        rv->maxwds = x;
360bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
361bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    rv->sign = rv->wds = 0;
362bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return rv;
363bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
364bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
365bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Free a Bigint allocated with Balloc */
366bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
367bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic void
368bb28285ea2f01e97a26bc595d49da43fbee62913Mark DickinsonBfree(Bigint *v)
369bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
370bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (v) {
371bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (v->k > Kmax)
372bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            FREE((void*)v);
373bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
374bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            v->next = freelist[v->k];
375bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            freelist[v->k] = v;
376bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
377bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
378bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
379bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
3809481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson#else
3819481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
3829481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson/* Alternative versions of Balloc and Bfree that use PyMem_Malloc and
3839481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson   PyMem_Free directly in place of the custom memory allocation scheme above.
3849481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson   These are provided for the benefit of memory debugging tools like
3859481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson   Valgrind. */
3869481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
3879481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson/* Allocate space for a Bigint with up to 1<<k digits */
3889481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
3899481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinsonstatic Bigint *
3909481c576cd5e820f2a23b57481366f37df3dbbf9Mark DickinsonBalloc(int k)
3919481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson{
3929481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    int x;
3939481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    Bigint *rv;
3949481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    unsigned int len;
3959481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
3969481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    x = 1 << k;
3979481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
3989481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        /sizeof(double);
3999481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
4009481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    rv = (Bigint*)MALLOC(len*sizeof(double));
4019481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    if (rv == NULL)
4029481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        return NULL;
4039481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
4049481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    rv->k = k;
4059481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    rv->maxwds = x;
4069481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    rv->sign = rv->wds = 0;
4079481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    return rv;
4089481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson}
4099481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
4109481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson/* Free a Bigint allocated with Balloc */
4119481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
4129481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinsonstatic void
4139481c576cd5e820f2a23b57481366f37df3dbbf9Mark DickinsonBfree(Bigint *v)
4149481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson{
4159481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    if (v) {
4169481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        FREE((void*)v);
4179481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    }
4189481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson}
4199481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
4209481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson#endif /* Py_USING_MEMORY_DEBUGGER */
4219481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
422bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign,   \
423bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                          y->wds*sizeof(Long) + 2*sizeof(int))
424bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
425bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Multiply a Bigint b by m and add a.  Either modifies b in place and returns
426bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   a pointer to the modified b, or Bfrees b and returns a pointer to a copy.
427bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   On failure, return NULL.  In this case, b will have been already freed. */
428bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
429bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
430bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonmultadd(Bigint *b, int m, int a)       /* multiply by m and add a */
431bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
432bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i, wds;
433bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
434bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *x;
435bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULLong carry, y;
436bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
437bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong carry, *x, y;
438bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong xi, z;
439bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
440bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b1;
441bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
442bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    wds = b->wds;
443bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    x = b->x;
444bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    i = 0;
445bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    carry = a;
446bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    do {
447bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
448bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = *x * (ULLong)m + carry;
449bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        carry = y >> 32;
450bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *x++ = (ULong)(y & FFFFFFFF);
451bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
452bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        xi = *x;
453bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = (xi & 0xffff) * m + carry;
454bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        z = (xi >> 16) * m + (y >> 16);
455bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        carry = z >> 16;
456bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *x++ = (z << 16) + (y & 0xffff);
457bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
458bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
459bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while(++i < wds);
460bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (carry) {
461bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (wds >= b->maxwds) {
462bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b1 = Balloc(b->k+1);
463bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (b1 == NULL){
464bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(b);
465bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                return NULL;
466bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
467bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bcopy(b1, b);
468bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(b);
469bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b = b1;
470bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
471bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b->x[wds++] = (ULong)carry;
472bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b->wds = wds;
473bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
474bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return b;
475bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
476bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
477bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* convert a string s containing nd decimal digits (possibly containing a
478bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   decimal separator at position nd0, which is ignored) to a Bigint.  This
479bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   function carries on where the parsing code in _Py_dg_strtod leaves off: on
480bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   entry, y9 contains the result of converting the first 9 digits.  Returns
481bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   NULL on failure. */
482bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
483bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
484d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinsons2b(const char *s, int nd0, int nd, ULong y9)
485bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
486bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b;
487bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i, k;
488bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Long x, y;
489bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
490bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    x = (nd + 8) / 9;
491bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(k = 0, y = 1; x > y; y <<= 1, k++) ;
492bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b = Balloc(k);
493bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b == NULL)
494bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
495bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b->x[0] = y9;
496bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b->wds = 1;
497bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
498d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson    if (nd <= 9)
499d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson      return b;
500d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson
501d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson    s += 9;
502d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson    for (i = 9; i < nd0; i++) {
503d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson        b = multadd(b, 10, *s++ - '0');
504d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson        if (b == NULL)
505d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson            return NULL;
506bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
507d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson    s++;
508bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(; i < nd; i++) {
509bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = multadd(b, 10, *s++ - '0');
510bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (b == NULL)
511bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return NULL;
512bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
513bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return b;
514bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
515bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
516bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* count leading 0 bits in the 32-bit integer x. */
517bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
518bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic int
519bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonhi0bits(ULong x)
520bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
521bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int k = 0;
522bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
523bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xffff0000)) {
524bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k = 16;
525bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x <<= 16;
526bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
527bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xff000000)) {
528bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 8;
529bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x <<= 8;
530bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
531bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xf0000000)) {
532bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 4;
533bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x <<= 4;
534bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
535bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xc0000000)) {
536bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 2;
537bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x <<= 2;
538bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
539bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0x80000000)) {
540bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k++;
541bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!(x & 0x40000000))
542bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return 32;
543bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
544bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return k;
545bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
546bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
547bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* count trailing 0 bits in the 32-bit integer y, and shift y right by that
548bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   number of bits. */
549bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
550bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic int
551bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonlo0bits(ULong *y)
552bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
553bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int k;
554bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong x = *y;
555bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
556bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (x & 7) {
557bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (x & 1)
558bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return 0;
559bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (x & 2) {
560bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *y = x >> 1;
561bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return 1;
562bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
563bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *y = x >> 2;
564bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return 2;
565bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
566bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k = 0;
567bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xffff)) {
568bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k = 16;
569bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x >>= 16;
570bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
571bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xff)) {
572bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 8;
573bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x >>= 8;
574bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
575bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xf)) {
576bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 4;
577bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x >>= 4;
578bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
579bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0x3)) {
580bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 2;
581bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x >>= 2;
582bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
583bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 1)) {
584bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k++;
585bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x >>= 1;
586bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!x)
587bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return 32;
588bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
589bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    *y = x;
590bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return k;
591bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
592bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
593bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* convert a small nonnegative integer to a Bigint */
594bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
595bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
596bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsoni2b(int i)
597bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
598bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b;
599bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
600bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b = Balloc(1);
601bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b == NULL)
602bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
603bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b->x[0] = i;
604bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b->wds = 1;
605bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return b;
606bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
607bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
608bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* multiply two Bigints.  Returns a new Bigint, or NULL on failure.  Ignores
609bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   the signs of a and b. */
610bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
611bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
612bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonmult(Bigint *a, Bigint *b)
613bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
614bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *c;
615bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int k, wa, wb, wc;
616bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
617bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong y;
618bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
619bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULLong carry, z;
620bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
621bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong carry, z;
622bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong z2;
623bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
624bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
625bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (a->wds < b->wds) {
626bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        c = a;
627bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        a = b;
628bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = c;
629bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
630bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k = a->k;
631bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    wa = a->wds;
632bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    wb = b->wds;
633bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    wc = wa + wb;
634bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (wc > a->maxwds)
635bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k++;
636bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    c = Balloc(k);
637bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (c == NULL)
638bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
639bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(x = c->x, xa = x + wc; x < xa; x++)
640bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *x = 0;
641bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xa = a->x;
642bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xae = xa + wa;
643bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xb = b->x;
644bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xbe = xb + wb;
645bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xc0 = c->x;
646bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
647bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(; xb < xbe; xc0++) {
648bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if ((y = *xb++)) {
649bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            x = xa;
650bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            xc = xc0;
651bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = 0;
652bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            do {
653bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                z = *x++ * (ULLong)y + *xc + carry;
654bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                carry = z >> 32;
655bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *xc++ = (ULong)(z & FFFFFFFF);
656bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
657bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            while(x < xae);
658bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *xc = (ULong)carry;
659bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
660bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
661bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
662bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(; xb < xbe; xb++, xc0++) {
663bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (y = *xb & 0xffff) {
664bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            x = xa;
665bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            xc = xc0;
666bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = 0;
667bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            do {
668bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
669bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                carry = z >> 16;
670bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
671bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                carry = z2 >> 16;
672bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Storeinc(xc, z2, z);
673bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
674bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            while(x < xae);
675bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *xc = carry;
676bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
677bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (y = *xb >> 16) {
678bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            x = xa;
679bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            xc = xc0;
680bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = 0;
681bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            z2 = *xc;
682bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            do {
683bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                z = (*x & 0xffff) * y + (*xc >> 16) + carry;
684bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                carry = z >> 16;
685bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Storeinc(xc, z, z2);
686bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
687bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                carry = z2 >> 16;
688bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
689bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            while(x < xae);
690bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *xc = z2;
691bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
692bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
693bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
694bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
695bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    c->wds = wc;
696bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return c;
697bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
698bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
6999481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson#ifndef Py_USING_MEMORY_DEBUGGER
7009481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
701bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* p5s is a linked list of powers of 5 of the form 5**(2**i), i >= 2 */
702bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
703bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *p5s;
704bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
705bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* multiply the Bigint b by 5**k.  Returns a pointer to the result, or NULL on
706bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   failure; if the returned pointer is distinct from b then the original
707bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   Bigint b will have been Bfree'd.   Ignores the sign of b. */
708bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
709bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
710bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonpow5mult(Bigint *b, int k)
711bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
712bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b1, *p5, *p51;
713bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i;
714bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    static int p05[3] = { 5, 25, 125 };
715bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
716bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((i = k & 3)) {
717bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = multadd(b, p05[i-1], 0);
718bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (b == NULL)
719bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return NULL;
720bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
721bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
722bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(k >>= 2))
723bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return b;
724bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    p5 = p5s;
725bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!p5) {
726bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* first time */
727bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        p5 = i2b(625);
728bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (p5 == NULL) {
729bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(b);
730bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return NULL;
731bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
732bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        p5s = p5;
733bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        p5->next = 0;
734bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
735bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(;;) {
736bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (k & 1) {
737bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b1 = mult(b, p5);
738bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(b);
739bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b = b1;
740bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (b == NULL)
741bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                return NULL;
742bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
743bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!(k >>= 1))
744bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            break;
745bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        p51 = p5->next;
746bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!p51) {
747bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            p51 = mult(p5,p5);
748bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (p51 == NULL) {
749bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(b);
750bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                return NULL;
751bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
752bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            p51->next = 0;
753bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            p5->next = p51;
754bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
755bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        p5 = p51;
756bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
757bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return b;
758bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
759bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
7609481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson#else
7619481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
7629481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson/* Version of pow5mult that doesn't cache powers of 5. Provided for
7639481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson   the benefit of memory debugging tools like Valgrind. */
7649481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
7659481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinsonstatic Bigint *
7669481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinsonpow5mult(Bigint *b, int k)
7679481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson{
7689481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    Bigint *b1, *p5, *p51;
7699481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    int i;
7709481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    static int p05[3] = { 5, 25, 125 };
7719481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
7729481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    if ((i = k & 3)) {
7739481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        b = multadd(b, p05[i-1], 0);
7749481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        if (b == NULL)
7759481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            return NULL;
7769481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    }
7779481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
7789481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    if (!(k >>= 2))
7799481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        return b;
7809481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    p5 = i2b(625);
7819481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    if (p5 == NULL) {
7829481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        Bfree(b);
7839481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        return NULL;
7849481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    }
7859481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
7869481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    for(;;) {
7879481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        if (k & 1) {
7889481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            b1 = mult(b, p5);
7899481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            Bfree(b);
7909481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            b = b1;
7919481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            if (b == NULL) {
7929481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson                Bfree(p5);
7939481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson                return NULL;
7949481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            }
7959481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        }
7969481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        if (!(k >>= 1))
7979481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            break;
7989481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        p51 = mult(p5, p5);
7999481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        Bfree(p5);
8009481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        p5 = p51;
8019481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        if (p5 == NULL) {
8029481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            Bfree(b);
8039481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            return NULL;
8049481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        }
8059481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    }
8069481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    Bfree(p5);
8079481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    return b;
8089481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson}
8099481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
8109481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson#endif /* Py_USING_MEMORY_DEBUGGER */
8119481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
812bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* shift a Bigint b left by k bits.  Return a pointer to the shifted result,
813bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   or NULL on failure.  If the returned pointer is distinct from b then the
814bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   original b will have been Bfree'd.   Ignores the sign of b. */
815bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
816bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
817bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonlshift(Bigint *b, int k)
818bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
819bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i, k1, n, n1;
820bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b1;
821bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *x, *x1, *xe, z;
822bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
823bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    n = k >> 5;
824bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k1 = b->k;
825bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    n1 = n + b->wds + 1;
826bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(i = b->maxwds; n1 > i; i <<= 1)
827bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k1++;
828bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b1 = Balloc(k1);
829bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b1 == NULL) {
830bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(b);
831bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
832bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
833bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    x1 = b1->x;
834bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(i = 0; i < n; i++)
835bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *x1++ = 0;
836bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    x = b->x;
837bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xe = x + b->wds;
838bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k &= 0x1f) {
839bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k1 = 32 - k;
840bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        z = 0;
841bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        do {
842bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *x1++ = *x << k | z;
843bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            z = *x++ >> k1;
844bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
845bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        while(x < xe);
846bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if ((*x1 = z))
847bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ++n1;
848bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
849bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else do
850bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             *x1++ = *x++;
851bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        while(x < xe);
852bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b1->wds = n1 - 1;
853bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(b);
854bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return b1;
855bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
856bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
857bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Do a three-way compare of a and b, returning -1 if a < b, 0 if a == b and
858bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   1 if a > b.  Ignores signs of a and b. */
859bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
860bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic int
861bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsoncmp(Bigint *a, Bigint *b)
862bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
863bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *xa, *xa0, *xb, *xb0;
864bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i, j;
865bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
866bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    i = a->wds;
867bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    j = b->wds;
868bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef DEBUG
869bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (i > 1 && !a->x[i-1])
870bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bug("cmp called with a->x[a->wds-1] == 0");
871bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (j > 1 && !b->x[j-1])
872bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bug("cmp called with b->x[b->wds-1] == 0");
873bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
874bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (i -= j)
875bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return i;
876bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xa0 = a->x;
877bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xa = xa0 + j;
878bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xb0 = b->x;
879bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xb = xb0 + j;
880bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(;;) {
881bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (*--xa != *--xb)
882bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return *xa < *xb ? -1 : 1;
883bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (xa <= xa0)
884bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            break;
885bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
886bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return 0;
887bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
888bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
889bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Take the difference of Bigints a and b, returning a new Bigint.  Returns
890bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   NULL on failure.  The signs of a and b are ignored, but the sign of the
891bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   result is set appropriately. */
892bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
893bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
894bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsondiff(Bigint *a, Bigint *b)
895bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
896bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *c;
897bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i, wa, wb;
898bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *xa, *xae, *xb, *xbe, *xc;
899bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
900bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULLong borrow, y;
901bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
902bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong borrow, y;
903bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong z;
904bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
905bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
906bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    i = cmp(a,b);
907bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!i) {
908bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        c = Balloc(0);
909bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (c == NULL)
910bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return NULL;
911bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        c->wds = 1;
912bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        c->x[0] = 0;
913bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return c;
914bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
915bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (i < 0) {
916bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        c = a;
917bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        a = b;
918bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = c;
919bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = 1;
920bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
921bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else
922bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = 0;
923bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    c = Balloc(a->k);
924bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (c == NULL)
925bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
926bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    c->sign = i;
927bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    wa = a->wds;
928bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xa = a->x;
929bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xae = xa + wa;
930bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    wb = b->wds;
931bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xb = b->x;
932bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xbe = xb + wb;
933bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xc = c->x;
934bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    borrow = 0;
935bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
936bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    do {
937bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = (ULLong)*xa++ - *xb++ - borrow;
938bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = y >> 32 & (ULong)1;
939bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *xc++ = (ULong)(y & FFFFFFFF);
940bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
941bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while(xb < xbe);
942bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while(xa < xae) {
943bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = *xa++ - borrow;
944bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = y >> 32 & (ULong)1;
945bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *xc++ = (ULong)(y & FFFFFFFF);
946bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
947bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
948bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    do {
949bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
950bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = (y & 0x10000) >> 16;
951bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
952bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = (z & 0x10000) >> 16;
953bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Storeinc(xc, z, y);
954bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
955bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while(xb < xbe);
956bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while(xa < xae) {
957bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = (*xa & 0xffff) - borrow;
958bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = (y & 0x10000) >> 16;
959bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        z = (*xa++ >> 16) - borrow;
960bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = (z & 0x10000) >> 16;
961bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Storeinc(xc, z, y);
962bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
963bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
964bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while(!*--xc)
965bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        wa--;
966bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    c->wds = wa;
967bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return c;
968bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
969bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
9704141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson/* Given a positive normal double x, return the difference between x and the
9714141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson   next double up.  Doesn't give correct results for subnormals. */
972bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
973bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic double
974bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonulp(U *x)
975bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
976bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Long L;
977bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    U u;
978bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
979bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
980bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    word0(&u) = L;
981bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    word1(&u) = 0;
982bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return dval(&u);
983bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
984bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
985bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Convert a Bigint to a double plus an exponent */
986bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
987bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic double
988bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonb2d(Bigint *a, int *e)
989bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
990bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *xa, *xa0, w, y, z;
991bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int k;
992bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    U d;
993bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
994bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xa0 = a->x;
995bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xa = xa0 + a->wds;
996bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    y = *--xa;
997bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef DEBUG
998bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!y) Bug("zero y in b2d");
999bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
1000bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k = hi0bits(y);
1001bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    *e = 32 - k;
1002bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k < Ebits) {
1003bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&d) = Exp_1 | y >> (Ebits - k);
1004bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        w = xa > xa0 ? *--xa : 0;
1005bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word1(&d) = y << ((32-Ebits) + k) | w >> (Ebits - k);
1006bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto ret_d;
1007bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1008bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    z = xa > xa0 ? *--xa : 0;
1009bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k -= Ebits) {
1010bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&d) = Exp_1 | y << k | z >> (32 - k);
1011bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = xa > xa0 ? *--xa : 0;
1012bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word1(&d) = z << k | y >> (32 - k);
1013bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1014bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
1015bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&d) = Exp_1 | y;
1016bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word1(&d) = z;
1017bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1018bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson  ret_d:
1019bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return dval(&d);
1020bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
1021bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1022bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Convert a double to a Bigint plus an exponent.  Return NULL on failure.
1023bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1024bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   Given a finite nonzero double d, return an odd Bigint b and exponent *e
1025bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   such that fabs(d) = b * 2**e.  On return, *bbits gives the number of
10262bcd17727027b6c923340209f8c6b92e34c69556Mark Dickinson   significant bits of b; that is, 2**(*bbits-1) <= b < 2**(*bbits).
1027bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1028bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   If d is zero, then b == 0, *e == -1010, *bbits = 0.
1029bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson */
1030bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1031bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1032bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
1033bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsond2b(U *d, int *e, int *bits)
1034bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
1035bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b;
1036bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int de, k;
1037bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *x, y, z;
1038bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i;
1039bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1040bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b = Balloc(1);
1041bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b == NULL)
1042bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
1043bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    x = b->x;
1044bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1045bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    z = word0(d) & Frac_mask;
1046bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    word0(d) &= 0x7fffffff;   /* clear sign bit, which we ignore */
1047bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((de = (int)(word0(d) >> Exp_shift)))
1048bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        z |= Exp_msk1;
1049bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((y = word1(d))) {
1050bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if ((k = lo0bits(&y))) {
1051bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            x[0] = y | z << (32 - k);
1052bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            z >>= k;
1053bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1054bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else
1055bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            x[0] = y;
1056bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i =
1057bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b->wds = (x[1] = z) ? 2 : 1;
1058bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1059bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
1060bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k = lo0bits(&z);
1061bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x[0] = z;
1062bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i =
1063bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b->wds = 1;
1064bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 32;
1065bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1066bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (de) {
1067bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *e = de - Bias - (P-1) + k;
1068bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *bits = P - k;
1069bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1070bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
1071bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *e = de - Bias - (P-1) + 1 + k;
1072bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *bits = 32*i - hi0bits(x[i-1]);
1073bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1074bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return b;
1075bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
1076bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1077bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Compute the ratio of two Bigints, as a double.  The result may have an
1078bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   error of up to 2.5 ulps. */
1079bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1080bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic double
1081bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonratio(Bigint *a, Bigint *b)
1082bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
1083bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    U da, db;
1084bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int k, ka, kb;
1085bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1086bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    dval(&da) = b2d(a, &ka);
1087bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    dval(&db) = b2d(b, &kb);
1088bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k = ka - kb + 32*(a->wds - b->wds);
1089bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k > 0)
1090bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&da) += k*Exp_msk1;
1091bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
1092bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k = -k;
1093bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&db) += k*Exp_msk1;
1094bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1095bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return dval(&da) / dval(&db);
1096bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
1097bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1098bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic const double
1099bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsontens[] = {
1100bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1101bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1102bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    1e20, 1e21, 1e22
1103bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson};
1104bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1105bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic const double
1106bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonbigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
1107bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
1108bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                                   9007199254740992.*9007199254740992.e-256
1109bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                                   /* = 2^106 * 1e-256 */
1110bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson};
1111bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */
1112bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* flag unnecessarily.  It leads to a song and dance at the end of strtod. */
1113bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Scale_Bit 0x10
1114bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define n_bigtens 5
1115bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1116bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define ULbits 32
1117bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define kshift 5
1118bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define kmask 31
1119bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1120bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1121bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic int
1122bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsondshift(Bigint *b, int p2)
1123bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
1124bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int rv = hi0bits(b->x[b->wds-1]) - 4;
1125bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (p2 > 0)
1126bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        rv -= p2;
1127bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return rv & kmask;
1128bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
1129bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1130bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* special case of Bigint division.  The quotient is always in the range 0 <=
1131bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   quotient < 10, and on entry the divisor S is normalized so that its top 4
1132bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   bits (28--31) are zero and bit 27 is set. */
1133bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1134bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic int
1135bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonquorem(Bigint *b, Bigint *S)
1136bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
1137bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int n;
1138bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *bx, *bxe, q, *sx, *sxe;
1139bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
1140bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULLong borrow, carry, y, ys;
1141bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
1142bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong borrow, carry, y, ys;
1143bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong si, z, zs;
1144bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
1145bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1146bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    n = S->wds;
1147bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef DEBUG
1148bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /*debug*/ if (b->wds > n)
1149bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /*debug*/       Bug("oversize b in quorem");
1150bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
1151bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b->wds < n)
1152bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return 0;
1153bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    sx = S->x;
1154bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    sxe = sx + --n;
1155bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    bx = b->x;
1156bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    bxe = bx + n;
1157bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    q = *bxe / (*sxe + 1);      /* ensure q <= true quotient */
1158bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef DEBUG
1159bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /*debug*/ if (q > 9)
1160bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /*debug*/       Bug("oversized quotient in quorem");
1161bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
1162bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (q) {
1163bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = 0;
1164bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        carry = 0;
1165bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        do {
1166bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
1167bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ys = *sx++ * (ULLong)q + carry;
1168bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = ys >> 32;
1169bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            y = *bx - (ys & FFFFFFFF) - borrow;
1170bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            borrow = y >> 32 & (ULong)1;
1171bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *bx++ = (ULong)(y & FFFFFFFF);
1172bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
1173bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            si = *sx++;
1174bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ys = (si & 0xffff) * q + carry;
1175bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            zs = (si >> 16) * q + (ys >> 16);
1176bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = zs >> 16;
1177bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
1178bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            borrow = (y & 0x10000) >> 16;
1179bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            z = (*bx >> 16) - (zs & 0xffff) - borrow;
1180bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            borrow = (z & 0x10000) >> 16;
1181bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Storeinc(bx, z, y);
1182bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
1183bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1184bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        while(sx <= sxe);
1185bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!*bxe) {
1186bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bx = b->x;
1187bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            while(--bxe > bx && !*bxe)
1188bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                --n;
1189bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b->wds = n;
1190bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1191bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1192bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (cmp(b, S) >= 0) {
1193bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        q++;
1194bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = 0;
1195bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        carry = 0;
1196bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bx = b->x;
1197bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        sx = S->x;
1198bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        do {
1199bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
1200bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ys = *sx++ + carry;
1201bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = ys >> 32;
1202bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            y = *bx - (ys & FFFFFFFF) - borrow;
1203bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            borrow = y >> 32 & (ULong)1;
1204bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *bx++ = (ULong)(y & FFFFFFFF);
1205bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
1206bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            si = *sx++;
1207bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ys = (si & 0xffff) + carry;
1208bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            zs = (si >> 16) + (ys >> 16);
1209bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = zs >> 16;
1210bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
1211bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            borrow = (y & 0x10000) >> 16;
1212bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            z = (*bx >> 16) - (zs & 0xffff) - borrow;
1213bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            borrow = (z & 0x10000) >> 16;
1214bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Storeinc(bx, z, y);
1215bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
1216bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1217bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        while(sx <= sxe);
1218bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bx = b->x;
1219bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bxe = bx + n;
1220bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!*bxe) {
1221bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            while(--bxe > bx && !*bxe)
1222bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                --n;
1223bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b->wds = n;
1224bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1225bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1226bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return q;
1227bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
1228bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
12295818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson/* sulp(x) is a version of ulp(x) that takes bc.scale into account.
12305ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson
12315818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson   Assuming that x is finite and nonnegative (positive zero is fine
12325818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson   here) and x / 2^bc.scale is exactly representable as a double,
12335818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson   sulp(x) is equivalent to 2^bc.scale * ulp(x / 2^bc.scale). */
12345ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson
12355ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinsonstatic double
12365ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinsonsulp(U *x, BCinfo *bc)
12375ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson{
12385ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson    U u;
12395ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson
124002139d74bae1a77bbe4ad528762e1620486e3e36Mark Dickinson    if (bc->scale && 2*P + 1 > (int)((word0(x) & Exp_mask) >> Exp_shift)) {
12415ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson        /* rv/2^bc->scale is subnormal */
12425ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson        word0(&u) = (P+2)*Exp_msk1;
12435ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson        word1(&u) = 0;
12445ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson        return u.d;
12455ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson    }
12465818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson    else {
12475818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson        assert(word0(x) || word1(x)); /* x != 0.0 */
12485ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson        return ulp(x);
12495818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson    }
12505ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson}
1251bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1252b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson/* The bigcomp function handles some hard cases for strtod, for inputs
1253b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   with more than STRTOD_DIGLIM digits.  It's called once an initial
1254b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   estimate for the double corresponding to the input string has
1255b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   already been obtained by the code in _Py_dg_strtod.
1256b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1257b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   The bigcomp function is only called after _Py_dg_strtod has found a
1258b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   double value rv such that either rv or rv + 1ulp represents the
1259b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   correctly rounded value corresponding to the original string.  It
1260b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   determines which of these two values is the correct one by
1261b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   computing the decimal digits of rv + 0.5ulp and comparing them with
12626e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson   the corresponding digits of s0.
1263b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1264b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   In the following, write dv for the absolute value of the number represented
1265b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   by the input string.
1266b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1267b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   Inputs:
1268b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1269b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson     s0 points to the first significant digit of the input string.
1270b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1271b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson     rv is a (possibly scaled) estimate for the closest double value to the
1272b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        value represented by the original input to _Py_dg_strtod.  If
1273b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        bc->scale is nonzero, then rv/2^(bc->scale) is the approximation to
1274b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        the input value.
1275b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1276b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson     bc is a struct containing information gathered during the parsing and
1277b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        estimation steps of _Py_dg_strtod.  Description of fields follows:
1278b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1279b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        bc->e0 gives the exponent of the input value, such that dv = (integer
1280b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson           given by the bd->nd digits of s0) * 10**e0
1281b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1282d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson        bc->nd gives the total number of significant digits of s0.  It will
1283d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson           be at least 1.
1284b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1285b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        bc->nd0 gives the number of significant digits of s0 before the
1286b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson           decimal separator.  If there's no decimal separator, bc->nd0 ==
1287b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson           bc->nd.
1288b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1289b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        bc->scale is the value used to scale rv to avoid doing arithmetic with
1290b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson           subnormal values.  It's either 0 or 2*P (=106).
1291b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1292b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   Outputs:
1293b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1294b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson     On successful exit, rv/2^(bc->scale) is the closest double to dv.
1295b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1296b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson     Returns 0 on success, -1 on failure (e.g., due to a failed malloc call). */
1297bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1298bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic int
1299bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonbigcomp(U *rv, const char *s0, BCinfo *bc)
1300bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
1301bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b, *d;
130250b60c612e7eca3f815d362190ddb80a21a6d820Mark Dickinson    int b2, bbits, d2, dd, i, nd, nd0, odd, p2, p5;
1303bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1304d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson    dd = 0; /* silence compiler warning about possibly unused variable */
1305bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    nd = bc->nd;
1306bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    nd0 = bc->nd0;
13078efef5ce9f6c0dfd2cb4720b61a37bbdfdb5e30eMark Dickinson    p5 = nd + bc->e0;
1308d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson    if (rv->d == 0.) {
1309d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson        /* special case because d2b doesn't handle 0.0 */
13106e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson        b = i2b(0);
1311bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (b == NULL)
1312bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return -1;
13136e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson        p2 = Emin - P + 1; /* = -1074 for IEEE 754 binary64 */
13146e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson        bbits = 0;
1315bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
13166e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson    else {
1317bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = d2b(rv, &p2, &bbits);
1318bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (b == NULL)
1319bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return -1;
13206e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson        p2 -= bc->scale;
1321bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
13226e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson    /* now rv/2^(bc->scale) = b * 2**p2, and b has bbits significant bits */
13236e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson
13246e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson    /* Replace (b, p2) by (b << i, p2 - i), with i the largest integer such
13256e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson       that b << i has at most P significant bits and p2 - i >= Emin - P +
13266e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson       1. */
1327bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    i = P - bbits;
1328d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson    if (i > p2 - (Emin - P + 1))
1329d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson        i = p2 - (Emin - P + 1);
13306e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson    /* increment i so that we shift b by an extra bit;  then or-ing a 1 into
13316e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson       the lsb of b gives us rv/2^(bc->scale) + 0.5ulp. */
13326e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson    b = lshift(b, ++i);
13336e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson    if (b == NULL)
13346e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson        return -1;
133550b60c612e7eca3f815d362190ddb80a21a6d820Mark Dickinson    /* record whether the lsb of rv/2^(bc->scale) is odd:  in the exact halfway
133650b60c612e7eca3f815d362190ddb80a21a6d820Mark Dickinson       case, this is used for round to even. */
133750b60c612e7eca3f815d362190ddb80a21a6d820Mark Dickinson    odd = b->x[0] & 2;
13386e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson    b->x[0] |= 1;
13396e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson
1340bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    p2 -= p5 + i;
1341bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    d = i2b(1);
1342bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (d == NULL) {
1343bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(b);
1344bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return -1;
1345bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1346bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Arrange for convenient computation of quotients:
1347bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     * shift left if necessary so divisor has 4 leading 0 bits.
1348bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     */
1349bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (p5 > 0) {
1350bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        d = pow5mult(d, p5);
1351bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (d == NULL) {
1352bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(b);
1353bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return -1;
1354bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1355bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1356bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else if (p5 < 0) {
1357bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = pow5mult(b, -p5);
1358bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (b == NULL) {
1359bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(d);
1360bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return -1;
1361bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1362bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1363bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (p2 > 0) {
1364bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 = p2;
1365bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        d2 = 0;
1366bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1367bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
1368bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 = 0;
1369bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        d2 = -p2;
1370bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1371bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    i = dshift(d, d2);
1372bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((b2 += i) > 0) {
1373bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = lshift(b, b2);
1374bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (b == NULL) {
1375bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(d);
1376bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return -1;
1377bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1378bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1379bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((d2 += i) > 0) {
1380bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        d = lshift(d, d2);
1381bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (d == NULL) {
1382bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(b);
1383bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return -1;
1384bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1385bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1386bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
13874141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Compare s0 with b/d: set dd to -1, 0, or 1 according as s0 < b/d, s0 ==
13884141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     * b/d, or s0 > b/d.  Here the digits of s0 are thought of as representing
13894141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     * a number in the range [0.1, 1). */
13904141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    if (cmp(b, d) >= 0)
13914141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* b/d >= 1 */
13928efef5ce9f6c0dfd2cb4720b61a37bbdfdb5e30eMark Dickinson        dd = -1;
13934141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    else {
13944141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        i = 0;
13954141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        for(;;) {
13964141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            b = multadd(b, 10, 0);
13974141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (b == NULL) {
13984141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                Bfree(d);
13994141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                return -1;
14004141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            }
14014141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            dd = s0[i < nd0 ? i : i+1] - '0' - quorem(b, d);
14024141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            i++;
140350b60c612e7eca3f815d362190ddb80a21a6d820Mark Dickinson
14044141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (dd)
14054141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                break;
14064141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (!b->x[0] && b->wds == 1) {
14074141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                /* b/d == 0 */
14084141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                dd = i < nd;
14094141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                break;
14104141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            }
14114141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (!(i < nd)) {
14124141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                /* b/d != 0, but digits of s0 exhausted */
14134141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                dd = -1;
14144141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                break;
14154141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            }
1416bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1417bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1418bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(b);
1419bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(d);
142050b60c612e7eca3f815d362190ddb80a21a6d820Mark Dickinson    if (dd > 0 || (dd == 0 && odd))
14216e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson        dval(rv) += sulp(rv, bc);
1422bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return 0;
1423bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
1424bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1425bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsondouble
1426bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson_Py_dg_strtod(const char *s00, char **se)
1427bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
14284141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, e, e1, error;
14294141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    int esign, i, j, k, lz, nd, nd0, sign;
1430bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    const char *s, *s0, *s1;
1431bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    double aadj, aadj1;
1432bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    U aadj2, adj, rv, rv0;
14334141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    ULong y, z, abs_exp;
143418a818bc63d993c3d3433f69cf2b7d2b9bd63ebfMark Dickinson    Long L;
1435bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    BCinfo bc;
1436bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
1437bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1438bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    dval(&rv) = 0.;
14394141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
14404141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Start parsing. */
14414141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    c = *(s = s00);
14424141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
14434141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Parse optional sign, if present. */
14444141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    sign = 0;
14454141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    switch (c) {
14464141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    case '-':
14474141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        sign = 1;
14484141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* no break */
14494141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    case '+':
14504141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        c = *++s;
1451bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
14524141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
14534141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Skip leading zeros: lz is true iff there were leading zeros. */
14544141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    s1 = s;
14554141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    while (c == '0')
14564141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        c = *++s;
14574141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    lz = s != s1;
14584141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
14594141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Point s0 at the first nonzero digit (if any).  nd0 will be the position
14604141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson       of the point relative to s0.  nd will be the total number of digits
14614141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson       ignoring leading zeros. */
14624141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    s0 = s1 = s;
14634141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    while ('0' <= c && c <= '9')
14644141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        c = *++s;
14654141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    nd0 = nd = s - s1;
14664141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
14674141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Parse decimal point and following digits. */
1468bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (c == '.') {
1469bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        c = *++s;
1470bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!nd) {
14714141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            s1 = s;
14724141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            while (c == '0')
14734141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                c = *++s;
14744141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            lz = lz || s != s1;
14754141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            nd0 -= s - s1;
14764141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            s0 = s;
1477bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
14784141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        s1 = s;
14794141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        while ('0' <= c && c <= '9')
14804141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            c = *++s;
14814141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        nd += s - s1;
1482bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
14834141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
14844141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Now lz is true if and only if there were leading zero digits, and nd
14854141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson       gives the total number of digits ignoring leading zeros.  A valid input
14864141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson       must have at least one digit. */
14874141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    if (!nd && !lz) {
148819428060139151e3047283f132e8baf16436745eMark Dickinson        if (se)
148919428060139151e3047283f132e8baf16436745eMark Dickinson            *se = (char *)s00;
14904141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        goto parse_error;
14914141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    }
14924141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
14934141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Parse exponent. */
1494bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    e = 0;
1495bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (c == 'e' || c == 'E') {
1496bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s00 = s;
14974141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        c = *++s;
14984141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
14994141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* Exponent sign. */
1500bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        esign = 0;
15014141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        switch (c) {
1502bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        case '-':
1503bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            esign = 1;
15044141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            /* no break */
1505bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        case '+':
1506bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            c = *++s;
1507bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
15084141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
15094141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* Skip zeros.  lz is true iff there are leading zeros. */
15104141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        s1 = s;
15114141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        while (c == '0')
15124141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            c = *++s;
15134141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        lz = s != s1;
15144141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
15154141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* Get absolute value of the exponent. */
15164141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        s1 = s;
15174141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        abs_exp = 0;
15184141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        while ('0' <= c && c <= '9') {
15194141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            abs_exp = 10*abs_exp + (c - '0');
15204141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            c = *++s;
1521bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
15224141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
15234141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* abs_exp will be correct modulo 2**32.  But 10**9 < 2**32, so if
15244141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson           there are at most 9 significant exponent digits then overflow is
15254141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson           impossible. */
15264141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        if (s - s1 > 9 || abs_exp > MAX_ABS_EXP)
15274141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            e = (int)MAX_ABS_EXP;
1528bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else
15294141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            e = (int)abs_exp;
15304141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        if (esign)
15314141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            e = -e;
15324141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
15334141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* A valid exponent must have at least one digit. */
15344141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        if (s == s1 && !lz)
1535bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            s = s00;
1536bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
15374141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
15384141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Adjust exponent to take into account position of the point. */
15394141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    e -= nd - nd0;
15404141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    if (nd0 <= 0)
1541811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        nd0 = nd;
1542811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson
15434141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Finished parsing.  Set se to indicate how far we parsed */
15444141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    if (se)
15454141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        *se = (char *)s;
15464141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
15474141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* If all digits were zero, exit with return value +-0.0.  Otherwise,
15484141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson       strip trailing zeros: scan back until we hit a nonzero digit. */
15494141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    if (!nd)
15504141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        goto ret;
1551811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    for (i = nd; i > 0; ) {
1552811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        --i;
1553811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        if (s0[i < nd0 ? i : i+1] != '0') {
1554811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson            ++i;
1555811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson            break;
1556811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        }
1557811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    }
1558811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    e += nd - i;
1559811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    nd = i;
1560811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    if (nd0 > nd)
1561811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        nd0 = nd;
1562bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
15634141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Summary of parsing results.  After parsing, and dealing with zero
15644141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     * inputs, we have values s0, nd0, nd, e, sign, where:
1565476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
15664141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *  - s0 points to the first significant digit of the input string
1567476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
1568811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *  - nd is the total number of significant digits (here, and
1569811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *    below, 'significant digits' means the set of digits of the
1570811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *    significand of the input that remain after ignoring leading
15714141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *    and trailing zeros).
1572476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
15734141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *  - nd0 indicates the position of the decimal point, if present; it
15744141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *    satisfies 1 <= nd0 <= nd.  The nd significant digits are in
15754141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *    s0[0:nd0] and s0[nd0+1:nd+1] using the usual Python half-open slice
15764141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *    notation.  (If nd0 < nd, then s0[nd0] contains a '.'  character; if
15774141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *    nd0 == nd, then s0[nd0] could be any non-digit character.)
1578476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
1579811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *  - e is the adjusted exponent: the absolute value of the number
1580811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *    represented by the original input string is n * 10**e, where
1581811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *    n is the integer represented by the concatenation of
1582811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *    s0[0:nd0] and s0[nd0+1:nd+1]
1583476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
1584811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *  - sign gives the sign of the input:  1 for negative, 0 for positive
1585811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *
1586811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *  - the first and last significant digits are nonzero
1587811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     */
1588811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson
1589811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    /* put first DBL_DIG+1 digits into integer y and z.
1590476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
1591476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *  - y contains the value represented by the first min(9, nd)
1592476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *    significant digits
1593476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
1594476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *  - if nd > 9, z contains the value represented by significant digits
1595476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *    with indices in [9, min(16, nd)).  So y * 10**(min(16, nd) - 9) + z
1596476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *    gives the value represented by the first min(16, nd) sig. digits.
1597476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     */
1598476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson
15994141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    bc.e0 = e1 = e;
1600811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    y = z = 0;
1601811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    for (i = 0; i < nd; i++) {
1602811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        if (i < 9)
1603811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson            y = 10*y + s0[i < nd0 ? i : i+1] - '0';
1604811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        else if (i < DBL_DIG+1)
1605811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson            z = 10*z + s0[i < nd0 ? i : i+1] - '0';
1606811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        else
1607811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson            break;
1608811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    }
1609811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson
1610bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
1611bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    dval(&rv) = y;
1612bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k > 9) {
1613bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&rv) = tens[k - 9] * dval(&rv) + z;
1614bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1615bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    bd0 = 0;
1616bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (nd <= DBL_DIG
1617bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        && Flt_Rounds == 1
1618bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ) {
1619bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!e)
1620bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto ret;
1621bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (e > 0) {
1622bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (e <= Ten_pmax) {
1623bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&rv) *= tens[e];
1624bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
1625bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1626bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            i = DBL_DIG - nd;
1627bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (e <= Ten_pmax + i) {
1628bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* A fancier test would sometimes let us do
1629bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                 * this for larger i values.
1630bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                 */
1631bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                e -= i;
1632bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&rv) *= tens[i];
1633bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&rv) *= tens[e];
1634bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
1635bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1636bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1637bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else if (e >= -Ten_pmax) {
1638bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv) /= tens[-e];
1639bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto ret;
1640bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1641bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1642bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    e1 += nd - k;
1643bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1644bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    bc.scale = 0;
1645bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1646bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Get starting approximation = rv * 10**e1 */
1647bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1648bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (e1 > 0) {
1649bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if ((i = e1 & 15))
1650bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv) *= tens[i];
1651bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (e1 &= ~15) {
16524141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (e1 > DBL_MAX_10_EXP)
16534141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                goto ovfl;
1654bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            e1 >>= 4;
1655bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(j = 0; e1 > 1; j++, e1 >>= 1)
1656bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (e1 & 1)
1657bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    dval(&rv) *= bigtens[j];
1658bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* The last multiplication could overflow. */
1659bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            word0(&rv) -= P*Exp_msk1;
1660bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv) *= bigtens[j];
1661bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if ((z = word0(&rv) & Exp_mask)
1662bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                > Exp_msk1*(DBL_MAX_EXP+Bias-P))
1663bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ovfl;
1664bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
1665bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* set to largest number */
1666bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* (Can't trust DBL_MAX) */
1667bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word0(&rv) = Big0;
1668bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word1(&rv) = Big1;
1669bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1670bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else
1671bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word0(&rv) += P*Exp_msk1;
1672bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1673bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1674bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else if (e1 < 0) {
1675bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        e1 = -e1;
1676bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if ((i = e1 & 15))
1677bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv) /= tens[i];
1678bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (e1 >>= 4) {
1679bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (e1 >= 1 << n_bigtens)
1680bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto undfl;
1681bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (e1 & Scale_Bit)
1682bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                bc.scale = 2*P;
1683bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(j = 0; e1 > 0; j++, e1 >>= 1)
1684bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (e1 & 1)
1685bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    dval(&rv) *= tinytens[j];
1686bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
1687bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                                            >> Exp_shift)) > 0) {
1688bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* scaled rv is denormal; clear j low bits */
1689bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (j >= 32) {
1690bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    word1(&rv) = 0;
1691bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    if (j >= 53)
1692bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        word0(&rv) = (P+2)*Exp_msk1;
1693bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    else
1694bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        word0(&rv) &= 0xffffffff << (j-32);
1695bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
1696bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                else
1697bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    word1(&rv) &= 0xffffffff << j;
1698bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
16994141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (!dval(&rv))
17004141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                goto undfl;
1701bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1702bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1703bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1704bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Now the hard part -- adjusting rv to the correct value.*/
1705bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1706bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Put digits into bd: true value = bd * 10^e */
1707bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1708bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    bc.nd = nd;
17095a0b399aa9d75d4d208394d80b4997c164435ecbMark Dickinson    bc.nd0 = nd0;       /* Only needed if nd > STRTOD_DIGLIM, but done here */
1710bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        /* to silence an erroneous warning about bc.nd0 */
1711bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        /* possibly not being initialized. */
17125a0b399aa9d75d4d208394d80b4997c164435ecbMark Dickinson    if (nd > STRTOD_DIGLIM) {
17135a0b399aa9d75d4d208394d80b4997c164435ecbMark Dickinson        /* ASSERT(STRTOD_DIGLIM >= 18); 18 == one more than the */
1714bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* minimum number of decimal digits to distinguish double values */
1715bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* in IEEE arithmetic. */
1716476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson
1717476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson        /* Truncate input to 18 significant digits, then discard any trailing
1718476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson           zeros on the result by updating nd, nd0, e and y suitably. (There's
1719476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson           no need to update z; it's not reused beyond this point.) */
1720476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson        for (i = 18; i > 0; ) {
1721476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson            /* scan back until we hit a nonzero digit.  significant digit 'i'
1722476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson            is s0[i] if i < nd0, s0[i+1] if i >= nd0. */
1723bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            --i;
1724476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson            if (s0[i < nd0 ? i : i+1] != '0') {
1725476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson                ++i;
1726476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson                break;
1727476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson            }
1728bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1729bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        e += nd - i;
1730bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        nd = i;
1731bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (nd0 > nd)
1732bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            nd0 = nd;
1733bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (nd < 9) { /* must recompute y */
1734bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            y = 0;
1735bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(i = 0; i < nd0; ++i)
1736bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                y = 10*y + s0[i] - '0';
1737476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson            for(; i < nd; ++i)
1738476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson                y = 10*y + s0[i+1] - '0';
1739bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1740bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1741d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson    bd0 = s2b(s0, nd0, nd, y);
1742bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (bd0 == NULL)
1743bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto failed_malloc;
1744bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1745bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(;;) {
1746bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bd = Balloc(bd0->k);
1747bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bd == NULL) {
1748bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd0);
1749bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
1750bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1751bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bcopy(bd, bd0);
1752bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bb = d2b(&rv, &bbe, &bbbits);   /* rv = bb * 2^bbe */
1753bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bb == NULL) {
1754bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd);
1755bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd0);
1756bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
1757bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1758bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bs = i2b(1);
1759bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bs == NULL) {
1760bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bb);
1761bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd);
1762bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd0);
1763bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
1764bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1765bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1766bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (e >= 0) {
1767bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb2 = bb5 = 0;
1768bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bd2 = bd5 = e;
1769bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1770bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
1771bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb2 = bb5 = -e;
1772bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bd2 = bd5 = 0;
1773bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1774bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bbe >= 0)
1775bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb2 += bbe;
1776bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else
1777bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bd2 -= bbe;
1778bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bs2 = bb2;
1779bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        j = bbe - bc.scale;
1780bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = j + bbbits - 1;     /* logb(rv) */
1781bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (i < Emin)   /* denormal */
1782bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            j += P - Emin;
1783bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else
1784bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            j = P + 1 - bbbits;
1785bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bb2 += j;
1786bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bd2 += j;
1787bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bd2 += bc.scale;
1788bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = bb2 < bd2 ? bb2 : bd2;
1789bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (i > bs2)
1790bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            i = bs2;
1791bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (i > 0) {
1792bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb2 -= i;
1793bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bd2 -= i;
1794bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bs2 -= i;
1795bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1796bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bb5 > 0) {
1797bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bs = pow5mult(bs, bb5);
1798bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bs == NULL) {
1799bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bb);
1800bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd);
1801bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
1802bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
1803bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1804bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb1 = mult(bs, bb);
1805bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bb);
1806bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb = bb1;
1807bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bb == NULL) {
1808bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bs);
1809bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd);
1810bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
1811bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
1812bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1813bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1814bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bb2 > 0) {
1815bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb = lshift(bb, bb2);
1816bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bb == NULL) {
1817bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bs);
1818bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd);
1819bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
1820bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
1821bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1822bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1823bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bd5 > 0) {
1824bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bd = pow5mult(bd, bd5);
1825bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bd == NULL) {
1826bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bb);
1827bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bs);
1828bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
1829bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
1830bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1831bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1832bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bd2 > 0) {
1833bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bd = lshift(bd, bd2);
1834bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bd == NULL) {
1835bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bb);
1836bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bs);
1837bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
1838bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
1839bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1840bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1841bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bs2 > 0) {
1842bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bs = lshift(bs, bs2);
1843bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bs == NULL) {
1844bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bb);
1845bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd);
1846bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
1847bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
1848bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1849bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1850bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        delta = diff(bb, bd);
1851bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (delta == NULL) {
1852bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bb);
1853bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bs);
1854bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd);
1855bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd0);
1856bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
1857bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
18584141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        dsign = delta->sign;
1859bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        delta->sign = 0;
1860bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = cmp(delta, bs);
1861bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bc.nd > nd && i <= 0) {
18624141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (dsign)
1863bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;  /* Must use bigcomp(). */
1864f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson
1865f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson            /* Here rv overestimates the truncated decimal value by at most
1866f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               0.5 ulp(rv).  Hence rv either overestimates the true decimal
1867f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               value by <= 0.5 ulp(rv), or underestimates it by some small
1868f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               amount (< 0.1 ulp(rv)); either way, rv is within 0.5 ulps of
1869f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               the true decimal value, so it's possible to exit.
1870f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson
1871f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               Exception: if scaled rv is a normal exact power of 2, but not
1872f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               DBL_MIN, then rv - 0.5 ulp(rv) takes us all the way down to the
1873f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               next double, so the correctly rounded result is either rv - 0.5
1874f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               ulp(rv) or rv; in this case, use bigcomp to distinguish. */
1875f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson
1876f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson            if (!word1(&rv) && !(word0(&rv) & Bndry_mask)) {
1877f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                /* rv can't be 0, since it's an overestimate for some
1878f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                   nonzero value.  So rv is a normal power of 2. */
1879f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                j = (int)(word0(&rv) & Exp_mask) >> Exp_shift;
1880f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                /* rv / 2^bc.scale = 2^(j - 1023 - bc.scale); use bigcomp if
1881f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                   rv / 2^bc.scale >= 2^-1021. */
1882f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                if (j - bc.scale >= 2) {
1883f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                    dval(&rv) -= 0.5 * sulp(&rv, &bc);
18844141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                    break; /* Use bigcomp. */
1885f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                }
1886f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson            }
1887f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson
1888bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            {
1889bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                bc.nd = nd;
1890bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                i = -1; /* Discarded digits make delta smaller. */
1891bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1892bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1893bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1894bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (i < 0) {
1895bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* Error is less than half an ulp -- check for
1896bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             * special case of mantissa a power of two.
1897bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             */
18984141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (dsign || word1(&rv) || word0(&rv) & Bndry_mask
1899bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
1900bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                ) {
1901bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
1902bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1903bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (!delta->x[0] && delta->wds <= 1) {
1904bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* exact result */
1905bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
1906bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1907bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            delta = lshift(delta,Log2P);
1908bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (delta == NULL) {
1909bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bb);
1910bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bs);
1911bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd);
1912bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
1913bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
1914bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1915bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (cmp(delta, bs) > 0)
1916bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto drop_down;
1917bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            break;
1918bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1919bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (i == 0) {
1920bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* exactly half-way between */
19214141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (dsign) {
1922bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
1923bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    &&  word1(&rv) == (
1924bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        (bc.scale &&
1925bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                         (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) ?
1926bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
1927bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        0xffffffff)) {
1928bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    /*boundary case -- increment exponent*/
1929bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    word0(&rv) = (word0(&rv) & Exp_mask)
1930bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        + Exp_msk1
1931bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        ;
1932bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    word1(&rv) = 0;
19334141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                    dsign = 0;
1934bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    break;
1935bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
1936bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1937bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
1938bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson              drop_down:
1939bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* boundary case -- decrement exponent */
1940bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (bc.scale) {
1941bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    L = word0(&rv) & Exp_mask;
1942bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    if (L <= (2*P+1)*Exp_msk1) {
1943bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        if (L > (P+2)*Exp_msk1)
1944bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            /* round even ==> */
1945bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            /* accept rv */
1946bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            break;
1947bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        /* rv = smallest denormal */
19484141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                        if (bc.nd > nd)
1949bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            break;
1950bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        goto undfl;
1951bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    }
1952bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
1953bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                L = (word0(&rv) & Exp_mask) - Exp_msk1;
1954bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word0(&rv) = L | Bndry_mask1;
1955bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word1(&rv) = 0xffffffff;
1956bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
1957bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1958bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (!(word1(&rv) & LSB))
1959bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
19604141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (dsign)
1961bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&rv) += ulp(&rv);
1962bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else {
1963bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&rv) -= ulp(&rv);
1964bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (!dval(&rv)) {
19655a0b399aa9d75d4d208394d80b4997c164435ecbMark Dickinson                    if (bc.nd >nd)
1966bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        break;
1967bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto undfl;
1968bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
1969bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
19704141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            dsign = 1 - dsign;
1971bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            break;
1972bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1973bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if ((aadj = ratio(delta, bs)) <= 2.) {
19744141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (dsign)
1975bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                aadj = aadj1 = 1.;
1976bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else if (word1(&rv) || word0(&rv) & Bndry_mask) {
1977bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (word1(&rv) == Tiny1 && !word0(&rv)) {
19785a0b399aa9d75d4d208394d80b4997c164435ecbMark Dickinson                    if (bc.nd >nd)
1979bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        break;
1980bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto undfl;
1981bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
1982bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                aadj = 1.;
1983bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                aadj1 = -1.;
1984bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1985bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else {
1986bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* special case -- power of FLT_RADIX to be */
1987bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* rounded down... */
1988bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1989bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (aadj < 2./FLT_RADIX)
1990bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    aadj = 1./FLT_RADIX;
1991bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                else
1992bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    aadj *= 0.5;
1993bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                aadj1 = -aadj;
1994bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1995bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1996bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
1997bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            aadj *= 0.5;
19984141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            aadj1 = dsign ? aadj : -aadj;
1999bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (Flt_Rounds == 0)
2000bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                aadj1 += 0.5;
2001bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2002bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = word0(&rv) & Exp_mask;
2003bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2004bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* Check for overflow */
2005bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2006bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
2007bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv0) = dval(&rv);
2008bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            word0(&rv) -= P*Exp_msk1;
2009bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            adj.d = aadj1 * ulp(&rv);
2010bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv) += adj.d;
2011bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if ((word0(&rv) & Exp_mask) >=
2012bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
201323df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                if (word0(&rv0) == Big0 && word1(&rv0) == Big1) {
201423df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                    Bfree(bb);
201523df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                    Bfree(bd);
201623df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                    Bfree(bs);
201723df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                    Bfree(bd0);
201823df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                    Bfree(delta);
2019bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto ovfl;
202023df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                }
2021bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word0(&rv) = Big0;
2022bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word1(&rv) = Big1;
2023bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto cont;
2024bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2025bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else
2026bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word0(&rv) += P*Exp_msk1;
2027bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2028bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
2029bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bc.scale && y <= 2*P*Exp_msk1) {
2030bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (aadj <= 0x7fffffff) {
2031bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    if ((z = (ULong)aadj) <= 0)
2032bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        z = 1;
2033bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    aadj = z;
20344141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                    aadj1 = dsign ? aadj : -aadj;
2035bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2036bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&aadj2) = aadj1;
2037bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word0(&aadj2) += (2*P+1)*Exp_msk1 - y;
2038bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                aadj1 = dval(&aadj2);
2039bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2040bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            adj.d = aadj1 * ulp(&rv);
2041bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv) += adj.d;
2042bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2043bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        z = word0(&rv) & Exp_mask;
2044bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bc.nd == nd) {
2045bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (!bc.scale)
2046bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (y == z) {
2047bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    /* Can we stop now? */
2048bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    L = (Long)aadj;
2049bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    aadj -= L;
2050bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    /* The tolerances below are conservative. */
20514141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                    if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
2052bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        if (aadj < .4999999 || aadj > .5000001)
2053bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            break;
2054bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    }
2055bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    else if (aadj < .4999999/FLT_RADIX)
2056bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        break;
2057bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2058bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2059bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson      cont:
2060bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(bb);
2061bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(bd);
2062bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(bs);
2063bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(delta);
2064bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2065bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(bb);
2066bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(bd);
2067bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(bs);
2068bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(bd0);
2069bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(delta);
2070bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (bc.nd > nd) {
2071bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        error = bigcomp(&rv, s0, &bc);
2072bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (error)
2073bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
2074bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2075bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2076bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (bc.scale) {
2077bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
2078bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word1(&rv0) = 0;
2079bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&rv) *= dval(&rv0);
2080bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
20814141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
2082bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson  ret:
2083bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return sign ? -dval(&rv) : dval(&rv);
2084bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
20854141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson  parse_error:
20864141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    return 0.0;
20874141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
2088bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson  failed_malloc:
2089bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    errno = ENOMEM;
2090bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return -1.0;
20914141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
20924141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson  undfl:
20934141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    return sign ? -0.0 : 0.0;
20944141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
20954141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson  ovfl:
20964141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    errno = ERANGE;
20974141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Can't trust HUGE_VAL */
20984141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    word0(&rv) = Exp_mask;
20994141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    word1(&rv) = 0;
21004141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    return sign ? -dval(&rv) : dval(&rv);
21014141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
2102bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
2103bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2104bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic char *
2105bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonrv_alloc(int i)
2106bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
2107bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int j, k, *r;
2108bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2109bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    j = sizeof(ULong);
2110bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(k = 0;
2111bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (unsigned)i;
2112bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        j <<= 1)
2113bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k++;
2114bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    r = (int*)Balloc(k);
2115bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (r == NULL)
2116bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
2117bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    *r = k;
2118bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return (char *)(r+1);
2119bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
2120bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2121bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic char *
2122bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonnrv_alloc(char *s, char **rve, int n)
2123bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
2124bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    char *rv, *t;
2125bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2126bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    rv = rv_alloc(n);
2127bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (rv == NULL)
2128bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
2129bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    t = rv;
2130bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while((*t = *s++)) t++;
2131bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (rve)
2132bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *rve = t;
2133bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return rv;
2134bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
2135bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2136bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* freedtoa(s) must be used to free values s returned by dtoa
2137bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * when MULTIPLE_THREADS is #defined.  It should be used in all cases,
2138bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * but for consistency with earlier versions of dtoa, it is optional
2139bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * when MULTIPLE_THREADS is not defined.
2140bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson */
2141bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2142bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonvoid
2143bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson_Py_dg_freedtoa(char *s)
2144bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
2145bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b = (Bigint *)((int *)s - 1);
2146bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b->maxwds = 1 << (b->k = *(int*)b);
2147bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(b);
2148bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
2149bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2150bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
2151bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
2152bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * Inspired by "How to Print Floating-Point Numbers Accurately" by
2153bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
2154bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
2155bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * Modifications:
2156bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      1. Rather than iterating, we use a simple numeric overestimate
2157bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         to determine k = floor(log10(d)).  We scale relevant
2158bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         quantities using O(log2(k)) rather than O(k) multiplications.
2159bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
2160bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         try to generate digits strictly left to right.  Instead, we
2161bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         compute with fewer bits and propagate the carry if necessary
2162bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         when rounding the final digit up.  This is often faster.
2163bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      3. Under the assumption that input will be rounded nearest,
2164bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
2165bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         That is, we allow equality in stopping tests when the
2166bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         round-nearest rule will give the same floating-point value
2167bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         as would satisfaction of the stopping test with strict
2168bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         inequality.
2169bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      4. We remove common factors of powers of 2 from relevant
2170bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         quantities.
2171bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      5. When converting floating-point integers less than 1e16,
2172bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         we use floating-point arithmetic rather than resorting
2173bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         to multiple-precision integers.
2174bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      6. When asked to produce fewer than 15 digits, we first try
2175bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         to get by with floating-point arithmetic; we resort to
2176bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         multiple-precision integer arithmetic only if we cannot
2177bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         guarantee that the floating-point calculation has given
2178bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         the correctly rounded result.  For k requested digits and
2179bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         "uniformly" distributed input, the probability is
2180bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         something like 10^(k-15) that we must resort to the Long
2181bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         calculation.
2182bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson */
2183bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2184bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Additional notes (METD): (1) returns NULL on failure.  (2) to avoid memory
2185bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   leakage, a successful call to _Py_dg_dtoa should always be matched by a
2186bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   call to _Py_dg_freedtoa. */
2187bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2188bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonchar *
2189bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson_Py_dg_dtoa(double dd, int mode, int ndigits,
2190bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            int *decpt, int *sign, char **rve)
2191bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
2192bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /*  Arguments ndigits, decpt, sign are similar to those
2193bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        of ecvt and fcvt; trailing zeros are suppressed from
2194bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        the returned string.  If not null, *rve is set to point
2195bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        to the end of the return value.  If d is +-Infinity or NaN,
2196bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        then *decpt is set to 9999.
2197bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2198bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        mode:
2199bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        0 ==> shortest string that yields d when read in
2200bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        and rounded to nearest.
2201bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        1 ==> like 0, but with Steele & White stopping rule;
2202bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        e.g. with IEEE P754 arithmetic , mode 0 gives
2203bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        1e23 whereas mode 1 gives 9.999999999999999e22.
2204bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        2 ==> max(1,ndigits) significant digits.  This gives a
2205bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return value similar to that of ecvt, except
2206bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        that trailing zeros are suppressed.
2207bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        3 ==> through ndigits past the decimal point.  This
2208bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        gives a return value similar to that from fcvt,
2209bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        except that trailing zeros are suppressed, and
2210bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ndigits can be negative.
2211bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        4,5 ==> similar to 2 and 3, respectively, but (in
2212bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        round-nearest mode) with the tests of mode 0 to
2213bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        possibly return a shorter string that rounds to d.
2214bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        With IEEE arithmetic and compilation with
2215bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
2216bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        as modes 2 and 3 when FLT_ROUNDS != 1.
2217bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        6-9 ==> Debugging modes similar to mode - 4:  don't try
2218bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        fast floating-point estimate (if applicable).
2219bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2220bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Values of mode other than 0-9 are treated as mode 0.
2221bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2222bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Sufficient space is allocated to the return value
2223bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        to hold the suppressed trailing zeros.
2224bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    */
2225bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2226bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
2227bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
2228bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        spec_case, try_quick;
2229bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Long L;
2230bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int denorm;
2231bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong x;
2232bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b, *b1, *delta, *mlo, *mhi, *S;
2233bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    U d2, eps, u;
2234bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    double ds;
2235bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    char *s, *s0;
2236bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2237bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* set pointers to NULL, to silence gcc compiler warnings and make
2238bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       cleanup easier on error */
2239bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    mlo = mhi = b = S = 0;
2240bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    s0 = 0;
2241bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2242bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    u.d = dd;
2243bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (word0(&u) & Sign_bit) {
2244bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* set sign for everything, including 0's and NaNs */
2245bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *sign = 1;
2246bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&u) &= ~Sign_bit; /* clear sign bit */
2247bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2248bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else
2249bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *sign = 0;
2250bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2251bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* quick return for Infinities, NaNs and zeros */
2252bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((word0(&u) & Exp_mask) == Exp_mask)
2253bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    {
2254bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* Infinity or NaN */
2255bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *decpt = 9999;
2256bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!word1(&u) && !(word0(&u) & 0xfffff))
2257bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return nrv_alloc("Infinity", rve, 8);
2258bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return nrv_alloc("NaN", rve, 3);
2259bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2260bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!dval(&u)) {
2261bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *decpt = 1;
2262bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return nrv_alloc("0", rve, 1);
2263bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2264bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2265bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* compute k = floor(log10(d)).  The computation may leave k
2266bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       one too large, but should never leave k too small. */
2267bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b = d2b(&u, &be, &bbits);
2268bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b == NULL)
2269bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto failed_malloc;
2270bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {
2271bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&d2) = dval(&u);
2272bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&d2) &= Frac_mask1;
2273bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&d2) |= Exp_11;
2274bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2275bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* log(x)       ~=~ log(1.5) + (x-1.5)/1.5
2276bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * log10(x)      =  log(x) / log(10)
2277bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         *              ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
2278bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
2279bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         *
2280bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * This suggests computing an approximation k to log10(d) by
2281bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         *
2282bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * k = (i - Bias)*0.301029995663981
2283bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         *      + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
2284bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         *
2285bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * We want k to be too large rather than too small.
2286bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * The error in the first-order Taylor series approximation
2287bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * is in our favor, so we just round up the constant enough
2288bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * to compensate for any error in the multiplication of
2289bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
2290bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
2291bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * adding 1e-13 to the constant term more than suffices.
2292bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * Hence we adjust the constant term to 0.1760912590558.
2293bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * (We could get a more accurate k by invoking log10,
2294bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         *  but this is probably not worthwhile.)
2295bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         */
2296bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2297bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i -= Bias;
2298bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        denorm = 0;
2299bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2300bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
2301bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* d is denormalized */
2302bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2303bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = bbits + be + (Bias + (P-1) - 1);
2304bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x = i > 32  ? word0(&u) << (64 - i) | word1(&u) >> (i - 32)
2305bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            : word1(&u) << (32 - i);
2306bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&d2) = x;
2307bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
2308bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i -= (Bias + (P-1) - 1) + 1;
2309bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        denorm = 1;
2310bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2311bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 +
2312bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i*0.301029995663981;
2313bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k = (int)ds;
2314bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (ds < 0. && ds != k)
2315bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k--;    /* want k = floor(ds) */
2316bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k_check = 1;
2317bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k >= 0 && k <= Ten_pmax) {
2318bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (dval(&u) < tens[k])
2319bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            k--;
2320bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k_check = 0;
2321bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2322bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    j = bbits - i - 1;
2323bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (j >= 0) {
2324bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 = 0;
2325bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s2 = j;
2326bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2327bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
2328bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 = -j;
2329bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s2 = 0;
2330bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2331bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k >= 0) {
2332bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b5 = 0;
2333bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s5 = k;
2334bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s2 += k;
2335bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2336bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
2337bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 -= k;
2338bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b5 = -k;
2339bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s5 = 0;
2340bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2341bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (mode < 0 || mode > 9)
2342bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        mode = 0;
2343bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2344bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    try_quick = 1;
2345bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2346bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (mode > 5) {
2347bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        mode -= 4;
2348bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        try_quick = 0;
2349bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2350bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    leftright = 1;
2351bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ilim = ilim1 = -1;  /* Values for cases 0 and 1; done here to */
2352bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* silence erroneous "gcc -Wall" warning. */
2353bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    switch(mode) {
2354bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    case 0:
2355bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    case 1:
2356bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = 18;
2357bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ndigits = 0;
2358bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        break;
2359bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    case 2:
2360bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        leftright = 0;
2361bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* no break */
2362bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    case 4:
2363bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (ndigits <= 0)
2364bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ndigits = 1;
2365bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ilim = ilim1 = i = ndigits;
2366bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        break;
2367bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    case 3:
2368bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        leftright = 0;
2369bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* no break */
2370bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    case 5:
2371bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = ndigits + k + 1;
2372bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ilim = i;
2373bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ilim1 = i - 1;
2374bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (i <= 0)
2375bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            i = 1;
2376bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2377bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    s0 = rv_alloc(i);
2378bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (s0 == NULL)
2379bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto failed_malloc;
2380bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    s = s0;
2381bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2382bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2383bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (ilim >= 0 && ilim <= Quick_max && try_quick) {
2384bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2385bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* Try to get by with floating-point arithmetic. */
2386bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2387bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = 0;
2388bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&d2) = dval(&u);
2389bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k0 = k;
2390bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ilim0 = ilim;
2391bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ieps = 2; /* conservative */
2392bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (k > 0) {
2393bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ds = tens[k&0xf];
2394bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            j = k >> 4;
2395bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (j & Bletch) {
2396bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* prevent overflows */
2397bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                j &= Bletch - 1;
2398bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&u) /= bigtens[n_bigtens-1];
2399bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                ieps++;
2400bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2401bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(; j; j >>= 1, i++)
2402bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (j & 1) {
2403bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    ieps++;
2404bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    ds *= bigtens[i];
2405bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2406bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&u) /= ds;
2407bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2408bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else if ((j1 = -k)) {
2409bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&u) *= tens[j1 & 0xf];
2410bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(j = j1 >> 4; j; j >>= 1, i++)
2411bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (j & 1) {
2412bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    ieps++;
2413bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    dval(&u) *= bigtens[i];
2414bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2415bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2416bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (k_check && dval(&u) < 1. && ilim > 0) {
2417bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (ilim1 <= 0)
2418bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto fast_failed;
2419bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ilim = ilim1;
2420bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            k--;
2421bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&u) *= 10.;
2422bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ieps++;
2423bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2424bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&eps) = ieps*dval(&u) + 7.;
2425bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&eps) -= (P-1)*Exp_msk1;
2426bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (ilim == 0) {
2427bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            S = mhi = 0;
2428bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&u) -= 5.;
2429bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (dval(&u) > dval(&eps))
2430bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto one_digit;
2431bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (dval(&u) < -dval(&eps))
2432bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto no_digits;
2433bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto fast_failed;
2434bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2435bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (leftright) {
2436bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* Use Steele & White method of only
2437bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             * generating digits needed.
2438bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             */
2439bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
2440bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(i = 0;;) {
2441bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                L = (Long)dval(&u);
2442bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&u) -= L;
2443bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *s++ = '0' + (int)L;
2444bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (dval(&u) < dval(&eps))
2445bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto ret1;
2446bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (1. - dval(&u) < dval(&eps))
2447bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto bump_up;
2448bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (++i >= ilim)
2449bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    break;
2450bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&eps) *= 10.;
2451bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&u) *= 10.;
2452bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2453bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2454bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
2455bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* Generate ilim digits, then fix them up. */
2456bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&eps) *= tens[ilim-1];
2457bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(i = 1;; i++, dval(&u) *= 10.) {
2458bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                L = (Long)(dval(&u));
2459bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (!(dval(&u) -= L))
2460bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    ilim = i;
2461bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *s++ = '0' + (int)L;
2462bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (i == ilim) {
2463bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    if (dval(&u) > 0.5 + dval(&eps))
2464bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        goto bump_up;
2465bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    else if (dval(&u) < 0.5 - dval(&eps)) {
2466bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        while(*--s == '0');
2467bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        s++;
2468bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        goto ret1;
2469bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    }
2470bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    break;
2471bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2472bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2473bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2474bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson      fast_failed:
2475bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s = s0;
2476bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&u) = dval(&d2);
2477bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k = k0;
2478bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ilim = ilim0;
2479bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2480bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2481bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Do we have a "small" integer? */
2482bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2483bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (be >= 0 && k <= Int_max) {
2484bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* Yes. */
2485bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ds = tens[k];
2486bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (ndigits < 0 && ilim <= 0) {
2487bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            S = mhi = 0;
2488bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (ilim < 0 || dval(&u) <= 5*ds)
2489bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto no_digits;
2490bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto one_digit;
2491bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2492bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        for(i = 1;; i++, dval(&u) *= 10.) {
2493bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            L = (Long)(dval(&u) / ds);
2494bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&u) -= L*ds;
2495bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *s++ = '0' + (int)L;
2496bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (!dval(&u)) {
2497bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
2498bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2499bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (i == ilim) {
2500bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&u) += dval(&u);
2501bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (dval(&u) > ds || (dval(&u) == ds && L & 1)) {
2502bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                  bump_up:
2503bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    while(*--s == '9')
2504bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        if (s == s0) {
2505bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            k++;
2506bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            *s = '0';
2507bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            break;
2508bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        }
2509bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    ++*s++;
2510bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2511bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
2512bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2513bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2514bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto ret1;
2515bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2516bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2517bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    m2 = b2;
2518bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    m5 = b5;
2519bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (leftright) {
2520bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i =
2521bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            denorm ? be + (Bias + (P-1) - 1 + 1) :
2522bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            1 + P - bbits;
2523bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 += i;
2524bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s2 += i;
2525bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        mhi = i2b(1);
2526bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (mhi == NULL)
2527bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
2528bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2529bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (m2 > 0 && s2 > 0) {
2530bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = m2 < s2 ? m2 : s2;
2531bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 -= i;
2532bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        m2 -= i;
2533bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s2 -= i;
2534bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2535bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b5 > 0) {
2536bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (leftright) {
2537bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (m5 > 0) {
2538bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                mhi = pow5mult(mhi, m5);
2539bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (mhi == NULL)
2540bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2541bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                b1 = mult(mhi, b);
2542bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(b);
2543bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                b = b1;
2544bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (b == NULL)
2545bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2546bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2547bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if ((j = b5 - m5)) {
2548bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                b = pow5mult(b, j);
2549bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (b == NULL)
2550bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2551bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2552bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2553bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
2554bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b = pow5mult(b, b5);
2555bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (b == NULL)
2556bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2557bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2558bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2559bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    S = i2b(1);
2560bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (S == NULL)
2561bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto failed_malloc;
2562bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (s5 > 0) {
2563bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        S = pow5mult(S, s5);
2564bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (S == NULL)
2565bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
2566bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2567bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2568bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Check for special case that d is a normalized power of 2. */
2569bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2570bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    spec_case = 0;
2571bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((mode < 2 || leftright)
2572bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ) {
2573bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!word1(&u) && !(word0(&u) & Bndry_mask)
2574bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            && word0(&u) & (Exp_mask & ~Exp_msk1)
2575bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ) {
2576bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* The special case */
2577bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b2 += Log2P;
2578bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            s2 += Log2P;
2579bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            spec_case = 1;
2580bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2581bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2582bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2583bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Arrange for convenient computation of quotients:
2584bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     * shift left if necessary so divisor has 4 leading 0 bits.
2585bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     *
2586bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     * Perhaps we should just compute leading 28 bits of S once
2587bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     * and for all and pass them and a shift to quorem, so it
2588bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     * can do shifts and ors to compute the numerator for q.
2589bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     */
2590bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f))
2591bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = 32 - i;
2592bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define iInc 28
2593bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    i = dshift(S, s2);
2594bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b2 += i;
2595bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    m2 += i;
2596bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    s2 += i;
2597bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b2 > 0) {
2598bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = lshift(b, b2);
2599bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (b == NULL)
2600bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
2601bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2602bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (s2 > 0) {
2603bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        S = lshift(S, s2);
2604bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (S == NULL)
2605bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
2606bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2607bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k_check) {
2608bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (cmp(b,S) < 0) {
2609bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            k--;
2610bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b = multadd(b, 10, 0);      /* we botched the k estimate */
2611bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (b == NULL)
2612bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2613bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (leftright) {
2614bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                mhi = multadd(mhi, 10, 0);
2615bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (mhi == NULL)
2616bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2617bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2618bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ilim = ilim1;
2619bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2620bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2621bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (ilim <= 0 && (mode == 3 || mode == 5)) {
2622bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (ilim < 0) {
2623bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* no digits, fcvt style */
2624bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson          no_digits:
2625bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            k = -1 - ndigits;
2626bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto ret;
2627bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2628bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
2629bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            S = multadd(S, 5, 0);
2630bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (S == NULL)
2631bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2632bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (cmp(b, S) <= 0)
2633bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto no_digits;
2634bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2635bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson      one_digit:
2636bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *s++ = '1';
2637bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k++;
2638bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto ret;
2639bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2640bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (leftright) {
2641bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (m2 > 0) {
2642bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            mhi = lshift(mhi, m2);
2643bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (mhi == NULL)
2644bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2645bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2646bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2647bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* Compute mlo -- check for special case
2648bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * that d is a normalized power of 2.
2649bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         */
2650bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2651bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        mlo = mhi;
2652bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (spec_case) {
2653bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            mhi = Balloc(mhi->k);
2654bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (mhi == NULL)
2655bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2656bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bcopy(mhi, mlo);
2657bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            mhi = lshift(mhi, Log2P);
2658bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (mhi == NULL)
2659bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2660bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2661bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2662bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        for(i = 1;;i++) {
2663bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dig = quorem(b,S) + '0';
2664bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* Do we yet have the shortest decimal string
2665bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             * that will round to d?
2666bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             */
2667bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            j = cmp(b, mlo);
2668bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            delta = diff(S, mhi);
2669bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (delta == NULL)
2670bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2671bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            j1 = delta->sign ? 1 : cmp(b, delta);
2672bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(delta);
2673bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (j1 == 0 && mode != 1 && !(word1(&u) & 1)
2674bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                ) {
2675bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (dig == '9')
2676bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto round_9_up;
2677bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (j > 0)
2678bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    dig++;
2679bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *s++ = dig;
2680bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
2681bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2682bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (j < 0 || (j == 0 && mode != 1
2683bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                          && !(word1(&u) & 1)
2684bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    )) {
2685bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (!b->x[0] && b->wds <= 1) {
2686bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto accept_dig;
2687bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2688bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (j1 > 0) {
2689bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    b = lshift(b, 1);
2690bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    if (b == NULL)
2691bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        goto failed_malloc;
2692bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    j1 = cmp(b, S);
2693bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    if ((j1 > 0 || (j1 == 0 && dig & 1))
2694bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        && dig++ == '9')
2695bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        goto round_9_up;
2696bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2697bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson              accept_dig:
2698bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *s++ = dig;
2699bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
2700bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2701bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (j1 > 0) {
2702bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (dig == '9') { /* possible if i == 1 */
2703bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                  round_9_up:
2704bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    *s++ = '9';
2705bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto roundoff;
2706bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2707bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *s++ = dig + 1;
2708bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
2709bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2710bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *s++ = dig;
2711bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (i == ilim)
2712bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
2713bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b = multadd(b, 10, 0);
2714bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (b == NULL)
2715bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2716bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (mlo == mhi) {
2717bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                mlo = mhi = multadd(mhi, 10, 0);
2718bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (mlo == NULL)
2719bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2720bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2721bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else {
2722bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                mlo = multadd(mlo, 10, 0);
2723bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (mlo == NULL)
2724bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2725bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                mhi = multadd(mhi, 10, 0);
2726bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (mhi == NULL)
2727bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2728bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2729bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2730bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2731bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else
2732bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        for(i = 1;; i++) {
2733bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *s++ = dig = quorem(b,S) + '0';
2734bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (!b->x[0] && b->wds <= 1) {
2735bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
2736bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2737bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (i >= ilim)
2738bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
2739bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b = multadd(b, 10, 0);
2740bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (b == NULL)
2741bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2742bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2743bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2744bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Round off last digit */
2745bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2746bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b = lshift(b, 1);
2747bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b == NULL)
2748bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto failed_malloc;
2749bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    j = cmp(b, S);
2750bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (j > 0 || (j == 0 && dig & 1)) {
2751bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson      roundoff:
2752bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        while(*--s == '9')
2753bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (s == s0) {
2754bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                k++;
2755bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *s++ = '1';
2756bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
2757bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2758bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ++*s++;
2759bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2760bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
2761bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        while(*--s == '0');
2762bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s++;
2763bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2764bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson  ret:
2765bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(S);
2766bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (mhi) {
2767bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (mlo && mlo != mhi)
2768bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(mlo);
2769bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(mhi);
2770bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2771bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson  ret1:
2772bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(b);
2773bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    *s = 0;
2774bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    *decpt = k + 1;
2775bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (rve)
2776bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *rve = s;
2777bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return s0;
2778bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson  failed_malloc:
2779bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (S)
2780bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(S);
2781bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (mlo && mlo != mhi)
2782bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(mlo);
2783bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (mhi)
2784bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(mhi);
2785bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b)
2786bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(b);
2787bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (s0)
2788bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        _Py_dg_freedtoa(s0);
2789bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return NULL;
2790bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
2791bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef __cplusplus
2792bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
2793bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
2794bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2795bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif  /* PY_NO_SHORT_FLOAT_REPR */
2796