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
207c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson#define MAX_ABS_EXP 1100000000U
208c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson#endif
209c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson/* Bound on length of pieces of input strings in _Py_dg_strtod; specifically,
210c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson   this is used to bound the total number of digits ignoring leading zeros and
211c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson   the number of digits that follow the decimal point.  Ideally, MAX_DIGITS
212c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson   should satisfy MAX_DIGITS + 400 < MAX_ABS_EXP; that ensures that the
213c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson   exponent clipping in _Py_dg_strtod can't affect the value of the output. */
214c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson#ifndef MAX_DIGITS
215c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson#define MAX_DIGITS 1000000000U
216c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson#endif
217c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson
218c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson/* Guard against trying to use the above values on unusual platforms with ints
219c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson * of width less than 32 bits. */
220c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson#if MAX_ABS_EXP > INT_MAX
221c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson#error "MAX_ABS_EXP should fit in an int"
222c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson#endif
223c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson#if MAX_DIGITS > INT_MAX
224c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson#error "MAX_DIGITS should fit in an int"
2250ca7452794bef03b66f56cc996a73cac066d0ec1Mark Dickinson#endif
2260ca7452794bef03b66f56cc996a73cac066d0ec1Mark Dickinson
227bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* The following definition of Storeinc is appropriate for MIPS processors.
228bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * An alternative that might be better on some machines is
229bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
230bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson */
231bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#if defined(IEEE_8087)
232bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b,  \
233bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                         ((unsigned short *)a)[0] = (unsigned short)c, a++)
234bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
235bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b,  \
236bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                         ((unsigned short *)a)[1] = (unsigned short)c, a++)
237bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
238bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
239bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* #define P DBL_MANT_DIG */
240bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Ten_pmax = floor(P*log(2)/log(5)) */
241bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
242bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
243bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
244bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
245bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_shift  20
246bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_shift1 20
247bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_msk1    0x100000
248bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_msk11   0x100000
249bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_mask  0x7ff00000
250bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define P 53
251bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Nbits 53
252bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Bias 1023
253bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Emax 1023
254bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Emin (-1022)
255adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson#define Etiny (-1074)  /* smallest denormal is 2**Etiny */
256bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_1  0x3ff00000
257bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Exp_11 0x3ff00000
258bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Ebits 11
259bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Frac_mask  0xfffff
260bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Frac_mask1 0xfffff
261bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Ten_pmax 22
262bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Bletch 0x10
263bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Bndry_mask  0xfffff
264bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Bndry_mask1 0xfffff
265bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Sign_bit 0x80000000
266bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Log2P 1
267bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Tiny0 0
268bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Tiny1 1
269bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Quick_max 14
270bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Int_max 14
271bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
272bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifndef Flt_Rounds
273bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef FLT_ROUNDS
274bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Flt_Rounds FLT_ROUNDS
275bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
276bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Flt_Rounds 1
277bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
278bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif /*Flt_Rounds*/
279bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
280bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Rounding Flt_Rounds
281bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
282bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
283bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Big1 0xffffffff
284bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
285bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* struct BCinfo is used to pass information from _Py_dg_strtod to bigcomp */
286bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
287bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsontypedef struct BCinfo BCinfo;
288bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstruct
289bb28285ea2f01e97a26bc595d49da43fbee62913Mark DickinsonBCinfo {
2904141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    int e0, nd, nd0, scale;
291bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson};
292bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
293bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define FFFFFFFF 0xffffffffUL
294bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
295bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Kmax 7
296bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
297bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* struct Bigint is used to represent arbitrary-precision integers.  These
298bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   integers are stored in sign-magnitude format, with the magnitude stored as
299bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   an array of base 2**32 digits.  Bigints are always normalized: if x is a
300bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   Bigint then x->wds >= 1, and either x->wds == 1 or x[wds-1] is nonzero.
301bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
302bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   The Bigint fields are as follows:
303bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
304bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     - next is a header used by Balloc and Bfree to keep track of lists
305bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         of freed Bigints;  it's also used for the linked list of
306bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         powers of 5 of the form 5**2**i used by pow5mult.
307bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     - k indicates which pool this Bigint was allocated from
308bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     - maxwds is the maximum number of words space was allocated for
309bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       (usually maxwds == 2**k)
310bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     - sign is 1 for negative Bigints, 0 for positive.  The sign is unused
311bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       (ignored on inputs, set to 0 on outputs) in almost all operations
312bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       involving Bigints: a notable exception is the diff function, which
313bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       ignores signs on inputs but sets the sign of the output correctly.
314bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     - wds is the actual number of significant words
315bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     - x contains the vector of words (digits) for this Bigint, from least
316bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       significant (x[0]) to most significant (x[wds-1]).
317bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson*/
318bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
319bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstruct
320bb28285ea2f01e97a26bc595d49da43fbee62913Mark DickinsonBigint {
321bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    struct Bigint *next;
322bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int k, maxwds, sign, wds;
323bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong x[1];
324bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson};
325bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
326bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsontypedef struct Bigint Bigint;
327bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
3289481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson#ifndef Py_USING_MEMORY_DEBUGGER
3299481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
330bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Memory management: memory is allocated from, and returned to, Kmax+1 pools
331bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   of memory, where pool k (0 <= k <= Kmax) is for Bigints b with b->maxwds ==
332bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   1 << k.  These pools are maintained as linked lists, with freelist[k]
333bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   pointing to the head of the list for pool k.
334bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
335bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   On allocation, if there's no free slot in the appropriate pool, MALLOC is
336bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   called to get more memory.  This memory is not returned to the system until
337bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   Python quits.  There's also a private memory pool that's allocated from
338bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   in preference to using MALLOC.
339bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
340bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   For Bigints with more than (1 << Kmax) digits (which implies at least 1233
341bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   decimal digits), memory is directly allocated using MALLOC, and freed using
342bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   FREE.
343bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
344bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   XXX: it would be easy to bypass this memory-management system and
345bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   translate each call to Balloc into a call to PyMem_Malloc, and each
346bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   Bfree to PyMem_Free.  Investigate whether this has any significant
347bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   performance on impact. */
348bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
349bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *freelist[Kmax+1];
350bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
351bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Allocate space for a Bigint with up to 1<<k digits */
352bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
353bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
354bb28285ea2f01e97a26bc595d49da43fbee62913Mark DickinsonBalloc(int k)
355bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
356bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int x;
357bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *rv;
358bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    unsigned int len;
359bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
360bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k <= Kmax && (rv = freelist[k]))
361bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        freelist[k] = rv->next;
362bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
363bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x = 1 << k;
364bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
365bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /sizeof(double);
366bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {
367bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            rv = (Bigint*)pmem_next;
368bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            pmem_next += len;
369bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
370bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
371bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            rv = (Bigint*)MALLOC(len*sizeof(double));
372bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (rv == NULL)
373bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                return NULL;
374bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
375bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        rv->k = k;
376bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        rv->maxwds = x;
377bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
378bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    rv->sign = rv->wds = 0;
379bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return rv;
380bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
381bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
382bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Free a Bigint allocated with Balloc */
383bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
384bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic void
385bb28285ea2f01e97a26bc595d49da43fbee62913Mark DickinsonBfree(Bigint *v)
386bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
387bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (v) {
388bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (v->k > Kmax)
389bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            FREE((void*)v);
390bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
391bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            v->next = freelist[v->k];
392bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            freelist[v->k] = v;
393bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
394bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
395bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
396bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
3979481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson#else
3989481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
3999481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson/* Alternative versions of Balloc and Bfree that use PyMem_Malloc and
4009481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson   PyMem_Free directly in place of the custom memory allocation scheme above.
4019481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson   These are provided for the benefit of memory debugging tools like
4029481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson   Valgrind. */
4039481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
4049481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson/* Allocate space for a Bigint with up to 1<<k digits */
4059481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
4069481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinsonstatic Bigint *
4079481c576cd5e820f2a23b57481366f37df3dbbf9Mark DickinsonBalloc(int k)
4089481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson{
4099481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    int x;
4109481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    Bigint *rv;
4119481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    unsigned int len;
4129481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
4139481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    x = 1 << k;
4149481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
4159481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        /sizeof(double);
4169481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
4179481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    rv = (Bigint*)MALLOC(len*sizeof(double));
4189481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    if (rv == NULL)
4199481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        return NULL;
4209481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
4219481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    rv->k = k;
4229481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    rv->maxwds = x;
4239481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    rv->sign = rv->wds = 0;
4249481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    return rv;
4259481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson}
4269481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
4279481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson/* Free a Bigint allocated with Balloc */
4289481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
4299481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinsonstatic void
4309481c576cd5e820f2a23b57481366f37df3dbbf9Mark DickinsonBfree(Bigint *v)
4319481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson{
4329481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    if (v) {
4339481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        FREE((void*)v);
4349481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    }
4359481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson}
4369481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
4379481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson#endif /* Py_USING_MEMORY_DEBUGGER */
4389481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
439bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign,   \
440bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                          y->wds*sizeof(Long) + 2*sizeof(int))
441bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
442bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Multiply a Bigint b by m and add a.  Either modifies b in place and returns
443bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   a pointer to the modified b, or Bfrees b and returns a pointer to a copy.
444bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   On failure, return NULL.  In this case, b will have been already freed. */
445bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
446bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
447bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonmultadd(Bigint *b, int m, int a)       /* multiply by m and add a */
448bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
449bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i, wds;
450bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
451bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *x;
452bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULLong carry, y;
453bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
454bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong carry, *x, y;
455bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong xi, z;
456bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
457bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b1;
458bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
459bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    wds = b->wds;
460bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    x = b->x;
461bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    i = 0;
462bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    carry = a;
463bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    do {
464bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
465bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = *x * (ULLong)m + carry;
466bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        carry = y >> 32;
467bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *x++ = (ULong)(y & FFFFFFFF);
468bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
469bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        xi = *x;
470bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = (xi & 0xffff) * m + carry;
471bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        z = (xi >> 16) * m + (y >> 16);
472bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        carry = z >> 16;
473bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *x++ = (z << 16) + (y & 0xffff);
474bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
475bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
476bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while(++i < wds);
477bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (carry) {
478bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (wds >= b->maxwds) {
479bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b1 = Balloc(b->k+1);
480bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (b1 == NULL){
481bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(b);
482bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                return NULL;
483bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
484bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bcopy(b1, b);
485bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(b);
486bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b = b1;
487bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
488bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b->x[wds++] = (ULong)carry;
489bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b->wds = wds;
490bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
491bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return b;
492bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
493bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
494bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* convert a string s containing nd decimal digits (possibly containing a
495bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   decimal separator at position nd0, which is ignored) to a Bigint.  This
496bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   function carries on where the parsing code in _Py_dg_strtod leaves off: on
497bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   entry, y9 contains the result of converting the first 9 digits.  Returns
498bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   NULL on failure. */
499bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
500bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
501d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinsons2b(const char *s, int nd0, int nd, ULong y9)
502bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
503bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b;
504bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i, k;
505bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Long x, y;
506bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
507bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    x = (nd + 8) / 9;
508bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(k = 0, y = 1; x > y; y <<= 1, k++) ;
509bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b = Balloc(k);
510bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b == NULL)
511bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
512bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b->x[0] = y9;
513bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b->wds = 1;
514bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
515d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson    if (nd <= 9)
516d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson      return b;
517d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson
518d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson    s += 9;
519d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson    for (i = 9; i < nd0; i++) {
520d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson        b = multadd(b, 10, *s++ - '0');
521d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson        if (b == NULL)
522d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson            return NULL;
523bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
524d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson    s++;
525bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(; i < nd; i++) {
526bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = multadd(b, 10, *s++ - '0');
527bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (b == NULL)
528bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return NULL;
529bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
530bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return b;
531bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
532bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
533bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* count leading 0 bits in the 32-bit integer x. */
534bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
535bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic int
536bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonhi0bits(ULong x)
537bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
538bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int k = 0;
539bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
540bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xffff0000)) {
541bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k = 16;
542bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x <<= 16;
543bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
544bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xff000000)) {
545bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 8;
546bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x <<= 8;
547bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
548bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xf0000000)) {
549bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 4;
550bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x <<= 4;
551bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
552bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xc0000000)) {
553bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 2;
554bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x <<= 2;
555bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
556bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0x80000000)) {
557bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k++;
558bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!(x & 0x40000000))
559bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return 32;
560bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
561bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return k;
562bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
563bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
564bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* count trailing 0 bits in the 32-bit integer y, and shift y right by that
565bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   number of bits. */
566bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
567bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic int
568bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonlo0bits(ULong *y)
569bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
570bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int k;
571bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong x = *y;
572bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
573bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (x & 7) {
574bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (x & 1)
575bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return 0;
576bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (x & 2) {
577bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *y = x >> 1;
578bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return 1;
579bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
580bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *y = x >> 2;
581bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return 2;
582bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
583bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k = 0;
584bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xffff)) {
585bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k = 16;
586bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x >>= 16;
587bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
588bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xff)) {
589bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 8;
590bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x >>= 8;
591bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
592bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0xf)) {
593bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 4;
594bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x >>= 4;
595bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
596bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 0x3)) {
597bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 2;
598bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x >>= 2;
599bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
600bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(x & 1)) {
601bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k++;
602bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x >>= 1;
603bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!x)
604bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return 32;
605bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
606bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    *y = x;
607bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return k;
608bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
609bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
610bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* convert a small nonnegative integer to a Bigint */
611bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
612bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
613bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsoni2b(int i)
614bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
615bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b;
616bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
617bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b = Balloc(1);
618bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b == NULL)
619bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
620bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b->x[0] = i;
621bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b->wds = 1;
622bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return b;
623bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
624bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
625bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* multiply two Bigints.  Returns a new Bigint, or NULL on failure.  Ignores
626bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   the signs of a and b. */
627bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
628bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
629bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonmult(Bigint *a, Bigint *b)
630bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
631bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *c;
632bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int k, wa, wb, wc;
633bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
634bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong y;
635bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
636bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULLong carry, z;
637bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
638bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong carry, z;
639bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong z2;
640bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
641bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
642fc5290458d00e3eebf82dd914fd2848b7e3f7e87Mark Dickinson    if ((!a->x[0] && a->wds == 1) || (!b->x[0] && b->wds == 1)) {
643fc5290458d00e3eebf82dd914fd2848b7e3f7e87Mark Dickinson        c = Balloc(0);
644fc5290458d00e3eebf82dd914fd2848b7e3f7e87Mark Dickinson        if (c == NULL)
645fc5290458d00e3eebf82dd914fd2848b7e3f7e87Mark Dickinson            return NULL;
646fc5290458d00e3eebf82dd914fd2848b7e3f7e87Mark Dickinson        c->wds = 1;
647fc5290458d00e3eebf82dd914fd2848b7e3f7e87Mark Dickinson        c->x[0] = 0;
648fc5290458d00e3eebf82dd914fd2848b7e3f7e87Mark Dickinson        return c;
649fc5290458d00e3eebf82dd914fd2848b7e3f7e87Mark Dickinson    }
650fc5290458d00e3eebf82dd914fd2848b7e3f7e87Mark Dickinson
651bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (a->wds < b->wds) {
652bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        c = a;
653bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        a = b;
654bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = c;
655bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
656bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k = a->k;
657bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    wa = a->wds;
658bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    wb = b->wds;
659bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    wc = wa + wb;
660bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (wc > a->maxwds)
661bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k++;
662bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    c = Balloc(k);
663bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (c == NULL)
664bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
665bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(x = c->x, xa = x + wc; x < xa; x++)
666bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *x = 0;
667bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xa = a->x;
668bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xae = xa + wa;
669bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xb = b->x;
670bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xbe = xb + wb;
671bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xc0 = c->x;
672bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
673bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(; xb < xbe; xc0++) {
674bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if ((y = *xb++)) {
675bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            x = xa;
676bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            xc = xc0;
677bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = 0;
678bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            do {
679bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                z = *x++ * (ULLong)y + *xc + carry;
680bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                carry = z >> 32;
681bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *xc++ = (ULong)(z & FFFFFFFF);
682bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
683bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            while(x < xae);
684bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *xc = (ULong)carry;
685bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
686bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
687bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
688bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(; xb < xbe; xb++, xc0++) {
689bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (y = *xb & 0xffff) {
690bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            x = xa;
691bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            xc = xc0;
692bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = 0;
693bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            do {
694bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
695bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                carry = z >> 16;
696bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
697bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                carry = z2 >> 16;
698bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Storeinc(xc, z2, z);
699bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
700bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            while(x < xae);
701bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *xc = carry;
702bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
703bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (y = *xb >> 16) {
704bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            x = xa;
705bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            xc = xc0;
706bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = 0;
707bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            z2 = *xc;
708bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            do {
709bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                z = (*x & 0xffff) * y + (*xc >> 16) + carry;
710bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                carry = z >> 16;
711bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Storeinc(xc, z, z2);
712bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
713bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                carry = z2 >> 16;
714bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
715bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            while(x < xae);
716bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *xc = z2;
717bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
718bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
719bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
720bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
721bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    c->wds = wc;
722bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return c;
723bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
724bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
7259481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson#ifndef Py_USING_MEMORY_DEBUGGER
7269481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
727bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* p5s is a linked list of powers of 5 of the form 5**(2**i), i >= 2 */
728bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
729bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *p5s;
730bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
731bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* multiply the Bigint b by 5**k.  Returns a pointer to the result, or NULL on
732bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   failure; if the returned pointer is distinct from b then the original
733bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   Bigint b will have been Bfree'd.   Ignores the sign of b. */
734bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
735bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
736bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonpow5mult(Bigint *b, int k)
737bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
738bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b1, *p5, *p51;
739bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i;
740bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    static int p05[3] = { 5, 25, 125 };
741bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
742bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((i = k & 3)) {
743bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = multadd(b, p05[i-1], 0);
744bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (b == NULL)
745bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return NULL;
746bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
747bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
748bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!(k >>= 2))
749bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return b;
750bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    p5 = p5s;
751bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!p5) {
752bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* first time */
753bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        p5 = i2b(625);
754bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (p5 == NULL) {
755bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(b);
756bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return NULL;
757bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
758bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        p5s = p5;
759bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        p5->next = 0;
760bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
761bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(;;) {
762bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (k & 1) {
763bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b1 = mult(b, p5);
764bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(b);
765bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b = b1;
766bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (b == NULL)
767bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                return NULL;
768bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
769bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!(k >>= 1))
770bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            break;
771bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        p51 = p5->next;
772bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!p51) {
773bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            p51 = mult(p5,p5);
774bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (p51 == NULL) {
775bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(b);
776bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                return NULL;
777bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
778bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            p51->next = 0;
779bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            p5->next = p51;
780bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
781bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        p5 = p51;
782bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
783bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return b;
784bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
785bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
7869481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson#else
7879481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
7889481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson/* Version of pow5mult that doesn't cache powers of 5. Provided for
7899481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson   the benefit of memory debugging tools like Valgrind. */
7909481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
7919481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinsonstatic Bigint *
7929481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinsonpow5mult(Bigint *b, int k)
7939481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson{
7949481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    Bigint *b1, *p5, *p51;
7959481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    int i;
7969481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    static int p05[3] = { 5, 25, 125 };
7979481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
7989481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    if ((i = k & 3)) {
7999481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        b = multadd(b, p05[i-1], 0);
8009481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        if (b == NULL)
8019481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            return NULL;
8029481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    }
8039481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
8049481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    if (!(k >>= 2))
8059481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        return b;
8069481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    p5 = i2b(625);
8079481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    if (p5 == NULL) {
8089481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        Bfree(b);
8099481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        return NULL;
8109481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    }
8119481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
8129481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    for(;;) {
8139481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        if (k & 1) {
8149481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            b1 = mult(b, p5);
8159481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            Bfree(b);
8169481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            b = b1;
8179481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            if (b == NULL) {
8189481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson                Bfree(p5);
8199481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson                return NULL;
8209481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            }
8219481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        }
8229481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        if (!(k >>= 1))
8239481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            break;
8249481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        p51 = mult(p5, p5);
8259481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        Bfree(p5);
8269481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        p5 = p51;
8279481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        if (p5 == NULL) {
8289481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            Bfree(b);
8299481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson            return NULL;
8309481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson        }
8319481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    }
8329481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    Bfree(p5);
8339481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson    return b;
8349481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson}
8359481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
8369481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson#endif /* Py_USING_MEMORY_DEBUGGER */
8379481c576cd5e820f2a23b57481366f37df3dbbf9Mark Dickinson
838bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* shift a Bigint b left by k bits.  Return a pointer to the shifted result,
839bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   or NULL on failure.  If the returned pointer is distinct from b then the
840bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   original b will have been Bfree'd.   Ignores the sign of b. */
841bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
842bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
843bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonlshift(Bigint *b, int k)
844bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
845bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i, k1, n, n1;
846bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b1;
847bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *x, *x1, *xe, z;
848bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
849fc5290458d00e3eebf82dd914fd2848b7e3f7e87Mark Dickinson    if (!k || (!b->x[0] && b->wds == 1))
850fc5290458d00e3eebf82dd914fd2848b7e3f7e87Mark Dickinson        return b;
851fc5290458d00e3eebf82dd914fd2848b7e3f7e87Mark Dickinson
852bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    n = k >> 5;
853bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k1 = b->k;
854bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    n1 = n + b->wds + 1;
855bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(i = b->maxwds; n1 > i; i <<= 1)
856bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k1++;
857bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b1 = Balloc(k1);
858bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b1 == NULL) {
859bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(b);
860bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
861bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
862bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    x1 = b1->x;
863bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(i = 0; i < n; i++)
864bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *x1++ = 0;
865bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    x = b->x;
866bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xe = x + b->wds;
867bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k &= 0x1f) {
868bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k1 = 32 - k;
869bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        z = 0;
870bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        do {
871bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *x1++ = *x << k | z;
872bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            z = *x++ >> k1;
873bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
874bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        while(x < xe);
875bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if ((*x1 = z))
876bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ++n1;
877bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
878bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else do
879bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             *x1++ = *x++;
880bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        while(x < xe);
881bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b1->wds = n1 - 1;
882bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(b);
883bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return b1;
884bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
885bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
886bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Do a three-way compare of a and b, returning -1 if a < b, 0 if a == b and
887bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   1 if a > b.  Ignores signs of a and b. */
888bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
889bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic int
890bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsoncmp(Bigint *a, Bigint *b)
891bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
892bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *xa, *xa0, *xb, *xb0;
893bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i, j;
894bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
895bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    i = a->wds;
896bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    j = b->wds;
897bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef DEBUG
898bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (i > 1 && !a->x[i-1])
899bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bug("cmp called with a->x[a->wds-1] == 0");
900bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (j > 1 && !b->x[j-1])
901bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bug("cmp called with b->x[b->wds-1] == 0");
902bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
903bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (i -= j)
904bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return i;
905bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xa0 = a->x;
906bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xa = xa0 + j;
907bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xb0 = b->x;
908bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xb = xb0 + j;
909bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(;;) {
910bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (*--xa != *--xb)
911bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return *xa < *xb ? -1 : 1;
912bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (xa <= xa0)
913bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            break;
914bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
915bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return 0;
916bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
917bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
918bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Take the difference of Bigints a and b, returning a new Bigint.  Returns
919bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   NULL on failure.  The signs of a and b are ignored, but the sign of the
920bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   result is set appropriately. */
921bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
922bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
923bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsondiff(Bigint *a, Bigint *b)
924bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
925bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *c;
926bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i, wa, wb;
927bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *xa, *xae, *xb, *xbe, *xc;
928bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
929bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULLong borrow, y;
930bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
931bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong borrow, y;
932bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong z;
933bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
934bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
935bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    i = cmp(a,b);
936bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!i) {
937bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        c = Balloc(0);
938bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (c == NULL)
939bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return NULL;
940bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        c->wds = 1;
941bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        c->x[0] = 0;
942bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return c;
943bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
944bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (i < 0) {
945bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        c = a;
946bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        a = b;
947bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = c;
948bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = 1;
949bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
950bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else
951bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = 0;
952bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    c = Balloc(a->k);
953bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (c == NULL)
954bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
955bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    c->sign = i;
956bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    wa = a->wds;
957bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xa = a->x;
958bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xae = xa + wa;
959bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    wb = b->wds;
960bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xb = b->x;
961bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xbe = xb + wb;
962bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xc = c->x;
963bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    borrow = 0;
964bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
965bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    do {
966bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = (ULLong)*xa++ - *xb++ - borrow;
967bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = y >> 32 & (ULong)1;
968bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *xc++ = (ULong)(y & FFFFFFFF);
969bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
970bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while(xb < xbe);
971bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while(xa < xae) {
972bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = *xa++ - borrow;
973bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = y >> 32 & (ULong)1;
974bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *xc++ = (ULong)(y & FFFFFFFF);
975bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
976bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
977bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    do {
978bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
979bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = (y & 0x10000) >> 16;
980bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
981bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = (z & 0x10000) >> 16;
982bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Storeinc(xc, z, y);
983bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
984bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while(xb < xbe);
985bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while(xa < xae) {
986bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = (*xa & 0xffff) - borrow;
987bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = (y & 0x10000) >> 16;
988bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        z = (*xa++ >> 16) - borrow;
989bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = (z & 0x10000) >> 16;
990bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Storeinc(xc, z, y);
991bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
992bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
993bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while(!*--xc)
994bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        wa--;
995bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    c->wds = wa;
996bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return c;
997bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
998bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
9994141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson/* Given a positive normal double x, return the difference between x and the
10004141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson   next double up.  Doesn't give correct results for subnormals. */
1001bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1002bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic double
1003bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonulp(U *x)
1004bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
1005bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Long L;
1006bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    U u;
1007bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1008bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
1009bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    word0(&u) = L;
1010bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    word1(&u) = 0;
1011bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return dval(&u);
1012bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
1013bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1014bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Convert a Bigint to a double plus an exponent */
1015bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1016bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic double
1017bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonb2d(Bigint *a, int *e)
1018bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
1019bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *xa, *xa0, w, y, z;
1020bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int k;
1021bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    U d;
1022bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1023bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xa0 = a->x;
1024bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    xa = xa0 + a->wds;
1025bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    y = *--xa;
1026bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef DEBUG
1027bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!y) Bug("zero y in b2d");
1028bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
1029bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k = hi0bits(y);
1030bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    *e = 32 - k;
1031bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k < Ebits) {
1032bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&d) = Exp_1 | y >> (Ebits - k);
1033bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        w = xa > xa0 ? *--xa : 0;
1034bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word1(&d) = y << ((32-Ebits) + k) | w >> (Ebits - k);
1035bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto ret_d;
1036bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1037bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    z = xa > xa0 ? *--xa : 0;
1038bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k -= Ebits) {
1039bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&d) = Exp_1 | y << k | z >> (32 - k);
1040bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = xa > xa0 ? *--xa : 0;
1041bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word1(&d) = z << k | y >> (32 - k);
1042bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1043bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
1044bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&d) = Exp_1 | y;
1045bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word1(&d) = z;
1046bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1047bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson  ret_d:
1048bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return dval(&d);
1049bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
1050bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1051adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson/* Convert a scaled double to a Bigint plus an exponent.  Similar to d2b,
1052adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson   except that it accepts the scale parameter used in _Py_dg_strtod (which
1053adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson   should be either 0 or 2*P), and the normalization for the return value is
1054adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson   different (see below).  On input, d should be finite and nonnegative, and d
1055adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson   / 2**scale should be exactly representable as an IEEE 754 double.
1056adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
1057adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson   Returns a Bigint b and an integer e such that
1058adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
1059adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson     dval(d) / 2**scale = b * 2**e.
1060adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
1061adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson   Unlike d2b, b is not necessarily odd: b and e are normalized so
1062adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson   that either 2**(P-1) <= b < 2**P and e >= Etiny, or b < 2**P
1063adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson   and e == Etiny.  This applies equally to an input of 0.0: in that
1064adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson   case the return values are b = 0 and e = Etiny.
1065adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
1066adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson   The above normalization ensures that for all possible inputs d,
1067adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson   2**e gives ulp(d/2**scale).
1068adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
1069adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson   Returns NULL on failure.
1070adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson*/
1071adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
1072adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinsonstatic Bigint *
1073adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinsonsd2b(U *d, int scale, int *e)
1074adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson{
1075adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    Bigint *b;
1076adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
1077adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    b = Balloc(1);
1078adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    if (b == NULL)
1079adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        return NULL;
1080adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
1081adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    /* First construct b and e assuming that scale == 0. */
1082adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    b->wds = 2;
1083adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    b->x[0] = word1(d);
1084adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    b->x[1] = word0(d) & Frac_mask;
1085adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    *e = Etiny - 1 + (int)((word0(d) & Exp_mask) >> Exp_shift);
1086adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    if (*e < Etiny)
1087adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        *e = Etiny;
1088adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    else
1089adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        b->x[1] |= Exp_msk1;
1090adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
1091adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    /* Now adjust for scale, provided that b != 0. */
1092adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    if (scale && (b->x[0] || b->x[1])) {
1093adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        *e -= scale;
1094adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        if (*e < Etiny) {
1095adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson            scale = Etiny - *e;
1096adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson            *e = Etiny;
1097adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson            /* We can't shift more than P-1 bits without shifting out a 1. */
1098adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson            assert(0 < scale && scale <= P - 1);
1099adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson            if (scale >= 32) {
1100adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson                /* The bits shifted out should all be zero. */
1101adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson                assert(b->x[0] == 0);
1102adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson                b->x[0] = b->x[1];
1103adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson                b->x[1] = 0;
1104adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson                scale -= 32;
1105adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson            }
1106adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson            if (scale) {
1107adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson                /* The bits shifted out should all be zero. */
1108adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson                assert(b->x[0] << (32 - scale) == 0);
1109adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson                b->x[0] = (b->x[0] >> scale) | (b->x[1] << (32 - scale));
1110adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson                b->x[1] >>= scale;
1111adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson            }
1112adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        }
1113adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    }
1114adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    /* Ensure b is normalized. */
1115adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    if (!b->x[1])
1116adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        b->wds = 1;
1117adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
1118adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    return b;
1119adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson}
1120adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
1121bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Convert a double to a Bigint plus an exponent.  Return NULL on failure.
1122bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1123bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   Given a finite nonzero double d, return an odd Bigint b and exponent *e
1124bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   such that fabs(d) = b * 2**e.  On return, *bbits gives the number of
11252bcd17727027b6c923340209f8c6b92e34c69556Mark Dickinson   significant bits of b; that is, 2**(*bbits-1) <= b < 2**(*bbits).
1126bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1127bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   If d is zero, then b == 0, *e == -1010, *bbits = 0.
1128bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson */
1129bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1130bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic Bigint *
1131bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsond2b(U *d, int *e, int *bits)
1132bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
1133bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b;
1134bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int de, k;
1135bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *x, y, z;
1136bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int i;
1137bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1138bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b = Balloc(1);
1139bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b == NULL)
1140bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
1141bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    x = b->x;
1142bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1143bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    z = word0(d) & Frac_mask;
1144bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    word0(d) &= 0x7fffffff;   /* clear sign bit, which we ignore */
1145bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((de = (int)(word0(d) >> Exp_shift)))
1146bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        z |= Exp_msk1;
1147bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((y = word1(d))) {
1148bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if ((k = lo0bits(&y))) {
1149bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            x[0] = y | z << (32 - k);
1150bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            z >>= k;
1151bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1152bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else
1153bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            x[0] = y;
1154bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i =
1155bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b->wds = (x[1] = z) ? 2 : 1;
1156bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1157bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
1158bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k = lo0bits(&z);
1159bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x[0] = z;
1160bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i =
1161bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b->wds = 1;
1162bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k += 32;
1163bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1164bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (de) {
1165bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *e = de - Bias - (P-1) + k;
1166bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *bits = P - k;
1167bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1168bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
1169bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *e = de - Bias - (P-1) + 1 + k;
1170bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *bits = 32*i - hi0bits(x[i-1]);
1171bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1172bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return b;
1173bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
1174bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1175bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Compute the ratio of two Bigints, as a double.  The result may have an
1176bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   error of up to 2.5 ulps. */
1177bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1178bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic double
1179bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonratio(Bigint *a, Bigint *b)
1180bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
1181bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    U da, db;
1182bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int k, ka, kb;
1183bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1184bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    dval(&da) = b2d(a, &ka);
1185bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    dval(&db) = b2d(b, &kb);
1186bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k = ka - kb + 32*(a->wds - b->wds);
1187bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k > 0)
1188bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&da) += k*Exp_msk1;
1189bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
1190bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k = -k;
1191bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&db) += k*Exp_msk1;
1192bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1193bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return dval(&da) / dval(&db);
1194bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
1195bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1196bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic const double
1197bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsontens[] = {
1198bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1199bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1200bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    1e20, 1e21, 1e22
1201bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson};
1202bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1203bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic const double
1204bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonbigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
1205bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
1206bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                                   9007199254740992.*9007199254740992.e-256
1207bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                                   /* = 2^106 * 1e-256 */
1208bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson};
1209bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */
1210bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* flag unnecessarily.  It leads to a song and dance at the end of strtod. */
1211bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define Scale_Bit 0x10
1212bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define n_bigtens 5
1213bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1214bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define ULbits 32
1215bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define kshift 5
1216bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define kmask 31
1217bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1218bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1219bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic int
1220bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsondshift(Bigint *b, int p2)
1221bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
1222bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int rv = hi0bits(b->x[b->wds-1]) - 4;
1223bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (p2 > 0)
1224bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        rv -= p2;
1225bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return rv & kmask;
1226bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
1227bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1228bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* special case of Bigint division.  The quotient is always in the range 0 <=
1229bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   quotient < 10, and on entry the divisor S is normalized so that its top 4
1230bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   bits (28--31) are zero and bit 27 is set. */
1231bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1232bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic int
1233bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonquorem(Bigint *b, Bigint *S)
1234bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
1235bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int n;
1236bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong *bx, *bxe, q, *sx, *sxe;
1237bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
1238bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULLong borrow, carry, y, ys;
1239bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
1240bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong borrow, carry, y, ys;
1241bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong si, z, zs;
1242bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
1243bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1244bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    n = S->wds;
1245bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef DEBUG
1246bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /*debug*/ if (b->wds > n)
1247bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /*debug*/       Bug("oversize b in quorem");
1248bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
1249bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b->wds < n)
1250bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return 0;
1251bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    sx = S->x;
1252bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    sxe = sx + --n;
1253bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    bx = b->x;
1254bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    bxe = bx + n;
1255bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    q = *bxe / (*sxe + 1);      /* ensure q <= true quotient */
1256bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef DEBUG
1257bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /*debug*/ if (q > 9)
1258bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /*debug*/       Bug("oversized quotient in quorem");
1259bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
1260bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (q) {
1261bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = 0;
1262bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        carry = 0;
1263bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        do {
1264bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
1265bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ys = *sx++ * (ULLong)q + carry;
1266bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = ys >> 32;
1267bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            y = *bx - (ys & FFFFFFFF) - borrow;
1268bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            borrow = y >> 32 & (ULong)1;
1269bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *bx++ = (ULong)(y & FFFFFFFF);
1270bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
1271bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            si = *sx++;
1272bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ys = (si & 0xffff) * q + carry;
1273bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            zs = (si >> 16) * q + (ys >> 16);
1274bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = zs >> 16;
1275bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
1276bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            borrow = (y & 0x10000) >> 16;
1277bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            z = (*bx >> 16) - (zs & 0xffff) - borrow;
1278bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            borrow = (z & 0x10000) >> 16;
1279bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Storeinc(bx, z, y);
1280bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
1281bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1282bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        while(sx <= sxe);
1283bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!*bxe) {
1284bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bx = b->x;
1285bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            while(--bxe > bx && !*bxe)
1286bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                --n;
1287bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b->wds = n;
1288bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1289bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1290bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (cmp(b, S) >= 0) {
1291bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        q++;
1292bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        borrow = 0;
1293bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        carry = 0;
1294bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bx = b->x;
1295bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        sx = S->x;
1296bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        do {
1297bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef ULLong
1298bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ys = *sx++ + carry;
1299bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = ys >> 32;
1300bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            y = *bx - (ys & FFFFFFFF) - borrow;
1301bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            borrow = y >> 32 & (ULong)1;
1302bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *bx++ = (ULong)(y & FFFFFFFF);
1303bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#else
1304bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            si = *sx++;
1305bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ys = (si & 0xffff) + carry;
1306bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            zs = (si >> 16) + (ys >> 16);
1307bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            carry = zs >> 16;
1308bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
1309bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            borrow = (y & 0x10000) >> 16;
1310bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            z = (*bx >> 16) - (zs & 0xffff) - borrow;
1311bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            borrow = (z & 0x10000) >> 16;
1312bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Storeinc(bx, z, y);
1313bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
1314bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1315bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        while(sx <= sxe);
1316bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bx = b->x;
1317bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bxe = bx + n;
1318bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!*bxe) {
1319bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            while(--bxe > bx && !*bxe)
1320bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                --n;
1321bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b->wds = n;
1322bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1323bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1324bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return q;
1325bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
1326bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
13275818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson/* sulp(x) is a version of ulp(x) that takes bc.scale into account.
13285ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson
13295818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson   Assuming that x is finite and nonnegative (positive zero is fine
13305818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson   here) and x / 2^bc.scale is exactly representable as a double,
13315818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson   sulp(x) is equivalent to 2^bc.scale * ulp(x / 2^bc.scale). */
13325ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson
13335ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinsonstatic double
13345ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinsonsulp(U *x, BCinfo *bc)
13355ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson{
13365ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson    U u;
13375ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson
133802139d74bae1a77bbe4ad528762e1620486e3e36Mark Dickinson    if (bc->scale && 2*P + 1 > (int)((word0(x) & Exp_mask) >> Exp_shift)) {
13395ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson        /* rv/2^bc->scale is subnormal */
13405ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson        word0(&u) = (P+2)*Exp_msk1;
13415ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson        word1(&u) = 0;
13425ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson        return u.d;
13435ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson    }
13445818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson    else {
13455818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson        assert(word0(x) || word1(x)); /* x != 0.0 */
13465ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson        return ulp(x);
13475818e0125395b88b5e3c69dacdb50d5562628cd2Mark Dickinson    }
13485ff4f279e6342bf142de22c91662b8eb70ce722aMark Dickinson}
1349bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1350b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson/* The bigcomp function handles some hard cases for strtod, for inputs
1351b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   with more than STRTOD_DIGLIM digits.  It's called once an initial
1352b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   estimate for the double corresponding to the input string has
1353b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   already been obtained by the code in _Py_dg_strtod.
1354b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1355b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   The bigcomp function is only called after _Py_dg_strtod has found a
1356b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   double value rv such that either rv or rv + 1ulp represents the
1357b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   correctly rounded value corresponding to the original string.  It
1358b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   determines which of these two values is the correct one by
1359b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   computing the decimal digits of rv + 0.5ulp and comparing them with
13606e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson   the corresponding digits of s0.
1361b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1362b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   In the following, write dv for the absolute value of the number represented
1363b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   by the input string.
1364b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1365b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   Inputs:
1366b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1367b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson     s0 points to the first significant digit of the input string.
1368b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1369b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson     rv is a (possibly scaled) estimate for the closest double value to the
1370b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        value represented by the original input to _Py_dg_strtod.  If
1371b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        bc->scale is nonzero, then rv/2^(bc->scale) is the approximation to
1372b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        the input value.
1373b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1374b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson     bc is a struct containing information gathered during the parsing and
1375b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        estimation steps of _Py_dg_strtod.  Description of fields follows:
1376b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1377b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        bc->e0 gives the exponent of the input value, such that dv = (integer
1378b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson           given by the bd->nd digits of s0) * 10**e0
1379b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1380d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson        bc->nd gives the total number of significant digits of s0.  It will
1381d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson           be at least 1.
1382b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1383b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        bc->nd0 gives the number of significant digits of s0 before the
1384b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson           decimal separator.  If there's no decimal separator, bc->nd0 ==
1385b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson           bc->nd.
1386b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1387b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson        bc->scale is the value used to scale rv to avoid doing arithmetic with
1388b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson           subnormal values.  It's either 0 or 2*P (=106).
1389b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1390b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson   Outputs:
1391b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1392b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson     On successful exit, rv/2^(bc->scale) is the closest double to dv.
1393b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson
1394b26d56ac18df454e373e01a405a622d412d5bd53Mark Dickinson     Returns 0 on success, -1 on failure (e.g., due to a failed malloc call). */
1395bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1396bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic int
1397bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonbigcomp(U *rv, const char *s0, BCinfo *bc)
1398bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
1399bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b, *d;
1400adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    int b2, d2, dd, i, nd, nd0, odd, p2, p5;
1401bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1402bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    nd = bc->nd;
1403bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    nd0 = bc->nd0;
14048efef5ce9f6c0dfd2cb4720b61a37bbdfdb5e30eMark Dickinson    p5 = nd + bc->e0;
1405adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    b = sd2b(rv, bc->scale, &p2);
14066e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson    if (b == NULL)
14076e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson        return -1;
1408adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
140950b60c612e7eca3f815d362190ddb80a21a6d820Mark Dickinson    /* record whether the lsb of rv/2^(bc->scale) is odd:  in the exact halfway
141050b60c612e7eca3f815d362190ddb80a21a6d820Mark Dickinson       case, this is used for round to even. */
1411adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    odd = b->x[0] & 1;
1412adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
1413adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    /* left shift b by 1 bit and or a 1 into the least significant bit;
1414adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson       this gives us b * 2**p2 = rv/2^(bc->scale) + 0.5 ulp. */
1415adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    b = lshift(b, 1);
1416adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    if (b == NULL)
1417adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        return -1;
14186e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson    b->x[0] |= 1;
1419adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    p2--;
14206e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson
1421adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    p2 -= p5;
1422bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    d = i2b(1);
1423bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (d == NULL) {
1424bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(b);
1425bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return -1;
1426bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1427bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Arrange for convenient computation of quotients:
1428bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     * shift left if necessary so divisor has 4 leading 0 bits.
1429bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     */
1430bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (p5 > 0) {
1431bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        d = pow5mult(d, p5);
1432bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (d == NULL) {
1433bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(b);
1434bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return -1;
1435bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1436bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1437bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else if (p5 < 0) {
1438bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = pow5mult(b, -p5);
1439bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (b == NULL) {
1440bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(d);
1441bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return -1;
1442bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1443bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1444bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (p2 > 0) {
1445bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 = p2;
1446bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        d2 = 0;
1447bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1448bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
1449bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 = 0;
1450bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        d2 = -p2;
1451bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1452bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    i = dshift(d, d2);
1453bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((b2 += i) > 0) {
1454bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = lshift(b, b2);
1455bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (b == NULL) {
1456bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(d);
1457bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return -1;
1458bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1459bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1460bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((d2 += i) > 0) {
1461bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        d = lshift(d, d2);
1462bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (d == NULL) {
1463bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(b);
1464bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return -1;
1465bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1466bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1467bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
14684141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Compare s0 with b/d: set dd to -1, 0, or 1 according as s0 < b/d, s0 ==
14694141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     * b/d, or s0 > b/d.  Here the digits of s0 are thought of as representing
14704141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     * a number in the range [0.1, 1). */
14714141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    if (cmp(b, d) >= 0)
14724141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* b/d >= 1 */
14738efef5ce9f6c0dfd2cb4720b61a37bbdfdb5e30eMark Dickinson        dd = -1;
14744141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    else {
14754141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        i = 0;
14764141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        for(;;) {
14774141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            b = multadd(b, 10, 0);
14784141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (b == NULL) {
14794141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                Bfree(d);
14804141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                return -1;
14814141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            }
14824141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            dd = s0[i < nd0 ? i : i+1] - '0' - quorem(b, d);
14834141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            i++;
148450b60c612e7eca3f815d362190ddb80a21a6d820Mark Dickinson
14854141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (dd)
14864141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                break;
14874141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (!b->x[0] && b->wds == 1) {
14884141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                /* b/d == 0 */
14894141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                dd = i < nd;
14904141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                break;
14914141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            }
14924141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (!(i < nd)) {
14934141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                /* b/d != 0, but digits of s0 exhausted */
14944141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                dd = -1;
14954141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                break;
14964141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            }
1497bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1498bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1499bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(b);
1500bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(d);
150150b60c612e7eca3f815d362190ddb80a21a6d820Mark Dickinson    if (dd > 0 || (dd == 0 && odd))
15026e0d3d67fb67cc80c4570e504890e03c2bc6efdeMark Dickinson        dval(rv) += sulp(rv, bc);
1503bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return 0;
1504bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
1505bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1506bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsondouble
1507bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson_Py_dg_strtod(const char *s00, char **se)
1508bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
1509adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    int bb2, bb5, bbe, bd2, bd5, bs2, c, dsign, e, e1, error;
1510adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson    int esign, i, j, k, lz, nd, nd0, odd, sign;
1511bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    const char *s, *s0, *s1;
1512bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    double aadj, aadj1;
1513bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    U aadj2, adj, rv, rv0;
15144141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    ULong y, z, abs_exp;
151518a818bc63d993c3d3433f69cf2b7d2b9bd63ebfMark Dickinson    Long L;
1516bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    BCinfo bc;
1517bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
1518c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson    size_t ndigits, fraclen;
1519bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1520bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    dval(&rv) = 0.;
15214141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
15224141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Start parsing. */
15234141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    c = *(s = s00);
15244141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
15254141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Parse optional sign, if present. */
15264141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    sign = 0;
15274141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    switch (c) {
15284141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    case '-':
15294141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        sign = 1;
15304141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* no break */
15314141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    case '+':
15324141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        c = *++s;
1533bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
15344141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
15354141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Skip leading zeros: lz is true iff there were leading zeros. */
15364141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    s1 = s;
15374141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    while (c == '0')
15384141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        c = *++s;
15394141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    lz = s != s1;
15404141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
1541c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson    /* Point s0 at the first nonzero digit (if any).  fraclen will be the
1542c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson       number of digits between the decimal point and the end of the
1543c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson       digit string.  ndigits will be the total number of digits ignoring
1544c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson       leading zeros. */
15454141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    s0 = s1 = s;
15464141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    while ('0' <= c && c <= '9')
15474141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        c = *++s;
1548c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson    ndigits = s - s1;
1549c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson    fraclen = 0;
15504141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
15514141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Parse decimal point and following digits. */
1552bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (c == '.') {
1553bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        c = *++s;
1554c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson        if (!ndigits) {
15554141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            s1 = s;
15564141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            while (c == '0')
15574141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                c = *++s;
15584141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            lz = lz || s != s1;
1559c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson            fraclen += (s - s1);
15604141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            s0 = s;
1561bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
15624141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        s1 = s;
15634141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        while ('0' <= c && c <= '9')
15644141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            c = *++s;
1565c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson        ndigits += s - s1;
1566c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson        fraclen += s - s1;
1567c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson    }
1568c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson
1569c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson    /* Now lz is true if and only if there were leading zero digits, and
1570c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson       ndigits gives the total number of digits ignoring leading zeros.  A
1571c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson       valid input must have at least one digit. */
1572c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson    if (!ndigits && !lz) {
1573c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson        if (se)
1574c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson            *se = (char *)s00;
1575c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson        goto parse_error;
1576bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
15774141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
1578c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson    /* Range check ndigits and fraclen to make sure that they, and values
1579c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson       computed with them, can safely fit in an int. */
1580c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson    if (ndigits > MAX_DIGITS || fraclen > MAX_DIGITS) {
158119428060139151e3047283f132e8baf16436745eMark Dickinson        if (se)
158219428060139151e3047283f132e8baf16436745eMark Dickinson            *se = (char *)s00;
15834141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        goto parse_error;
15844141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    }
1585c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson    nd = (int)ndigits;
1586c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson    nd0 = (int)ndigits - (int)fraclen;
15874141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
15884141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Parse exponent. */
1589bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    e = 0;
1590bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (c == 'e' || c == 'E') {
1591bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s00 = s;
15924141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        c = *++s;
15934141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
15944141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* Exponent sign. */
1595bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        esign = 0;
15964141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        switch (c) {
1597bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        case '-':
1598bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            esign = 1;
15994141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            /* no break */
1600bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        case '+':
1601bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            c = *++s;
1602bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
16034141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
16044141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* Skip zeros.  lz is true iff there are leading zeros. */
16054141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        s1 = s;
16064141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        while (c == '0')
16074141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            c = *++s;
16084141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        lz = s != s1;
16094141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
16104141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* Get absolute value of the exponent. */
16114141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        s1 = s;
16124141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        abs_exp = 0;
16134141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        while ('0' <= c && c <= '9') {
16144141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            abs_exp = 10*abs_exp + (c - '0');
16154141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            c = *++s;
1616bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
16174141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
16184141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* abs_exp will be correct modulo 2**32.  But 10**9 < 2**32, so if
16194141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson           there are at most 9 significant exponent digits then overflow is
16204141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson           impossible. */
16214141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        if (s - s1 > 9 || abs_exp > MAX_ABS_EXP)
16224141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            e = (int)MAX_ABS_EXP;
1623bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else
16244141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            e = (int)abs_exp;
16254141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        if (esign)
16264141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            e = -e;
16274141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
16284141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        /* A valid exponent must have at least one digit. */
16294141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        if (s == s1 && !lz)
1630bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            s = s00;
1631bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
16324141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
16334141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Adjust exponent to take into account position of the point. */
16344141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    e -= nd - nd0;
16354141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    if (nd0 <= 0)
1636811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        nd0 = nd;
1637811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson
16384141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Finished parsing.  Set se to indicate how far we parsed */
16394141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    if (se)
16404141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        *se = (char *)s;
16414141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
16424141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* If all digits were zero, exit with return value +-0.0.  Otherwise,
16434141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson       strip trailing zeros: scan back until we hit a nonzero digit. */
16444141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    if (!nd)
16454141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        goto ret;
1646811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    for (i = nd; i > 0; ) {
1647811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        --i;
1648811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        if (s0[i < nd0 ? i : i+1] != '0') {
1649811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson            ++i;
1650811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson            break;
1651811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        }
1652811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    }
1653811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    e += nd - i;
1654811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    nd = i;
1655811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    if (nd0 > nd)
1656811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        nd0 = nd;
1657bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
16584141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Summary of parsing results.  After parsing, and dealing with zero
16594141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     * inputs, we have values s0, nd0, nd, e, sign, where:
1660476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
16614141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *  - s0 points to the first significant digit of the input string
1662476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
1663811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *  - nd is the total number of significant digits (here, and
1664811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *    below, 'significant digits' means the set of digits of the
1665811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *    significand of the input that remain after ignoring leading
16664141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *    and trailing zeros).
1667476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
16684141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *  - nd0 indicates the position of the decimal point, if present; it
16694141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *    satisfies 1 <= nd0 <= nd.  The nd significant digits are in
16704141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *    s0[0:nd0] and s0[nd0+1:nd+1] using the usual Python half-open slice
16714141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *    notation.  (If nd0 < nd, then s0[nd0] contains a '.'  character; if
16724141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson     *    nd0 == nd, then s0[nd0] could be any non-digit character.)
1673476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
1674811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *  - e is the adjusted exponent: the absolute value of the number
1675811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *    represented by the original input string is n * 10**e, where
1676811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *    n is the integer represented by the concatenation of
1677811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *    s0[0:nd0] and s0[nd0+1:nd+1]
1678476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
1679811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *  - sign gives the sign of the input:  1 for negative, 0 for positive
1680811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *
1681811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     *  - the first and last significant digits are nonzero
1682811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson     */
1683811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson
1684811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    /* put first DBL_DIG+1 digits into integer y and z.
1685476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
1686476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *  - y contains the value represented by the first min(9, nd)
1687476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *    significant digits
1688476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *
1689476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *  - if nd > 9, z contains the value represented by significant digits
1690476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *    with indices in [9, min(16, nd)).  So y * 10**(min(16, nd) - 9) + z
1691476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     *    gives the value represented by the first min(16, nd) sig. digits.
1692476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson     */
1693476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson
16944141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    bc.e0 = e1 = e;
1695811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    y = z = 0;
1696811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    for (i = 0; i < nd; i++) {
1697811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        if (i < 9)
1698811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson            y = 10*y + s0[i < nd0 ? i : i+1] - '0';
1699811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        else if (i < DBL_DIG+1)
1700811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson            z = 10*z + s0[i < nd0 ? i : i+1] - '0';
1701811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson        else
1702811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson            break;
1703811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson    }
1704811ff822f8cd87cf29867118cb3a74c5035a1a94Mark Dickinson
1705bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
1706bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    dval(&rv) = y;
1707bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k > 9) {
1708bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&rv) = tens[k - 9] * dval(&rv) + z;
1709bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1710bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    bd0 = 0;
1711bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (nd <= DBL_DIG
1712bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        && Flt_Rounds == 1
1713bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ) {
1714bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!e)
1715bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto ret;
1716bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (e > 0) {
1717bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (e <= Ten_pmax) {
1718bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&rv) *= tens[e];
1719bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
1720bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1721bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            i = DBL_DIG - nd;
1722bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (e <= Ten_pmax + i) {
1723bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* A fancier test would sometimes let us do
1724bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                 * this for larger i values.
1725bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                 */
1726bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                e -= i;
1727bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&rv) *= tens[i];
1728bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&rv) *= tens[e];
1729bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
1730bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1731bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1732bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else if (e >= -Ten_pmax) {
1733bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv) /= tens[-e];
1734bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto ret;
1735bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1736bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1737bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    e1 += nd - k;
1738bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1739bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    bc.scale = 0;
1740bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1741bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Get starting approximation = rv * 10**e1 */
1742bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1743bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (e1 > 0) {
1744bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if ((i = e1 & 15))
1745bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv) *= tens[i];
1746bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (e1 &= ~15) {
17474141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (e1 > DBL_MAX_10_EXP)
17484141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                goto ovfl;
1749bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            e1 >>= 4;
1750bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(j = 0; e1 > 1; j++, e1 >>= 1)
1751bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (e1 & 1)
1752bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    dval(&rv) *= bigtens[j];
1753bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* The last multiplication could overflow. */
1754bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            word0(&rv) -= P*Exp_msk1;
1755bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv) *= bigtens[j];
1756bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if ((z = word0(&rv) & Exp_mask)
1757bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                > Exp_msk1*(DBL_MAX_EXP+Bias-P))
1758bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ovfl;
1759bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
1760bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* set to largest number */
1761bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* (Can't trust DBL_MAX) */
1762bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word0(&rv) = Big0;
1763bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word1(&rv) = Big1;
1764bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1765bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else
1766bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word0(&rv) += P*Exp_msk1;
1767bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1768bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1769bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else if (e1 < 0) {
1770ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson        /* The input decimal value lies in [10**e1, 10**(e1+16)).
1771ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1772ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           If e1 <= -512, underflow immediately.
1773ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           If e1 <= -256, set bc.scale to 2*P.
1774ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1775ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           So for input value < 1e-256, bc.scale is always set;
1776ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           for input value >= 1e-240, bc.scale is never set.
1777ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           For input values in [1e-256, 1e-240), bc.scale may or may
1778ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           not be set. */
1779ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1780bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        e1 = -e1;
1781bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if ((i = e1 & 15))
1782bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv) /= tens[i];
1783bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (e1 >>= 4) {
1784bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (e1 >= 1 << n_bigtens)
1785bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto undfl;
1786bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (e1 & Scale_Bit)
1787bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                bc.scale = 2*P;
1788bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(j = 0; e1 > 0; j++, e1 >>= 1)
1789bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (e1 & 1)
1790bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    dval(&rv) *= tinytens[j];
1791bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
1792bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                                            >> Exp_shift)) > 0) {
1793bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* scaled rv is denormal; clear j low bits */
1794bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (j >= 32) {
1795bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    word1(&rv) = 0;
1796bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    if (j >= 53)
1797bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        word0(&rv) = (P+2)*Exp_msk1;
1798bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    else
1799bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        word0(&rv) &= 0xffffffff << (j-32);
1800bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
1801bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                else
1802bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    word1(&rv) &= 0xffffffff << j;
1803bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
18044141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (!dval(&rv))
18054141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                goto undfl;
1806bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1807bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1808bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1809bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Now the hard part -- adjusting rv to the correct value.*/
1810bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1811bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Put digits into bd: true value = bd * 10^e */
1812bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1813bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    bc.nd = nd;
18145a0b399aa9d75d4d208394d80b4997c164435ecbMark Dickinson    bc.nd0 = nd0;       /* Only needed if nd > STRTOD_DIGLIM, but done here */
1815bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        /* to silence an erroneous warning about bc.nd0 */
1816bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        /* possibly not being initialized. */
18175a0b399aa9d75d4d208394d80b4997c164435ecbMark Dickinson    if (nd > STRTOD_DIGLIM) {
18185a0b399aa9d75d4d208394d80b4997c164435ecbMark Dickinson        /* ASSERT(STRTOD_DIGLIM >= 18); 18 == one more than the */
1819bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* minimum number of decimal digits to distinguish double values */
1820bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* in IEEE arithmetic. */
1821476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson
1822476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson        /* Truncate input to 18 significant digits, then discard any trailing
1823476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson           zeros on the result by updating nd, nd0, e and y suitably. (There's
1824476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson           no need to update z; it's not reused beyond this point.) */
1825476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson        for (i = 18; i > 0; ) {
1826476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson            /* scan back until we hit a nonzero digit.  significant digit 'i'
1827476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson            is s0[i] if i < nd0, s0[i+1] if i >= nd0. */
1828bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            --i;
1829476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson            if (s0[i < nd0 ? i : i+1] != '0') {
1830476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson                ++i;
1831476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson                break;
1832476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson            }
1833bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1834bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        e += nd - i;
1835bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        nd = i;
1836bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (nd0 > nd)
1837bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            nd0 = nd;
1838bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (nd < 9) { /* must recompute y */
1839bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            y = 0;
1840bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(i = 0; i < nd0; ++i)
1841bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                y = 10*y + s0[i] - '0';
1842476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson            for(; i < nd; ++i)
1843476279f18b1bbcc5939f6bb7a10dd937c933cfb3Mark Dickinson                y = 10*y + s0[i+1] - '0';
1844bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1845bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
1846d2a9940acbe6a74cc83e371baf2ef7c580e308bcMark Dickinson    bd0 = s2b(s0, nd0, nd, y);
1847bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (bd0 == NULL)
1848bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto failed_malloc;
1849bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1850ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson    /* Notation for the comments below.  Write:
1851ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1852ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson         - dv for the absolute value of the number represented by the original
1853ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           decimal input string.
1854ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1855ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson         - if we've truncated dv, write tdv for the truncated value.
1856ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           Otherwise, set tdv == dv.
1857ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1858ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson         - srv for the quantity rv/2^bc.scale; so srv is the current binary
1859ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           approximation to tdv (and dv).  It should be exactly representable
1860ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           in an IEEE 754 double.
1861ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson    */
1862ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1863bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(;;) {
1864ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1865ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson        /* This is the main correction loop for _Py_dg_strtod.
1866ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1867ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           We've got a decimal value tdv, and a floating-point approximation
1868ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           srv=rv/2^bc.scale to tdv.  The aim is to determine whether srv is
1869ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           close enough (i.e., within 0.5 ulps) to tdv, and to compute a new
1870ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           approximation if not.
1871ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1872ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           To determine whether srv is close enough to tdv, compute integers
1873ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           bd, bb and bs proportional to tdv, srv and 0.5 ulp(srv)
1874ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           respectively, and then use integer arithmetic to determine whether
1875ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           |tdv - srv| is less than, equal to, or greater than 0.5 ulp(srv).
1876ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson        */
1877ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1878bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bd = Balloc(bd0->k);
1879bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bd == NULL) {
1880bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd0);
1881bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
1882bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1883bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bcopy(bd, bd0);
1884adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        bb = sd2b(&rv, bc.scale, &bbe);   /* srv = bb * 2^bbe */
1885bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bb == NULL) {
1886bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd);
1887bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd0);
1888bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
1889bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1890adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        /* Record whether lsb of bb is odd, in case we need this
1891adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson           for the round-to-even step later. */
1892adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        odd = bb->x[0] & 1;
1893adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson
1894adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        /* tdv = bd * 10**e;  srv = bb * 2**bbe */
1895bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bs = i2b(1);
1896bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bs == NULL) {
1897bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bb);
1898bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd);
1899bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd0);
1900bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
1901bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1902bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
1903bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (e >= 0) {
1904bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb2 = bb5 = 0;
1905bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bd2 = bd5 = e;
1906bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1907bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
1908bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb2 = bb5 = -e;
1909bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bd2 = bd5 = 0;
1910bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1911bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bbe >= 0)
1912bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb2 += bbe;
1913bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else
1914bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bd2 -= bbe;
1915bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        bs2 = bb2;
1916adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        bb2++;
1917adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        bd2++;
1918ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1919adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        /* At this stage bd5 - bb5 == e == bd2 - bb2 + bbe, bb2 - bs2 == 1,
1920c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson           and bs == 1, so:
1921ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1922adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson              tdv == bd * 10**e = bd * 2**(bbe - bb2 + bd2) * 5**(bd5 - bb5)
1923adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson              srv == bb * 2**bbe = bb * 2**(bbe - bb2 + bb2)
1924c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson              0.5 ulp(srv) == 2**(bbe-1) = bs * 2**(bbe - bb2 + bs2)
1925ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1926c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson           It follows that:
1927ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1928adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson              M * tdv = bd * 2**bd2 * 5**bd5
1929adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson              M * srv = bb * 2**bb2 * 5**bb5
1930adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson              M * 0.5 ulp(srv) = bs * 2**bs2 * 5**bb5
1931ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1932c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson           for some constant M.  (Actually, M == 2**(bb2 - bbe) * 5**bb5, but
1933c2f8c81af02519952a857baebb5c0c9048033009Mark Dickinson           this fact is not needed below.)
1934adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        */
1935ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1936adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson        /* Remove factor of 2**i, where i = min(bb2, bd2, bs2). */
1937bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = bb2 < bd2 ? bb2 : bd2;
1938bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (i > bs2)
1939bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            i = bs2;
1940bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (i > 0) {
1941bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb2 -= i;
1942bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bd2 -= i;
1943bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bs2 -= i;
1944bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1945ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
1946ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson        /* Scale bb, bd, bs by the appropriate powers of 2 and 5. */
1947bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bb5 > 0) {
1948bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bs = pow5mult(bs, bb5);
1949bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bs == NULL) {
1950bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bb);
1951bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd);
1952bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
1953bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
1954bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1955bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb1 = mult(bs, bb);
1956bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bb);
1957bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb = bb1;
1958bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bb == NULL) {
1959bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bs);
1960bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd);
1961bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
1962bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
1963bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1964bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1965bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bb2 > 0) {
1966bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bb = lshift(bb, bb2);
1967bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bb == NULL) {
1968bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bs);
1969bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd);
1970bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
1971bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
1972bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1973bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1974bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bd5 > 0) {
1975bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bd = pow5mult(bd, bd5);
1976bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bd == NULL) {
1977bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bb);
1978bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bs);
1979bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
1980bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
1981bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1982bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1983bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bd2 > 0) {
1984bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bd = lshift(bd, bd2);
1985bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bd == NULL) {
1986bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bb);
1987bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bs);
1988bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
1989bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
1990bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
1991bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
1992bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bs2 > 0) {
1993bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            bs = lshift(bs, bs2);
1994bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bs == NULL) {
1995bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bb);
1996bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd);
1997bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
1998bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
1999bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2000bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2001ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
2002ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson        /* Now bd, bb and bs are scaled versions of tdv, srv and 0.5 ulp(srv),
2003ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           respectively.  Compute the difference |tdv - srv|, and compare
2004ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson           with 0.5 ulp(srv). */
2005ca6ea567184941a62f49f911a16d5bc3515c634cMark Dickinson
2006bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        delta = diff(bb, bd);
2007bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (delta == NULL) {
2008bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bb);
2009bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bs);
2010bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd);
2011bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(bd0);
2012bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
2013bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
20144141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson        dsign = delta->sign;
2015bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        delta->sign = 0;
2016bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = cmp(delta, bs);
2017bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bc.nd > nd && i <= 0) {
20184141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (dsign)
2019bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;  /* Must use bigcomp(). */
2020f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson
2021f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson            /* Here rv overestimates the truncated decimal value by at most
2022f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               0.5 ulp(rv).  Hence rv either overestimates the true decimal
2023f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               value by <= 0.5 ulp(rv), or underestimates it by some small
2024f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               amount (< 0.1 ulp(rv)); either way, rv is within 0.5 ulps of
2025f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               the true decimal value, so it's possible to exit.
2026f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson
2027f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               Exception: if scaled rv is a normal exact power of 2, but not
2028f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               DBL_MIN, then rv - 0.5 ulp(rv) takes us all the way down to the
2029f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               next double, so the correctly rounded result is either rv - 0.5
2030f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson               ulp(rv) or rv; in this case, use bigcomp to distinguish. */
2031f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson
2032f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson            if (!word1(&rv) && !(word0(&rv) & Bndry_mask)) {
2033f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                /* rv can't be 0, since it's an overestimate for some
2034f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                   nonzero value.  So rv is a normal power of 2. */
2035f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                j = (int)(word0(&rv) & Exp_mask) >> Exp_shift;
2036f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                /* rv / 2^bc.scale = 2^(j - 1023 - bc.scale); use bigcomp if
2037f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                   rv / 2^bc.scale >= 2^-1021. */
2038f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                if (j - bc.scale >= 2) {
2039f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                    dval(&rv) -= 0.5 * sulp(&rv, &bc);
20404141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                    break; /* Use bigcomp. */
2041f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson                }
2042f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson            }
2043f8747c1f12577a4198d47f28eaf89a2983a13261Mark Dickinson
2044bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            {
2045bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                bc.nd = nd;
2046bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                i = -1; /* Discarded digits make delta smaller. */
2047bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2048bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2049bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2050bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (i < 0) {
2051bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* Error is less than half an ulp -- check for
2052bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             * special case of mantissa a power of two.
2053bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             */
20544141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (dsign || word1(&rv) || word0(&rv) & Bndry_mask
2055bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
2056bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                ) {
2057bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
2058bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2059bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (!delta->x[0] && delta->wds <= 1) {
2060bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* exact result */
2061bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
2062bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2063bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            delta = lshift(delta,Log2P);
2064bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (delta == NULL) {
2065bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bb);
2066bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bs);
2067bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd);
2068bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(bd0);
2069bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2070bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2071bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (cmp(delta, bs) > 0)
2072bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto drop_down;
2073bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            break;
2074bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2075bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (i == 0) {
2076bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* exactly half-way between */
20774141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (dsign) {
2078bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
2079bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    &&  word1(&rv) == (
2080bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        (bc.scale &&
2081bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                         (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) ?
2082bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
2083bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        0xffffffff)) {
2084bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    /*boundary case -- increment exponent*/
2085bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    word0(&rv) = (word0(&rv) & Exp_mask)
2086bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        + Exp_msk1
2087bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        ;
2088bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    word1(&rv) = 0;
20894141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                    dsign = 0;
2090bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    break;
2091bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2092bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2093bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
2094bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson              drop_down:
2095bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* boundary case -- decrement exponent */
2096bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (bc.scale) {
2097bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    L = word0(&rv) & Exp_mask;
2098bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    if (L <= (2*P+1)*Exp_msk1) {
2099bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        if (L > (P+2)*Exp_msk1)
2100bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            /* round even ==> */
2101bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            /* accept rv */
2102bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            break;
2103bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        /* rv = smallest denormal */
21044141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                        if (bc.nd > nd)
2105bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            break;
2106bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        goto undfl;
2107bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    }
2108bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2109bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                L = (word0(&rv) & Exp_mask) - Exp_msk1;
2110bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word0(&rv) = L | Bndry_mask1;
2111bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word1(&rv) = 0xffffffff;
2112bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
2113bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2114adcda3400f8ae931139605b8d1fcfede4c1c6916Mark Dickinson            if (!odd)
2115bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
21164141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (dsign)
21178cd0a66a0fd7bb7d69153906942930c2e8c3dd17Mark Dickinson                dval(&rv) += sulp(&rv, &bc);
2118bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else {
21198cd0a66a0fd7bb7d69153906942930c2e8c3dd17Mark Dickinson                dval(&rv) -= sulp(&rv, &bc);
2120bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (!dval(&rv)) {
21215a0b399aa9d75d4d208394d80b4997c164435ecbMark Dickinson                    if (bc.nd >nd)
2122bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        break;
2123bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto undfl;
2124bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2125bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
21264141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            dsign = 1 - dsign;
2127bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            break;
2128bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2129bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if ((aadj = ratio(delta, bs)) <= 2.) {
21304141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            if (dsign)
2131bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                aadj = aadj1 = 1.;
2132bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else if (word1(&rv) || word0(&rv) & Bndry_mask) {
2133bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (word1(&rv) == Tiny1 && !word0(&rv)) {
21345a0b399aa9d75d4d208394d80b4997c164435ecbMark Dickinson                    if (bc.nd >nd)
2135bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        break;
2136bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto undfl;
2137bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2138bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                aadj = 1.;
2139bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                aadj1 = -1.;
2140bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2141bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else {
2142bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* special case -- power of FLT_RADIX to be */
2143bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* rounded down... */
2144bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2145bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (aadj < 2./FLT_RADIX)
2146bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    aadj = 1./FLT_RADIX;
2147bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                else
2148bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    aadj *= 0.5;
2149bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                aadj1 = -aadj;
2150bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2151bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2152bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
2153bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            aadj *= 0.5;
21544141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson            aadj1 = dsign ? aadj : -aadj;
2155bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (Flt_Rounds == 0)
2156bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                aadj1 += 0.5;
2157bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2158bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        y = word0(&rv) & Exp_mask;
2159bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2160bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* Check for overflow */
2161bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2162bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
2163bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv0) = dval(&rv);
2164bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            word0(&rv) -= P*Exp_msk1;
2165bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            adj.d = aadj1 * ulp(&rv);
2166bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv) += adj.d;
2167bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if ((word0(&rv) & Exp_mask) >=
2168bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
216923df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                if (word0(&rv0) == Big0 && word1(&rv0) == Big1) {
217023df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                    Bfree(bb);
217123df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                    Bfree(bd);
217223df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                    Bfree(bs);
217323df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                    Bfree(bd0);
217423df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                    Bfree(delta);
2175bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto ovfl;
217623df3d270d3572c43638d15b63684405b66887f7Mark Dickinson                }
2177bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word0(&rv) = Big0;
2178bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word1(&rv) = Big1;
2179bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto cont;
2180bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2181bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else
2182bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word0(&rv) += P*Exp_msk1;
2183bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2184bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
2185bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (bc.scale && y <= 2*P*Exp_msk1) {
2186bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (aadj <= 0x7fffffff) {
2187bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    if ((z = (ULong)aadj) <= 0)
2188bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        z = 1;
2189bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    aadj = z;
21904141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                    aadj1 = dsign ? aadj : -aadj;
2191bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2192bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&aadj2) = aadj1;
2193bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                word0(&aadj2) += (2*P+1)*Exp_msk1 - y;
2194bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                aadj1 = dval(&aadj2);
2195bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2196bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            adj.d = aadj1 * ulp(&rv);
2197bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&rv) += adj.d;
2198bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2199bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        z = word0(&rv) & Exp_mask;
2200bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (bc.nd == nd) {
2201bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (!bc.scale)
2202bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (y == z) {
2203bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    /* Can we stop now? */
2204bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    L = (Long)aadj;
2205bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    aadj -= L;
2206bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    /* The tolerances below are conservative. */
22074141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson                    if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
2208bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        if (aadj < .4999999 || aadj > .5000001)
2209bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            break;
2210bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    }
2211bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    else if (aadj < .4999999/FLT_RADIX)
2212bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        break;
2213bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2214bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2215bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson      cont:
2216bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(bb);
2217bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(bd);
2218bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(bs);
2219bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(delta);
2220bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2221bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(bb);
2222bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(bd);
2223bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(bs);
2224bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(bd0);
2225bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(delta);
2226bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (bc.nd > nd) {
2227bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        error = bigcomp(&rv, s0, &bc);
2228bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (error)
2229bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
2230bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2231bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2232bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (bc.scale) {
2233bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
2234bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word1(&rv0) = 0;
2235bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&rv) *= dval(&rv0);
2236bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
22374141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
2238bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson  ret:
2239bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return sign ? -dval(&rv) : dval(&rv);
2240bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
22414141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson  parse_error:
22424141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    return 0.0;
22434141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
2244bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson  failed_malloc:
2245bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    errno = ENOMEM;
2246bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return -1.0;
22474141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
22484141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson  undfl:
22494141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    return sign ? -0.0 : 0.0;
22504141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
22514141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson  ovfl:
22524141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    errno = ERANGE;
22534141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    /* Can't trust HUGE_VAL */
22544141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    word0(&rv) = Exp_mask;
22554141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    word1(&rv) = 0;
22564141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson    return sign ? -dval(&rv) : dval(&rv);
22574141d65fb7eacccee58b2fa462b56a2410e67777Mark Dickinson
2258bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
2259bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2260bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic char *
2261bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonrv_alloc(int i)
2262bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
2263bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int j, k, *r;
2264bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2265bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    j = sizeof(ULong);
2266bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    for(k = 0;
2267bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (unsigned)i;
2268bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        j <<= 1)
2269bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k++;
2270bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    r = (int*)Balloc(k);
2271bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (r == NULL)
2272bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
2273bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    *r = k;
2274bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return (char *)(r+1);
2275bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
2276bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2277bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonstatic char *
2278bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonnrv_alloc(char *s, char **rve, int n)
2279bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
2280bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    char *rv, *t;
2281bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2282bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    rv = rv_alloc(n);
2283bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (rv == NULL)
2284bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return NULL;
2285bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    t = rv;
2286bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    while((*t = *s++)) t++;
2287bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (rve)
2288bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *rve = t;
2289bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return rv;
2290bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
2291bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2292bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* freedtoa(s) must be used to free values s returned by dtoa
2293bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * when MULTIPLE_THREADS is #defined.  It should be used in all cases,
2294bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * but for consistency with earlier versions of dtoa, it is optional
2295bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * when MULTIPLE_THREADS is not defined.
2296bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson */
2297bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2298bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonvoid
2299bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson_Py_dg_freedtoa(char *s)
2300bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
2301bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b = (Bigint *)((int *)s - 1);
2302bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b->maxwds = 1 << (b->k = *(int*)b);
2303bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(b);
2304bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
2305bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2306bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
2307bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
2308bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * Inspired by "How to Print Floating-Point Numbers Accurately" by
2309bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
2310bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *
2311bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson * Modifications:
2312bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      1. Rather than iterating, we use a simple numeric overestimate
2313bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         to determine k = floor(log10(d)).  We scale relevant
2314bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         quantities using O(log2(k)) rather than O(k) multiplications.
2315bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
2316bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         try to generate digits strictly left to right.  Instead, we
2317bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         compute with fewer bits and propagate the carry if necessary
2318bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         when rounding the final digit up.  This is often faster.
2319bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      3. Under the assumption that input will be rounded nearest,
2320bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
2321bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         That is, we allow equality in stopping tests when the
2322bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         round-nearest rule will give the same floating-point value
2323bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         as would satisfaction of the stopping test with strict
2324bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         inequality.
2325bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      4. We remove common factors of powers of 2 from relevant
2326bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         quantities.
2327bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      5. When converting floating-point integers less than 1e16,
2328bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         we use floating-point arithmetic rather than resorting
2329bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         to multiple-precision integers.
2330bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *      6. When asked to produce fewer than 15 digits, we first try
2331bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         to get by with floating-point arithmetic; we resort to
2332bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         multiple-precision integer arithmetic only if we cannot
2333bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         guarantee that the floating-point calculation has given
2334bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         the correctly rounded result.  For k requested digits and
2335bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         "uniformly" distributed input, the probability is
2336bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         something like 10^(k-15) that we must resort to the Long
2337bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson *         calculation.
2338bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson */
2339bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2340bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson/* Additional notes (METD): (1) returns NULL on failure.  (2) to avoid memory
2341bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   leakage, a successful call to _Py_dg_dtoa should always be matched by a
2342bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson   call to _Py_dg_freedtoa. */
2343bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2344bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinsonchar *
2345bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson_Py_dg_dtoa(double dd, int mode, int ndigits,
2346bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            int *decpt, int *sign, char **rve)
2347bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson{
2348bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /*  Arguments ndigits, decpt, sign are similar to those
2349bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        of ecvt and fcvt; trailing zeros are suppressed from
2350bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        the returned string.  If not null, *rve is set to point
2351bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        to the end of the return value.  If d is +-Infinity or NaN,
2352bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        then *decpt is set to 9999.
2353bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2354bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        mode:
2355bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        0 ==> shortest string that yields d when read in
2356bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        and rounded to nearest.
2357bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        1 ==> like 0, but with Steele & White stopping rule;
2358bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        e.g. with IEEE P754 arithmetic , mode 0 gives
2359bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        1e23 whereas mode 1 gives 9.999999999999999e22.
2360bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        2 ==> max(1,ndigits) significant digits.  This gives a
2361bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return value similar to that of ecvt, except
2362bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        that trailing zeros are suppressed.
2363bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        3 ==> through ndigits past the decimal point.  This
2364bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        gives a return value similar to that from fcvt,
2365bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        except that trailing zeros are suppressed, and
2366bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ndigits can be negative.
2367bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        4,5 ==> similar to 2 and 3, respectively, but (in
2368bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        round-nearest mode) with the tests of mode 0 to
2369bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        possibly return a shorter string that rounds to d.
2370bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        With IEEE arithmetic and compilation with
2371bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
2372bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        as modes 2 and 3 when FLT_ROUNDS != 1.
2373bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        6-9 ==> Debugging modes similar to mode - 4:  don't try
2374bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        fast floating-point estimate (if applicable).
2375bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2376bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Values of mode other than 0-9 are treated as mode 0.
2377bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2378bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Sufficient space is allocated to the return value
2379bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        to hold the suppressed trailing zeros.
2380bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    */
2381bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2382bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
2383bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
2384bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        spec_case, try_quick;
2385bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Long L;
2386bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    int denorm;
2387bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ULong x;
2388bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bigint *b, *b1, *delta, *mlo, *mhi, *S;
2389bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    U d2, eps, u;
2390bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    double ds;
2391bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    char *s, *s0;
2392bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2393bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* set pointers to NULL, to silence gcc compiler warnings and make
2394bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       cleanup easier on error */
23950b03f10afb301560c711b953b6ca2ecef3181eedBrett Cannon    mlo = mhi = S = 0;
2396bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    s0 = 0;
2397bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2398bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    u.d = dd;
2399bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (word0(&u) & Sign_bit) {
2400bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* set sign for everything, including 0's and NaNs */
2401bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *sign = 1;
2402bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&u) &= ~Sign_bit; /* clear sign bit */
2403bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2404bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else
2405bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *sign = 0;
2406bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2407bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* quick return for Infinities, NaNs and zeros */
2408bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((word0(&u) & Exp_mask) == Exp_mask)
2409bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    {
2410bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* Infinity or NaN */
2411bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *decpt = 9999;
2412bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!word1(&u) && !(word0(&u) & 0xfffff))
2413bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            return nrv_alloc("Infinity", rve, 8);
2414bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return nrv_alloc("NaN", rve, 3);
2415bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2416bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (!dval(&u)) {
2417bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *decpt = 1;
2418bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        return nrv_alloc("0", rve, 1);
2419bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2420bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2421bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* compute k = floor(log10(d)).  The computation may leave k
2422bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson       one too large, but should never leave k too small. */
2423bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b = d2b(&u, &be, &bbits);
2424bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b == NULL)
2425bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto failed_malloc;
2426bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {
2427bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&d2) = dval(&u);
2428bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&d2) &= Frac_mask1;
2429bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&d2) |= Exp_11;
2430bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2431bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* log(x)       ~=~ log(1.5) + (x-1.5)/1.5
2432bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * log10(x)      =  log(x) / log(10)
2433bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         *              ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
2434bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
2435bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         *
2436bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * This suggests computing an approximation k to log10(d) by
2437bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         *
2438bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * k = (i - Bias)*0.301029995663981
2439bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         *      + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
2440bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         *
2441bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * We want k to be too large rather than too small.
2442bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * The error in the first-order Taylor series approximation
2443bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * is in our favor, so we just round up the constant enough
2444bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * to compensate for any error in the multiplication of
2445bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
2446bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
2447bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * adding 1e-13 to the constant term more than suffices.
2448bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * Hence we adjust the constant term to 0.1760912590558.
2449bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * (We could get a more accurate k by invoking log10,
2450bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         *  but this is probably not worthwhile.)
2451bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         */
2452bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2453bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i -= Bias;
2454bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        denorm = 0;
2455bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2456bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
2457bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* d is denormalized */
2458bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2459bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = bbits + be + (Bias + (P-1) - 1);
2460bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        x = i > 32  ? word0(&u) << (64 - i) | word1(&u) >> (i - 32)
2461bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            : word1(&u) << (32 - i);
2462bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&d2) = x;
2463bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
2464bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i -= (Bias + (P-1) - 1) + 1;
2465bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        denorm = 1;
2466bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2467bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 +
2468bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i*0.301029995663981;
2469bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k = (int)ds;
2470bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (ds < 0. && ds != k)
2471bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k--;    /* want k = floor(ds) */
2472bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    k_check = 1;
2473bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k >= 0 && k <= Ten_pmax) {
2474bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (dval(&u) < tens[k])
2475bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            k--;
2476bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k_check = 0;
2477bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2478bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    j = bbits - i - 1;
2479bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (j >= 0) {
2480bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 = 0;
2481bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s2 = j;
2482bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2483bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
2484bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 = -j;
2485bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s2 = 0;
2486bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2487bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k >= 0) {
2488bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b5 = 0;
2489bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s5 = k;
2490bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s2 += k;
2491bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2492bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
2493bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 -= k;
2494bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b5 = -k;
2495bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s5 = 0;
2496bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2497bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (mode < 0 || mode > 9)
2498bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        mode = 0;
2499bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2500bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    try_quick = 1;
2501bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2502bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (mode > 5) {
2503bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        mode -= 4;
2504bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        try_quick = 0;
2505bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2506bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    leftright = 1;
2507bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    ilim = ilim1 = -1;  /* Values for cases 0 and 1; done here to */
2508bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* silence erroneous "gcc -Wall" warning. */
2509bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    switch(mode) {
2510bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    case 0:
2511bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    case 1:
2512bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = 18;
2513bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ndigits = 0;
2514bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        break;
2515bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    case 2:
2516bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        leftright = 0;
2517bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* no break */
2518bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    case 4:
2519bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (ndigits <= 0)
2520bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ndigits = 1;
2521bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ilim = ilim1 = i = ndigits;
2522bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        break;
2523bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    case 3:
2524bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        leftright = 0;
2525bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* no break */
2526bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    case 5:
2527bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = ndigits + k + 1;
2528bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ilim = i;
2529bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ilim1 = i - 1;
2530bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (i <= 0)
2531bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            i = 1;
2532bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2533bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    s0 = rv_alloc(i);
2534bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (s0 == NULL)
2535bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto failed_malloc;
2536bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    s = s0;
2537bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2538bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2539bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (ilim >= 0 && ilim <= Quick_max && try_quick) {
2540bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2541bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* Try to get by with floating-point arithmetic. */
2542bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2543bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = 0;
2544bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&d2) = dval(&u);
2545bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k0 = k;
2546bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ilim0 = ilim;
2547bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ieps = 2; /* conservative */
2548bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (k > 0) {
2549bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ds = tens[k&0xf];
2550bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            j = k >> 4;
2551bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (j & Bletch) {
2552bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                /* prevent overflows */
2553bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                j &= Bletch - 1;
2554bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&u) /= bigtens[n_bigtens-1];
2555bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                ieps++;
2556bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2557bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(; j; j >>= 1, i++)
2558bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (j & 1) {
2559bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    ieps++;
2560bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    ds *= bigtens[i];
2561bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2562bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&u) /= ds;
2563bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2564bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else if ((j1 = -k)) {
2565bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&u) *= tens[j1 & 0xf];
2566bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(j = j1 >> 4; j; j >>= 1, i++)
2567bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (j & 1) {
2568bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    ieps++;
2569bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    dval(&u) *= bigtens[i];
2570bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2571bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2572bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (k_check && dval(&u) < 1. && ilim > 0) {
2573bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (ilim1 <= 0)
2574bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto fast_failed;
2575bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ilim = ilim1;
2576bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            k--;
2577bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&u) *= 10.;
2578bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ieps++;
2579bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2580bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&eps) = ieps*dval(&u) + 7.;
2581bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        word0(&eps) -= (P-1)*Exp_msk1;
2582bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (ilim == 0) {
2583bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            S = mhi = 0;
2584bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&u) -= 5.;
2585bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (dval(&u) > dval(&eps))
2586bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto one_digit;
2587bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (dval(&u) < -dval(&eps))
2588bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto no_digits;
2589bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto fast_failed;
2590bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2591bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (leftright) {
2592bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* Use Steele & White method of only
2593bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             * generating digits needed.
2594bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             */
2595bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
2596bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(i = 0;;) {
2597bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                L = (Long)dval(&u);
2598bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&u) -= L;
2599bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *s++ = '0' + (int)L;
2600bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (dval(&u) < dval(&eps))
2601bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto ret1;
2602bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (1. - dval(&u) < dval(&eps))
2603bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto bump_up;
2604bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (++i >= ilim)
2605bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    break;
2606bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&eps) *= 10.;
2607bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&u) *= 10.;
2608bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2609bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2610bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
2611bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* Generate ilim digits, then fix them up. */
2612bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&eps) *= tens[ilim-1];
2613bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            for(i = 1;; i++, dval(&u) *= 10.) {
2614bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                L = (Long)(dval(&u));
2615bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (!(dval(&u) -= L))
2616bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    ilim = i;
2617bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *s++ = '0' + (int)L;
2618bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (i == ilim) {
2619bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    if (dval(&u) > 0.5 + dval(&eps))
2620bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        goto bump_up;
2621bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    else if (dval(&u) < 0.5 - dval(&eps)) {
2622bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        while(*--s == '0');
2623bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        s++;
2624bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        goto ret1;
2625bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    }
2626bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    break;
2627bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2628bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2629bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2630bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson      fast_failed:
2631bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s = s0;
2632bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        dval(&u) = dval(&d2);
2633bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k = k0;
2634bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ilim = ilim0;
2635bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2636bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2637bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Do we have a "small" integer? */
2638bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2639bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (be >= 0 && k <= Int_max) {
2640bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* Yes. */
2641bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ds = tens[k];
2642bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (ndigits < 0 && ilim <= 0) {
2643bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            S = mhi = 0;
2644bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (ilim < 0 || dval(&u) <= 5*ds)
2645bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto no_digits;
2646bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto one_digit;
2647bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2648bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        for(i = 1;; i++, dval(&u) *= 10.) {
2649bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            L = (Long)(dval(&u) / ds);
2650bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dval(&u) -= L*ds;
2651bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *s++ = '0' + (int)L;
2652bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (!dval(&u)) {
2653bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
2654bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2655bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (i == ilim) {
2656bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                dval(&u) += dval(&u);
2657bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (dval(&u) > ds || (dval(&u) == ds && L & 1)) {
2658bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                  bump_up:
2659bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    while(*--s == '9')
2660bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        if (s == s0) {
2661bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            k++;
2662bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            *s = '0';
2663bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                            break;
2664bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        }
2665bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    ++*s++;
2666bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2667bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
2668bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2669bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2670bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto ret1;
2671bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2672bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2673bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    m2 = b2;
2674bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    m5 = b5;
2675bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (leftright) {
2676bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i =
2677bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            denorm ? be + (Bias + (P-1) - 1 + 1) :
2678bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            1 + P - bbits;
2679bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 += i;
2680bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s2 += i;
2681bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        mhi = i2b(1);
2682bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (mhi == NULL)
2683bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
2684bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2685bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (m2 > 0 && s2 > 0) {
2686bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        i = m2 < s2 ? m2 : s2;
2687bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b2 -= i;
2688bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        m2 -= i;
2689bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s2 -= i;
2690bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2691bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b5 > 0) {
2692bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (leftright) {
2693bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (m5 > 0) {
2694bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                mhi = pow5mult(mhi, m5);
2695bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (mhi == NULL)
2696bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2697bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                b1 = mult(mhi, b);
2698bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                Bfree(b);
2699bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                b = b1;
2700bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (b == NULL)
2701bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2702bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2703bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if ((j = b5 - m5)) {
2704bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                b = pow5mult(b, j);
2705bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (b == NULL)
2706bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2707bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2708bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2709bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
2710bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b = pow5mult(b, b5);
2711bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (b == NULL)
2712bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2713bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2714bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2715bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    S = i2b(1);
2716bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (S == NULL)
2717bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto failed_malloc;
2718bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (s5 > 0) {
2719bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        S = pow5mult(S, s5);
2720bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (S == NULL)
2721bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
2722bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2723bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2724bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Check for special case that d is a normalized power of 2. */
2725bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2726bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    spec_case = 0;
2727bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if ((mode < 2 || leftright)
2728bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ) {
2729bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (!word1(&u) && !(word0(&u) & Bndry_mask)
2730bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            && word0(&u) & (Exp_mask & ~Exp_msk1)
2731bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ) {
2732bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* The special case */
2733bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b2 += Log2P;
2734bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            s2 += Log2P;
2735bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            spec_case = 1;
2736bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2737bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2738bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2739bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Arrange for convenient computation of quotients:
2740bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     * shift left if necessary so divisor has 4 leading 0 bits.
2741bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     *
2742bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     * Perhaps we should just compute leading 28 bits of S once
2743bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     * and for all and pass them and a shift to quorem, so it
2744bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     * can do shifts and ors to compute the numerator for q.
2745bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson     */
2746bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#define iInc 28
2747bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    i = dshift(S, s2);
2748bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b2 += i;
2749bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    m2 += i;
2750bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    s2 += i;
2751bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b2 > 0) {
2752bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        b = lshift(b, b2);
2753bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (b == NULL)
2754bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
2755bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2756bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (s2 > 0) {
2757bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        S = lshift(S, s2);
2758bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (S == NULL)
2759bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto failed_malloc;
2760bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2761bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (k_check) {
2762bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (cmp(b,S) < 0) {
2763bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            k--;
2764bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b = multadd(b, 10, 0);      /* we botched the k estimate */
2765bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (b == NULL)
2766bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2767bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (leftright) {
2768bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                mhi = multadd(mhi, 10, 0);
2769bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (mhi == NULL)
2770bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2771bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2772bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            ilim = ilim1;
2773bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2774bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2775bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (ilim <= 0 && (mode == 3 || mode == 5)) {
2776bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (ilim < 0) {
2777bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* no digits, fcvt style */
2778bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson          no_digits:
2779bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            k = -1 - ndigits;
2780bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            goto ret;
2781bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2782bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        else {
2783bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            S = multadd(S, 5, 0);
2784bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (S == NULL)
2785bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2786bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (cmp(b, S) <= 0)
2787bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto no_digits;
2788bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2789bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson      one_digit:
2790bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *s++ = '1';
2791bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        k++;
2792bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto ret;
2793bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2794bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (leftright) {
2795bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (m2 > 0) {
2796bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            mhi = lshift(mhi, m2);
2797bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (mhi == NULL)
2798bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2799bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2800bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2801bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        /* Compute mlo -- check for special case
2802bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         * that d is a normalized power of 2.
2803bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson         */
2804bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2805bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        mlo = mhi;
2806bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (spec_case) {
2807bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            mhi = Balloc(mhi->k);
2808bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (mhi == NULL)
2809bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2810bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bcopy(mhi, mlo);
2811bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            mhi = lshift(mhi, Log2P);
2812bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (mhi == NULL)
2813bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2814bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2815bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2816bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        for(i = 1;;i++) {
2817bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            dig = quorem(b,S) + '0';
2818bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            /* Do we yet have the shortest decimal string
2819bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             * that will round to d?
2820bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson             */
2821bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            j = cmp(b, mlo);
2822bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            delta = diff(S, mhi);
2823bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (delta == NULL)
2824bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2825bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            j1 = delta->sign ? 1 : cmp(b, delta);
2826bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(delta);
2827bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (j1 == 0 && mode != 1 && !(word1(&u) & 1)
2828bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                ) {
2829bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (dig == '9')
2830bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto round_9_up;
2831bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (j > 0)
2832bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    dig++;
2833bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *s++ = dig;
2834bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
2835bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2836bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (j < 0 || (j == 0 && mode != 1
2837bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                          && !(word1(&u) & 1)
2838bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    )) {
2839bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (!b->x[0] && b->wds <= 1) {
2840bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto accept_dig;
2841bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2842bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (j1 > 0) {
2843bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    b = lshift(b, 1);
2844bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    if (b == NULL)
2845bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        goto failed_malloc;
2846bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    j1 = cmp(b, S);
2847bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    if ((j1 > 0 || (j1 == 0 && dig & 1))
2848bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        && dig++ == '9')
2849bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                        goto round_9_up;
2850bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2851bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson              accept_dig:
2852bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *s++ = dig;
2853bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
2854bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2855bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (j1 > 0) {
2856bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (dig == '9') { /* possible if i == 1 */
2857bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                  round_9_up:
2858bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    *s++ = '9';
2859bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto roundoff;
2860bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                }
2861bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *s++ = dig + 1;
2862bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
2863bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2864bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *s++ = dig;
2865bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (i == ilim)
2866bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
2867bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b = multadd(b, 10, 0);
2868bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (b == NULL)
2869bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2870bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (mlo == mhi) {
2871bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                mlo = mhi = multadd(mhi, 10, 0);
2872bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (mlo == NULL)
2873bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2874bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2875bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            else {
2876bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                mlo = multadd(mlo, 10, 0);
2877bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (mlo == NULL)
2878bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2879bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                mhi = multadd(mhi, 10, 0);
2880bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                if (mhi == NULL)
2881bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                    goto failed_malloc;
2882bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2883bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2884bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2885bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else
2886bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        for(i = 1;; i++) {
2887bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            *s++ = dig = quorem(b,S) + '0';
2888bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (!b->x[0] && b->wds <= 1) {
2889bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
2890bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2891bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (i >= ilim)
2892bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                break;
2893bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            b = multadd(b, 10, 0);
2894bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (b == NULL)
2895bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto failed_malloc;
2896bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        }
2897bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2898bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    /* Round off last digit */
2899bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2900bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    b = lshift(b, 1);
2901bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b == NULL)
2902bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        goto failed_malloc;
2903bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    j = cmp(b, S);
2904bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (j > 0 || (j == 0 && dig & 1)) {
2905bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson      roundoff:
2906bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        while(*--s == '9')
2907bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            if (s == s0) {
2908bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                k++;
2909bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                *s++ = '1';
2910bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson                goto ret;
2911bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            }
2912bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        ++*s++;
2913bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2914bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    else {
2915bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        while(*--s == '0');
2916bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        s++;
2917bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2918bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson  ret:
2919bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(S);
2920bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (mhi) {
2921bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        if (mlo && mlo != mhi)
2922bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson            Bfree(mlo);
2923bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(mhi);
2924bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    }
2925bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson  ret1:
2926bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    Bfree(b);
2927bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    *s = 0;
2928bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    *decpt = k + 1;
2929bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (rve)
2930bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        *rve = s;
2931bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return s0;
2932bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson  failed_malloc:
2933bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (S)
2934bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(S);
2935bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (mlo && mlo != mhi)
2936bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(mlo);
2937bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (mhi)
2938bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(mhi);
2939bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (b)
2940bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        Bfree(b);
2941bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    if (s0)
2942bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson        _Py_dg_freedtoa(s0);
2943bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson    return NULL;
2944bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
2945bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#ifdef __cplusplus
2946bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson}
2947bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif
2948bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson
2949bb28285ea2f01e97a26bc595d49da43fbee62913Mark Dickinson#endif  /* PY_NO_SHORT_FLOAT_REPR */
2950