Try to make test_wsgiref less fragile against environment changes by other tests
[python.git] / Python / dtoa.c
blob1cac9417487492a7ee18d3f66defca6895b51be0
1 /****************************************************************
3 * The author of this software is David M. Gay.
5 * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose without fee is hereby granted, provided that this entire notice
9 * is included in all copies of any software which is or includes a copy
10 * or modification of this software and in all copies of the supporting
11 * documentation for such software.
13 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
14 * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
15 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
16 * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
18 ***************************************************************/
20 /****************************************************************
21 * This is dtoa.c by David M. Gay, downloaded from
22 * http://www.netlib.org/fp/dtoa.c on April 15, 2009 and modified for
23 * inclusion into the Python core by Mark E. T. Dickinson and Eric V. Smith.
25 * Please remember to check http://www.netlib.org/fp regularly (and especially
26 * before any Python release) for bugfixes and updates.
28 * The major modifications from Gay's original code are as follows:
30 * 0. The original code has been specialized to Python's needs by removing
31 * many of the #ifdef'd sections. In particular, code to support VAX and
32 * IBM floating-point formats, hex NaNs, hex floats, locale-aware
33 * treatment of the decimal point, and setting of the inexact flag have
34 * been removed.
36 * 1. We use PyMem_Malloc and PyMem_Free in place of malloc and free.
38 * 2. The public functions strtod, dtoa and freedtoa all now have
39 * a _Py_dg_ prefix.
41 * 3. Instead of assuming that PyMem_Malloc always succeeds, we thread
42 * PyMem_Malloc failures through the code. The functions
44 * Balloc, multadd, s2b, i2b, mult, pow5mult, lshift, diff, d2b
46 * of return type *Bigint all return NULL to indicate a malloc failure.
47 * Similarly, rv_alloc and nrv_alloc (return type char *) return NULL on
48 * failure. bigcomp now has return type int (it used to be void) and
49 * returns -1 on failure and 0 otherwise. _Py_dg_dtoa returns NULL
50 * on failure. _Py_dg_strtod indicates failure due to malloc failure
51 * by returning -1.0, setting errno=ENOMEM and *se to s00.
53 * 4. The static variable dtoa_result has been removed. Callers of
54 * _Py_dg_dtoa are expected to call _Py_dg_freedtoa to free
55 * the memory allocated by _Py_dg_dtoa.
57 * 5. The code has been reformatted to better fit with Python's
58 * C style guide (PEP 7).
60 * 6. A bug in the memory allocation has been fixed: to avoid FREEing memory
61 * that hasn't been MALLOC'ed, private_mem should only be used when k <=
62 * Kmax.
64 * 7. _Py_dg_strtod has been modified so that it doesn't accept strings with
65 * leading whitespace.
67 ***************************************************************/
69 /* Please send bug reports for the original dtoa.c code to David M. Gay (dmg
70 * at acm dot org, with " at " changed at "@" and " dot " changed to ".").
71 * Please report bugs for this modified version using the Python issue tracker
72 * (http://bugs.python.org). */
74 /* On a machine with IEEE extended-precision registers, it is
75 * necessary to specify double-precision (53-bit) rounding precision
76 * before invoking strtod or dtoa. If the machine uses (the equivalent
77 * of) Intel 80x87 arithmetic, the call
78 * _control87(PC_53, MCW_PC);
79 * does this with many compilers. Whether this or another call is
80 * appropriate depends on the compiler; for this to work, it may be
81 * necessary to #include "float.h" or another system-dependent header
82 * file.
85 /* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
87 * This strtod returns a nearest machine number to the input decimal
88 * string (or sets errno to ERANGE). With IEEE arithmetic, ties are
89 * broken by the IEEE round-even rule. Otherwise ties are broken by
90 * biased rounding (add half and chop).
92 * Inspired loosely by William D. Clinger's paper "How to Read Floating
93 * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
95 * Modifications:
97 * 1. We only require IEEE, IBM, or VAX double-precision
98 * arithmetic (not IEEE double-extended).
99 * 2. We get by with floating-point arithmetic in a case that
100 * Clinger missed -- when we're computing d * 10^n
101 * for a small integer d and the integer n is not too
102 * much larger than 22 (the maximum integer k for which
103 * we can represent 10^k exactly), we may be able to
104 * compute (d*10^k) * 10^(e-k) with just one roundoff.
105 * 3. Rather than a bit-at-a-time adjustment of the binary
106 * result in the hard case, we use floating-point
107 * arithmetic to determine the adjustment to within
108 * one bit; only in really hard cases do we need to
109 * compute a second residual.
110 * 4. Because of 3., we don't need a large table of powers of 10
111 * for ten-to-e (just some small tables, e.g. of 10^k
112 * for 0 <= k <= 22).
115 /* Linking of Python's #defines to Gay's #defines starts here. */
117 #include "Python.h"
119 /* if PY_NO_SHORT_FLOAT_REPR is defined, then don't even try to compile
120 the following code */
121 #ifndef PY_NO_SHORT_FLOAT_REPR
123 #include "float.h"
125 #define MALLOC PyMem_Malloc
126 #define FREE PyMem_Free
128 /* This code should also work for ARM mixed-endian format on little-endian
129 machines, where doubles have byte order 45670123 (in increasing address
130 order, 0 being the least significant byte). */
131 #ifdef DOUBLE_IS_LITTLE_ENDIAN_IEEE754
132 # define IEEE_8087
133 #endif
134 #if defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) || \
135 defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754)
136 # define IEEE_MC68k
137 #endif
138 #if defined(IEEE_8087) + defined(IEEE_MC68k) != 1
139 #error "Exactly one of IEEE_8087 or IEEE_MC68k should be defined."
140 #endif
142 /* The code below assumes that the endianness of integers matches the
143 endianness of the two 32-bit words of a double. Check this. */
144 #if defined(WORDS_BIGENDIAN) && (defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) || \
145 defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754))
146 #error "doubles and ints have incompatible endianness"
147 #endif
149 #if !defined(WORDS_BIGENDIAN) && defined(DOUBLE_IS_BIG_ENDIAN_IEEE754)
150 #error "doubles and ints have incompatible endianness"
151 #endif
154 #if defined(HAVE_UINT32_T) && defined(HAVE_INT32_T)
155 typedef PY_UINT32_T ULong;
156 typedef PY_INT32_T Long;
157 #else
158 #error "Failed to find an exact-width 32-bit integer type"
159 #endif
161 #if defined(HAVE_UINT64_T)
162 #define ULLong PY_UINT64_T
163 #else
164 #undef ULLong
165 #endif
167 #undef DEBUG
168 #ifdef Py_DEBUG
169 #define DEBUG
170 #endif
172 /* End Python #define linking */
174 #ifdef DEBUG
175 #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
176 #endif
178 #ifndef PRIVATE_MEM
179 #define PRIVATE_MEM 2304
180 #endif
181 #define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
182 static double private_mem[PRIVATE_mem], *pmem_next = private_mem;
184 #ifdef __cplusplus
185 extern "C" {
186 #endif
188 typedef union { double d; ULong L[2]; } U;
190 #ifdef IEEE_8087
191 #define word0(x) (x)->L[1]
192 #define word1(x) (x)->L[0]
193 #else
194 #define word0(x) (x)->L[0]
195 #define word1(x) (x)->L[1]
196 #endif
197 #define dval(x) (x)->d
199 #ifndef STRTOD_DIGLIM
200 #define STRTOD_DIGLIM 40
201 #endif
203 #ifdef DIGLIM_DEBUG
204 extern int strtod_diglim;
205 #else
206 #define strtod_diglim STRTOD_DIGLIM
207 #endif
209 /* The following definition of Storeinc is appropriate for MIPS processors.
210 * An alternative that might be better on some machines is
211 * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
213 #if defined(IEEE_8087)
214 #define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
215 ((unsigned short *)a)[0] = (unsigned short)c, a++)
216 #else
217 #define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
218 ((unsigned short *)a)[1] = (unsigned short)c, a++)
219 #endif
221 /* #define P DBL_MANT_DIG */
222 /* Ten_pmax = floor(P*log(2)/log(5)) */
223 /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
224 /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
225 /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
227 #define Exp_shift 20
228 #define Exp_shift1 20
229 #define Exp_msk1 0x100000
230 #define Exp_msk11 0x100000
231 #define Exp_mask 0x7ff00000
232 #define P 53
233 #define Nbits 53
234 #define Bias 1023
235 #define Emax 1023
236 #define Emin (-1022)
237 #define Exp_1 0x3ff00000
238 #define Exp_11 0x3ff00000
239 #define Ebits 11
240 #define Frac_mask 0xfffff
241 #define Frac_mask1 0xfffff
242 #define Ten_pmax 22
243 #define Bletch 0x10
244 #define Bndry_mask 0xfffff
245 #define Bndry_mask1 0xfffff
246 #define LSB 1
247 #define Sign_bit 0x80000000
248 #define Log2P 1
249 #define Tiny0 0
250 #define Tiny1 1
251 #define Quick_max 14
252 #define Int_max 14
254 #ifndef Flt_Rounds
255 #ifdef FLT_ROUNDS
256 #define Flt_Rounds FLT_ROUNDS
257 #else
258 #define Flt_Rounds 1
259 #endif
260 #endif /*Flt_Rounds*/
262 #define Rounding Flt_Rounds
264 #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
265 #define Big1 0xffffffff
267 /* struct BCinfo is used to pass information from _Py_dg_strtod to bigcomp */
269 typedef struct BCinfo BCinfo;
270 struct
271 BCinfo {
272 int dp0, dp1, dplen, dsign, e0, inexact;
273 int nd, nd0, rounding, scale, uflchk;
276 #define FFFFFFFF 0xffffffffUL
278 #define Kmax 7
280 /* struct Bigint is used to represent arbitrary-precision integers. These
281 integers are stored in sign-magnitude format, with the magnitude stored as
282 an array of base 2**32 digits. Bigints are always normalized: if x is a
283 Bigint then x->wds >= 1, and either x->wds == 1 or x[wds-1] is nonzero.
285 The Bigint fields are as follows:
287 - next is a header used by Balloc and Bfree to keep track of lists
288 of freed Bigints; it's also used for the linked list of
289 powers of 5 of the form 5**2**i used by pow5mult.
290 - k indicates which pool this Bigint was allocated from
291 - maxwds is the maximum number of words space was allocated for
292 (usually maxwds == 2**k)
293 - sign is 1 for negative Bigints, 0 for positive. The sign is unused
294 (ignored on inputs, set to 0 on outputs) in almost all operations
295 involving Bigints: a notable exception is the diff function, which
296 ignores signs on inputs but sets the sign of the output correctly.
297 - wds is the actual number of significant words
298 - x contains the vector of words (digits) for this Bigint, from least
299 significant (x[0]) to most significant (x[wds-1]).
302 struct
303 Bigint {
304 struct Bigint *next;
305 int k, maxwds, sign, wds;
306 ULong x[1];
309 typedef struct Bigint Bigint;
311 /* Memory management: memory is allocated from, and returned to, Kmax+1 pools
312 of memory, where pool k (0 <= k <= Kmax) is for Bigints b with b->maxwds ==
313 1 << k. These pools are maintained as linked lists, with freelist[k]
314 pointing to the head of the list for pool k.
316 On allocation, if there's no free slot in the appropriate pool, MALLOC is
317 called to get more memory. This memory is not returned to the system until
318 Python quits. There's also a private memory pool that's allocated from
319 in preference to using MALLOC.
321 For Bigints with more than (1 << Kmax) digits (which implies at least 1233
322 decimal digits), memory is directly allocated using MALLOC, and freed using
323 FREE.
325 XXX: it would be easy to bypass this memory-management system and
326 translate each call to Balloc into a call to PyMem_Malloc, and each
327 Bfree to PyMem_Free. Investigate whether this has any significant
328 performance on impact. */
330 static Bigint *freelist[Kmax+1];
332 /* Allocate space for a Bigint with up to 1<<k digits */
334 static Bigint *
335 Balloc(int k)
337 int x;
338 Bigint *rv;
339 unsigned int len;
341 if (k <= Kmax && (rv = freelist[k]))
342 freelist[k] = rv->next;
343 else {
344 x = 1 << k;
345 len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
346 /sizeof(double);
347 if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {
348 rv = (Bigint*)pmem_next;
349 pmem_next += len;
351 else {
352 rv = (Bigint*)MALLOC(len*sizeof(double));
353 if (rv == NULL)
354 return NULL;
356 rv->k = k;
357 rv->maxwds = x;
359 rv->sign = rv->wds = 0;
360 return rv;
363 /* Free a Bigint allocated with Balloc */
365 static void
366 Bfree(Bigint *v)
368 if (v) {
369 if (v->k > Kmax)
370 FREE((void*)v);
371 else {
372 v->next = freelist[v->k];
373 freelist[v->k] = v;
378 #define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
379 y->wds*sizeof(Long) + 2*sizeof(int))
381 /* Multiply a Bigint b by m and add a. Either modifies b in place and returns
382 a pointer to the modified b, or Bfrees b and returns a pointer to a copy.
383 On failure, return NULL. In this case, b will have been already freed. */
385 static Bigint *
386 multadd(Bigint *b, int m, int a) /* multiply by m and add a */
388 int i, wds;
389 #ifdef ULLong
390 ULong *x;
391 ULLong carry, y;
392 #else
393 ULong carry, *x, y;
394 ULong xi, z;
395 #endif
396 Bigint *b1;
398 wds = b->wds;
399 x = b->x;
400 i = 0;
401 carry = a;
402 do {
403 #ifdef ULLong
404 y = *x * (ULLong)m + carry;
405 carry = y >> 32;
406 *x++ = (ULong)(y & FFFFFFFF);
407 #else
408 xi = *x;
409 y = (xi & 0xffff) * m + carry;
410 z = (xi >> 16) * m + (y >> 16);
411 carry = z >> 16;
412 *x++ = (z << 16) + (y & 0xffff);
413 #endif
415 while(++i < wds);
416 if (carry) {
417 if (wds >= b->maxwds) {
418 b1 = Balloc(b->k+1);
419 if (b1 == NULL){
420 Bfree(b);
421 return NULL;
423 Bcopy(b1, b);
424 Bfree(b);
425 b = b1;
427 b->x[wds++] = (ULong)carry;
428 b->wds = wds;
430 return b;
433 /* convert a string s containing nd decimal digits (possibly containing a
434 decimal separator at position nd0, which is ignored) to a Bigint. This
435 function carries on where the parsing code in _Py_dg_strtod leaves off: on
436 entry, y9 contains the result of converting the first 9 digits. Returns
437 NULL on failure. */
439 static Bigint *
440 s2b(const char *s, int nd0, int nd, ULong y9, int dplen)
442 Bigint *b;
443 int i, k;
444 Long x, y;
446 x = (nd + 8) / 9;
447 for(k = 0, y = 1; x > y; y <<= 1, k++) ;
448 b = Balloc(k);
449 if (b == NULL)
450 return NULL;
451 b->x[0] = y9;
452 b->wds = 1;
454 i = 9;
455 if (9 < nd0) {
456 s += 9;
457 do {
458 b = multadd(b, 10, *s++ - '0');
459 if (b == NULL)
460 return NULL;
461 } while(++i < nd0);
462 s += dplen;
464 else
465 s += dplen + 9;
466 for(; i < nd; i++) {
467 b = multadd(b, 10, *s++ - '0');
468 if (b == NULL)
469 return NULL;
471 return b;
474 /* count leading 0 bits in the 32-bit integer x. */
476 static int
477 hi0bits(ULong x)
479 int k = 0;
481 if (!(x & 0xffff0000)) {
482 k = 16;
483 x <<= 16;
485 if (!(x & 0xff000000)) {
486 k += 8;
487 x <<= 8;
489 if (!(x & 0xf0000000)) {
490 k += 4;
491 x <<= 4;
493 if (!(x & 0xc0000000)) {
494 k += 2;
495 x <<= 2;
497 if (!(x & 0x80000000)) {
498 k++;
499 if (!(x & 0x40000000))
500 return 32;
502 return k;
505 /* count trailing 0 bits in the 32-bit integer y, and shift y right by that
506 number of bits. */
508 static int
509 lo0bits(ULong *y)
511 int k;
512 ULong x = *y;
514 if (x & 7) {
515 if (x & 1)
516 return 0;
517 if (x & 2) {
518 *y = x >> 1;
519 return 1;
521 *y = x >> 2;
522 return 2;
524 k = 0;
525 if (!(x & 0xffff)) {
526 k = 16;
527 x >>= 16;
529 if (!(x & 0xff)) {
530 k += 8;
531 x >>= 8;
533 if (!(x & 0xf)) {
534 k += 4;
535 x >>= 4;
537 if (!(x & 0x3)) {
538 k += 2;
539 x >>= 2;
541 if (!(x & 1)) {
542 k++;
543 x >>= 1;
544 if (!x)
545 return 32;
547 *y = x;
548 return k;
551 /* convert a small nonnegative integer to a Bigint */
553 static Bigint *
554 i2b(int i)
556 Bigint *b;
558 b = Balloc(1);
559 if (b == NULL)
560 return NULL;
561 b->x[0] = i;
562 b->wds = 1;
563 return b;
566 /* multiply two Bigints. Returns a new Bigint, or NULL on failure. Ignores
567 the signs of a and b. */
569 static Bigint *
570 mult(Bigint *a, Bigint *b)
572 Bigint *c;
573 int k, wa, wb, wc;
574 ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
575 ULong y;
576 #ifdef ULLong
577 ULLong carry, z;
578 #else
579 ULong carry, z;
580 ULong z2;
581 #endif
583 if (a->wds < b->wds) {
584 c = a;
585 a = b;
586 b = c;
588 k = a->k;
589 wa = a->wds;
590 wb = b->wds;
591 wc = wa + wb;
592 if (wc > a->maxwds)
593 k++;
594 c = Balloc(k);
595 if (c == NULL)
596 return NULL;
597 for(x = c->x, xa = x + wc; x < xa; x++)
598 *x = 0;
599 xa = a->x;
600 xae = xa + wa;
601 xb = b->x;
602 xbe = xb + wb;
603 xc0 = c->x;
604 #ifdef ULLong
605 for(; xb < xbe; xc0++) {
606 if ((y = *xb++)) {
607 x = xa;
608 xc = xc0;
609 carry = 0;
610 do {
611 z = *x++ * (ULLong)y + *xc + carry;
612 carry = z >> 32;
613 *xc++ = (ULong)(z & FFFFFFFF);
615 while(x < xae);
616 *xc = (ULong)carry;
619 #else
620 for(; xb < xbe; xb++, xc0++) {
621 if (y = *xb & 0xffff) {
622 x = xa;
623 xc = xc0;
624 carry = 0;
625 do {
626 z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
627 carry = z >> 16;
628 z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
629 carry = z2 >> 16;
630 Storeinc(xc, z2, z);
632 while(x < xae);
633 *xc = carry;
635 if (y = *xb >> 16) {
636 x = xa;
637 xc = xc0;
638 carry = 0;
639 z2 = *xc;
640 do {
641 z = (*x & 0xffff) * y + (*xc >> 16) + carry;
642 carry = z >> 16;
643 Storeinc(xc, z, z2);
644 z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
645 carry = z2 >> 16;
647 while(x < xae);
648 *xc = z2;
651 #endif
652 for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
653 c->wds = wc;
654 return c;
657 /* p5s is a linked list of powers of 5 of the form 5**(2**i), i >= 2 */
659 static Bigint *p5s;
661 /* multiply the Bigint b by 5**k. Returns a pointer to the result, or NULL on
662 failure; if the returned pointer is distinct from b then the original
663 Bigint b will have been Bfree'd. Ignores the sign of b. */
665 static Bigint *
666 pow5mult(Bigint *b, int k)
668 Bigint *b1, *p5, *p51;
669 int i;
670 static int p05[3] = { 5, 25, 125 };
672 if ((i = k & 3)) {
673 b = multadd(b, p05[i-1], 0);
674 if (b == NULL)
675 return NULL;
678 if (!(k >>= 2))
679 return b;
680 p5 = p5s;
681 if (!p5) {
682 /* first time */
683 p5 = i2b(625);
684 if (p5 == NULL) {
685 Bfree(b);
686 return NULL;
688 p5s = p5;
689 p5->next = 0;
691 for(;;) {
692 if (k & 1) {
693 b1 = mult(b, p5);
694 Bfree(b);
695 b = b1;
696 if (b == NULL)
697 return NULL;
699 if (!(k >>= 1))
700 break;
701 p51 = p5->next;
702 if (!p51) {
703 p51 = mult(p5,p5);
704 if (p51 == NULL) {
705 Bfree(b);
706 return NULL;
708 p51->next = 0;
709 p5->next = p51;
711 p5 = p51;
713 return b;
716 /* shift a Bigint b left by k bits. Return a pointer to the shifted result,
717 or NULL on failure. If the returned pointer is distinct from b then the
718 original b will have been Bfree'd. Ignores the sign of b. */
720 static Bigint *
721 lshift(Bigint *b, int k)
723 int i, k1, n, n1;
724 Bigint *b1;
725 ULong *x, *x1, *xe, z;
727 n = k >> 5;
728 k1 = b->k;
729 n1 = n + b->wds + 1;
730 for(i = b->maxwds; n1 > i; i <<= 1)
731 k1++;
732 b1 = Balloc(k1);
733 if (b1 == NULL) {
734 Bfree(b);
735 return NULL;
737 x1 = b1->x;
738 for(i = 0; i < n; i++)
739 *x1++ = 0;
740 x = b->x;
741 xe = x + b->wds;
742 if (k &= 0x1f) {
743 k1 = 32 - k;
744 z = 0;
745 do {
746 *x1++ = *x << k | z;
747 z = *x++ >> k1;
749 while(x < xe);
750 if ((*x1 = z))
751 ++n1;
753 else do
754 *x1++ = *x++;
755 while(x < xe);
756 b1->wds = n1 - 1;
757 Bfree(b);
758 return b1;
761 /* Do a three-way compare of a and b, returning -1 if a < b, 0 if a == b and
762 1 if a > b. Ignores signs of a and b. */
764 static int
765 cmp(Bigint *a, Bigint *b)
767 ULong *xa, *xa0, *xb, *xb0;
768 int i, j;
770 i = a->wds;
771 j = b->wds;
772 #ifdef DEBUG
773 if (i > 1 && !a->x[i-1])
774 Bug("cmp called with a->x[a->wds-1] == 0");
775 if (j > 1 && !b->x[j-1])
776 Bug("cmp called with b->x[b->wds-1] == 0");
777 #endif
778 if (i -= j)
779 return i;
780 xa0 = a->x;
781 xa = xa0 + j;
782 xb0 = b->x;
783 xb = xb0 + j;
784 for(;;) {
785 if (*--xa != *--xb)
786 return *xa < *xb ? -1 : 1;
787 if (xa <= xa0)
788 break;
790 return 0;
793 /* Take the difference of Bigints a and b, returning a new Bigint. Returns
794 NULL on failure. The signs of a and b are ignored, but the sign of the
795 result is set appropriately. */
797 static Bigint *
798 diff(Bigint *a, Bigint *b)
800 Bigint *c;
801 int i, wa, wb;
802 ULong *xa, *xae, *xb, *xbe, *xc;
803 #ifdef ULLong
804 ULLong borrow, y;
805 #else
806 ULong borrow, y;
807 ULong z;
808 #endif
810 i = cmp(a,b);
811 if (!i) {
812 c = Balloc(0);
813 if (c == NULL)
814 return NULL;
815 c->wds = 1;
816 c->x[0] = 0;
817 return c;
819 if (i < 0) {
820 c = a;
821 a = b;
822 b = c;
823 i = 1;
825 else
826 i = 0;
827 c = Balloc(a->k);
828 if (c == NULL)
829 return NULL;
830 c->sign = i;
831 wa = a->wds;
832 xa = a->x;
833 xae = xa + wa;
834 wb = b->wds;
835 xb = b->x;
836 xbe = xb + wb;
837 xc = c->x;
838 borrow = 0;
839 #ifdef ULLong
840 do {
841 y = (ULLong)*xa++ - *xb++ - borrow;
842 borrow = y >> 32 & (ULong)1;
843 *xc++ = (ULong)(y & FFFFFFFF);
845 while(xb < xbe);
846 while(xa < xae) {
847 y = *xa++ - borrow;
848 borrow = y >> 32 & (ULong)1;
849 *xc++ = (ULong)(y & FFFFFFFF);
851 #else
852 do {
853 y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
854 borrow = (y & 0x10000) >> 16;
855 z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
856 borrow = (z & 0x10000) >> 16;
857 Storeinc(xc, z, y);
859 while(xb < xbe);
860 while(xa < xae) {
861 y = (*xa & 0xffff) - borrow;
862 borrow = (y & 0x10000) >> 16;
863 z = (*xa++ >> 16) - borrow;
864 borrow = (z & 0x10000) >> 16;
865 Storeinc(xc, z, y);
867 #endif
868 while(!*--xc)
869 wa--;
870 c->wds = wa;
871 return c;
874 /* Given a positive normal double x, return the difference between x and the next
875 double up. Doesn't give correct results for subnormals. */
877 static double
878 ulp(U *x)
880 Long L;
881 U u;
883 L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
884 word0(&u) = L;
885 word1(&u) = 0;
886 return dval(&u);
889 /* Convert a Bigint to a double plus an exponent */
891 static double
892 b2d(Bigint *a, int *e)
894 ULong *xa, *xa0, w, y, z;
895 int k;
896 U d;
898 xa0 = a->x;
899 xa = xa0 + a->wds;
900 y = *--xa;
901 #ifdef DEBUG
902 if (!y) Bug("zero y in b2d");
903 #endif
904 k = hi0bits(y);
905 *e = 32 - k;
906 if (k < Ebits) {
907 word0(&d) = Exp_1 | y >> (Ebits - k);
908 w = xa > xa0 ? *--xa : 0;
909 word1(&d) = y << ((32-Ebits) + k) | w >> (Ebits - k);
910 goto ret_d;
912 z = xa > xa0 ? *--xa : 0;
913 if (k -= Ebits) {
914 word0(&d) = Exp_1 | y << k | z >> (32 - k);
915 y = xa > xa0 ? *--xa : 0;
916 word1(&d) = z << k | y >> (32 - k);
918 else {
919 word0(&d) = Exp_1 | y;
920 word1(&d) = z;
922 ret_d:
923 return dval(&d);
926 /* Convert a double to a Bigint plus an exponent. Return NULL on failure.
928 Given a finite nonzero double d, return an odd Bigint b and exponent *e
929 such that fabs(d) = b * 2**e. On return, *bbits gives the number of
930 significant bits of e; that is, 2**(*bbits-1) <= b < 2**(*bbits).
932 If d is zero, then b == 0, *e == -1010, *bbits = 0.
936 static Bigint *
937 d2b(U *d, int *e, int *bits)
939 Bigint *b;
940 int de, k;
941 ULong *x, y, z;
942 int i;
944 b = Balloc(1);
945 if (b == NULL)
946 return NULL;
947 x = b->x;
949 z = word0(d) & Frac_mask;
950 word0(d) &= 0x7fffffff; /* clear sign bit, which we ignore */
951 if ((de = (int)(word0(d) >> Exp_shift)))
952 z |= Exp_msk1;
953 if ((y = word1(d))) {
954 if ((k = lo0bits(&y))) {
955 x[0] = y | z << (32 - k);
956 z >>= k;
958 else
959 x[0] = y;
961 b->wds = (x[1] = z) ? 2 : 1;
963 else {
964 k = lo0bits(&z);
965 x[0] = z;
967 b->wds = 1;
968 k += 32;
970 if (de) {
971 *e = de - Bias - (P-1) + k;
972 *bits = P - k;
974 else {
975 *e = de - Bias - (P-1) + 1 + k;
976 *bits = 32*i - hi0bits(x[i-1]);
978 return b;
981 /* Compute the ratio of two Bigints, as a double. The result may have an
982 error of up to 2.5 ulps. */
984 static double
985 ratio(Bigint *a, Bigint *b)
987 U da, db;
988 int k, ka, kb;
990 dval(&da) = b2d(a, &ka);
991 dval(&db) = b2d(b, &kb);
992 k = ka - kb + 32*(a->wds - b->wds);
993 if (k > 0)
994 word0(&da) += k*Exp_msk1;
995 else {
996 k = -k;
997 word0(&db) += k*Exp_msk1;
999 return dval(&da) / dval(&db);
1002 static const double
1003 tens[] = {
1004 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1005 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1006 1e20, 1e21, 1e22
1009 static const double
1010 bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
1011 static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
1012 9007199254740992.*9007199254740992.e-256
1013 /* = 2^106 * 1e-256 */
1015 /* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */
1016 /* flag unnecessarily. It leads to a song and dance at the end of strtod. */
1017 #define Scale_Bit 0x10
1018 #define n_bigtens 5
1020 #define ULbits 32
1021 #define kshift 5
1022 #define kmask 31
1025 static int
1026 dshift(Bigint *b, int p2)
1028 int rv = hi0bits(b->x[b->wds-1]) - 4;
1029 if (p2 > 0)
1030 rv -= p2;
1031 return rv & kmask;
1034 /* special case of Bigint division. The quotient is always in the range 0 <=
1035 quotient < 10, and on entry the divisor S is normalized so that its top 4
1036 bits (28--31) are zero and bit 27 is set. */
1038 static int
1039 quorem(Bigint *b, Bigint *S)
1041 int n;
1042 ULong *bx, *bxe, q, *sx, *sxe;
1043 #ifdef ULLong
1044 ULLong borrow, carry, y, ys;
1045 #else
1046 ULong borrow, carry, y, ys;
1047 ULong si, z, zs;
1048 #endif
1050 n = S->wds;
1051 #ifdef DEBUG
1052 /*debug*/ if (b->wds > n)
1053 /*debug*/ Bug("oversize b in quorem");
1054 #endif
1055 if (b->wds < n)
1056 return 0;
1057 sx = S->x;
1058 sxe = sx + --n;
1059 bx = b->x;
1060 bxe = bx + n;
1061 q = *bxe / (*sxe + 1); /* ensure q <= true quotient */
1062 #ifdef DEBUG
1063 /*debug*/ if (q > 9)
1064 /*debug*/ Bug("oversized quotient in quorem");
1065 #endif
1066 if (q) {
1067 borrow = 0;
1068 carry = 0;
1069 do {
1070 #ifdef ULLong
1071 ys = *sx++ * (ULLong)q + carry;
1072 carry = ys >> 32;
1073 y = *bx - (ys & FFFFFFFF) - borrow;
1074 borrow = y >> 32 & (ULong)1;
1075 *bx++ = (ULong)(y & FFFFFFFF);
1076 #else
1077 si = *sx++;
1078 ys = (si & 0xffff) * q + carry;
1079 zs = (si >> 16) * q + (ys >> 16);
1080 carry = zs >> 16;
1081 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
1082 borrow = (y & 0x10000) >> 16;
1083 z = (*bx >> 16) - (zs & 0xffff) - borrow;
1084 borrow = (z & 0x10000) >> 16;
1085 Storeinc(bx, z, y);
1086 #endif
1088 while(sx <= sxe);
1089 if (!*bxe) {
1090 bx = b->x;
1091 while(--bxe > bx && !*bxe)
1092 --n;
1093 b->wds = n;
1096 if (cmp(b, S) >= 0) {
1097 q++;
1098 borrow = 0;
1099 carry = 0;
1100 bx = b->x;
1101 sx = S->x;
1102 do {
1103 #ifdef ULLong
1104 ys = *sx++ + carry;
1105 carry = ys >> 32;
1106 y = *bx - (ys & FFFFFFFF) - borrow;
1107 borrow = y >> 32 & (ULong)1;
1108 *bx++ = (ULong)(y & FFFFFFFF);
1109 #else
1110 si = *sx++;
1111 ys = (si & 0xffff) + carry;
1112 zs = (si >> 16) + (ys >> 16);
1113 carry = zs >> 16;
1114 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
1115 borrow = (y & 0x10000) >> 16;
1116 z = (*bx >> 16) - (zs & 0xffff) - borrow;
1117 borrow = (z & 0x10000) >> 16;
1118 Storeinc(bx, z, y);
1119 #endif
1121 while(sx <= sxe);
1122 bx = b->x;
1123 bxe = bx + n;
1124 if (!*bxe) {
1125 while(--bxe > bx && !*bxe)
1126 --n;
1127 b->wds = n;
1130 return q;
1134 /* return 0 on success, -1 on failure */
1136 static int
1137 bigcomp(U *rv, const char *s0, BCinfo *bc)
1139 Bigint *b, *d;
1140 int b2, bbits, d2, dd, dig, dsign, i, j, nd, nd0, p2, p5, speccase;
1142 dsign = bc->dsign;
1143 nd = bc->nd;
1144 nd0 = bc->nd0;
1145 p5 = nd + bc->e0 - 1;
1146 speccase = 0;
1147 if (rv->d == 0.) { /* special case: value near underflow-to-zero */
1148 /* threshold was rounded to zero */
1149 b = i2b(1);
1150 if (b == NULL)
1151 return -1;
1152 p2 = Emin - P + 1;
1153 bbits = 1;
1154 word0(rv) = (P+2) << Exp_shift;
1155 i = 0;
1157 speccase = 1;
1158 --p2;
1159 dsign = 0;
1160 goto have_i;
1163 else
1165 b = d2b(rv, &p2, &bbits);
1166 if (b == NULL)
1167 return -1;
1169 p2 -= bc->scale;
1170 /* floor(log2(rv)) == bbits - 1 + p2 */
1171 /* Check for denormal case. */
1172 i = P - bbits;
1173 if (i > (j = P - Emin - 1 + p2)) {
1174 i = j;
1177 b = lshift(b, ++i);
1178 if (b == NULL)
1179 return -1;
1180 b->x[0] |= 1;
1182 have_i:
1183 p2 -= p5 + i;
1184 d = i2b(1);
1185 if (d == NULL) {
1186 Bfree(b);
1187 return -1;
1189 /* Arrange for convenient computation of quotients:
1190 * shift left if necessary so divisor has 4 leading 0 bits.
1192 if (p5 > 0) {
1193 d = pow5mult(d, p5);
1194 if (d == NULL) {
1195 Bfree(b);
1196 return -1;
1199 else if (p5 < 0) {
1200 b = pow5mult(b, -p5);
1201 if (b == NULL) {
1202 Bfree(d);
1203 return -1;
1206 if (p2 > 0) {
1207 b2 = p2;
1208 d2 = 0;
1210 else {
1211 b2 = 0;
1212 d2 = -p2;
1214 i = dshift(d, d2);
1215 if ((b2 += i) > 0) {
1216 b = lshift(b, b2);
1217 if (b == NULL) {
1218 Bfree(d);
1219 return -1;
1222 if ((d2 += i) > 0) {
1223 d = lshift(d, d2);
1224 if (d == NULL) {
1225 Bfree(b);
1226 return -1;
1230 /* Now b/d = exactly half-way between the two floating-point values */
1231 /* on either side of the input string. Compute first digit of b/d. */
1233 if (!(dig = quorem(b,d))) {
1234 b = multadd(b, 10, 0); /* very unlikely */
1235 if (b == NULL) {
1236 Bfree(d);
1237 return -1;
1239 dig = quorem(b,d);
1242 /* Compare b/d with s0 */
1244 assert(nd > 0);
1245 dd = 9999; /* silence gcc compiler warning */
1246 for(i = 0; i < nd0; ) {
1247 if ((dd = s0[i++] - '0' - dig))
1248 goto ret;
1249 if (!b->x[0] && b->wds == 1) {
1250 if (i < nd)
1251 dd = 1;
1252 goto ret;
1254 b = multadd(b, 10, 0);
1255 if (b == NULL) {
1256 Bfree(d);
1257 return -1;
1259 dig = quorem(b,d);
1261 for(j = bc->dp1; i++ < nd;) {
1262 if ((dd = s0[j++] - '0' - dig))
1263 goto ret;
1264 if (!b->x[0] && b->wds == 1) {
1265 if (i < nd)
1266 dd = 1;
1267 goto ret;
1269 b = multadd(b, 10, 0);
1270 if (b == NULL) {
1271 Bfree(d);
1272 return -1;
1274 dig = quorem(b,d);
1276 if (b->x[0] || b->wds > 1)
1277 dd = -1;
1278 ret:
1279 Bfree(b);
1280 Bfree(d);
1281 if (speccase) {
1282 if (dd <= 0)
1283 rv->d = 0.;
1285 else if (dd < 0) {
1286 if (!dsign) /* does not happen for round-near */
1287 retlow1:
1288 dval(rv) -= ulp(rv);
1290 else if (dd > 0) {
1291 if (dsign) {
1292 rethi1:
1293 dval(rv) += ulp(rv);
1296 else {
1297 /* Exact half-way case: apply round-even rule. */
1298 if (word1(rv) & 1) {
1299 if (dsign)
1300 goto rethi1;
1301 goto retlow1;
1305 return 0;
1308 double
1309 _Py_dg_strtod(const char *s00, char **se)
1311 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, e, e1, error;
1312 int esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
1313 const char *s, *s0, *s1;
1314 double aadj, aadj1;
1315 Long L;
1316 U aadj2, adj, rv, rv0;
1317 ULong y, z;
1318 BCinfo bc;
1319 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
1321 sign = nz0 = nz = bc.dplen = bc.uflchk = 0;
1322 dval(&rv) = 0.;
1323 for(s = s00;;s++) switch(*s) {
1324 case '-':
1325 sign = 1;
1326 /* no break */
1327 case '+':
1328 if (*++s)
1329 goto break2;
1330 /* no break */
1331 case 0:
1332 goto ret0;
1333 /* modify original dtoa.c so that it doesn't accept leading whitespace
1334 case '\t':
1335 case '\n':
1336 case '\v':
1337 case '\f':
1338 case '\r':
1339 case ' ':
1340 continue;
1342 default:
1343 goto break2;
1345 break2:
1346 if (*s == '0') {
1347 nz0 = 1;
1348 while(*++s == '0') ;
1349 if (!*s)
1350 goto ret;
1352 s0 = s;
1353 y = z = 0;
1354 for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
1355 if (nd < 9)
1356 y = 10*y + c - '0';
1357 else if (nd < 16)
1358 z = 10*z + c - '0';
1359 nd0 = nd;
1360 bc.dp0 = bc.dp1 = s - s0;
1361 if (c == '.') {
1362 c = *++s;
1363 bc.dp1 = s - s0;
1364 bc.dplen = bc.dp1 - bc.dp0;
1365 if (!nd) {
1366 for(; c == '0'; c = *++s)
1367 nz++;
1368 if (c > '0' && c <= '9') {
1369 s0 = s;
1370 nf += nz;
1371 nz = 0;
1372 goto have_dig;
1374 goto dig_done;
1376 for(; c >= '0' && c <= '9'; c = *++s) {
1377 have_dig:
1378 nz++;
1379 if (c -= '0') {
1380 nf += nz;
1381 for(i = 1; i < nz; i++)
1382 if (nd++ < 9)
1383 y *= 10;
1384 else if (nd <= DBL_DIG + 1)
1385 z *= 10;
1386 if (nd++ < 9)
1387 y = 10*y + c;
1388 else if (nd <= DBL_DIG + 1)
1389 z = 10*z + c;
1390 nz = 0;
1394 dig_done:
1395 e = 0;
1396 if (c == 'e' || c == 'E') {
1397 if (!nd && !nz && !nz0) {
1398 goto ret0;
1400 s00 = s;
1401 esign = 0;
1402 switch(c = *++s) {
1403 case '-':
1404 esign = 1;
1405 case '+':
1406 c = *++s;
1408 if (c >= '0' && c <= '9') {
1409 while(c == '0')
1410 c = *++s;
1411 if (c > '0' && c <= '9') {
1412 L = c - '0';
1413 s1 = s;
1414 while((c = *++s) >= '0' && c <= '9')
1415 L = 10*L + c - '0';
1416 if (s - s1 > 8 || L > 19999)
1417 /* Avoid confusion from exponents
1418 * so large that e might overflow.
1420 e = 19999; /* safe for 16 bit ints */
1421 else
1422 e = (int)L;
1423 if (esign)
1424 e = -e;
1426 else
1427 e = 0;
1429 else
1430 s = s00;
1432 if (!nd) {
1433 if (!nz && !nz0) {
1434 ret0:
1435 s = s00;
1436 sign = 0;
1438 goto ret;
1440 bc.e0 = e1 = e -= nf;
1442 /* Now we have nd0 digits, starting at s0, followed by a
1443 * decimal point, followed by nd-nd0 digits. The number we're
1444 * after is the integer represented by those digits times
1445 * 10**e */
1447 if (!nd0)
1448 nd0 = nd;
1449 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
1450 dval(&rv) = y;
1451 if (k > 9) {
1452 dval(&rv) = tens[k - 9] * dval(&rv) + z;
1454 bd0 = 0;
1455 if (nd <= DBL_DIG
1456 && Flt_Rounds == 1
1458 if (!e)
1459 goto ret;
1460 if (e > 0) {
1461 if (e <= Ten_pmax) {
1462 dval(&rv) *= tens[e];
1463 goto ret;
1465 i = DBL_DIG - nd;
1466 if (e <= Ten_pmax + i) {
1467 /* A fancier test would sometimes let us do
1468 * this for larger i values.
1470 e -= i;
1471 dval(&rv) *= tens[i];
1472 dval(&rv) *= tens[e];
1473 goto ret;
1476 else if (e >= -Ten_pmax) {
1477 dval(&rv) /= tens[-e];
1478 goto ret;
1481 e1 += nd - k;
1483 bc.scale = 0;
1485 /* Get starting approximation = rv * 10**e1 */
1487 if (e1 > 0) {
1488 if ((i = e1 & 15))
1489 dval(&rv) *= tens[i];
1490 if (e1 &= ~15) {
1491 if (e1 > DBL_MAX_10_EXP) {
1492 ovfl:
1493 errno = ERANGE;
1494 /* Can't trust HUGE_VAL */
1495 word0(&rv) = Exp_mask;
1496 word1(&rv) = 0;
1497 goto ret;
1499 e1 >>= 4;
1500 for(j = 0; e1 > 1; j++, e1 >>= 1)
1501 if (e1 & 1)
1502 dval(&rv) *= bigtens[j];
1503 /* The last multiplication could overflow. */
1504 word0(&rv) -= P*Exp_msk1;
1505 dval(&rv) *= bigtens[j];
1506 if ((z = word0(&rv) & Exp_mask)
1507 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
1508 goto ovfl;
1509 if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
1510 /* set to largest number */
1511 /* (Can't trust DBL_MAX) */
1512 word0(&rv) = Big0;
1513 word1(&rv) = Big1;
1515 else
1516 word0(&rv) += P*Exp_msk1;
1519 else if (e1 < 0) {
1520 e1 = -e1;
1521 if ((i = e1 & 15))
1522 dval(&rv) /= tens[i];
1523 if (e1 >>= 4) {
1524 if (e1 >= 1 << n_bigtens)
1525 goto undfl;
1526 if (e1 & Scale_Bit)
1527 bc.scale = 2*P;
1528 for(j = 0; e1 > 0; j++, e1 >>= 1)
1529 if (e1 & 1)
1530 dval(&rv) *= tinytens[j];
1531 if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
1532 >> Exp_shift)) > 0) {
1533 /* scaled rv is denormal; clear j low bits */
1534 if (j >= 32) {
1535 word1(&rv) = 0;
1536 if (j >= 53)
1537 word0(&rv) = (P+2)*Exp_msk1;
1538 else
1539 word0(&rv) &= 0xffffffff << (j-32);
1541 else
1542 word1(&rv) &= 0xffffffff << j;
1544 if (!dval(&rv)) {
1545 undfl:
1546 dval(&rv) = 0.;
1547 errno = ERANGE;
1548 goto ret;
1553 /* Now the hard part -- adjusting rv to the correct value.*/
1555 /* Put digits into bd: true value = bd * 10^e */
1557 bc.nd = nd;
1558 bc.nd0 = nd0; /* Only needed if nd > strtod_diglim, but done here */
1559 /* to silence an erroneous warning about bc.nd0 */
1560 /* possibly not being initialized. */
1561 if (nd > strtod_diglim) {
1562 /* ASSERT(strtod_diglim >= 18); 18 == one more than the */
1563 /* minimum number of decimal digits to distinguish double values */
1564 /* in IEEE arithmetic. */
1565 i = j = 18;
1566 if (i > nd0)
1567 j += bc.dplen;
1568 for(;;) {
1569 if (--j <= bc.dp1 && j >= bc.dp0)
1570 j = bc.dp0 - 1;
1571 if (s0[j] != '0')
1572 break;
1573 --i;
1575 e += nd - i;
1576 nd = i;
1577 if (nd0 > nd)
1578 nd0 = nd;
1579 if (nd < 9) { /* must recompute y */
1580 y = 0;
1581 for(i = 0; i < nd0; ++i)
1582 y = 10*y + s0[i] - '0';
1583 for(j = bc.dp1; i < nd; ++i)
1584 y = 10*y + s0[j++] - '0';
1587 bd0 = s2b(s0, nd0, nd, y, bc.dplen);
1588 if (bd0 == NULL)
1589 goto failed_malloc;
1591 for(;;) {
1592 bd = Balloc(bd0->k);
1593 if (bd == NULL) {
1594 Bfree(bd0);
1595 goto failed_malloc;
1597 Bcopy(bd, bd0);
1598 bb = d2b(&rv, &bbe, &bbbits); /* rv = bb * 2^bbe */
1599 if (bb == NULL) {
1600 Bfree(bd);
1601 Bfree(bd0);
1602 goto failed_malloc;
1604 bs = i2b(1);
1605 if (bs == NULL) {
1606 Bfree(bb);
1607 Bfree(bd);
1608 Bfree(bd0);
1609 goto failed_malloc;
1612 if (e >= 0) {
1613 bb2 = bb5 = 0;
1614 bd2 = bd5 = e;
1616 else {
1617 bb2 = bb5 = -e;
1618 bd2 = bd5 = 0;
1620 if (bbe >= 0)
1621 bb2 += bbe;
1622 else
1623 bd2 -= bbe;
1624 bs2 = bb2;
1625 j = bbe - bc.scale;
1626 i = j + bbbits - 1; /* logb(rv) */
1627 if (i < Emin) /* denormal */
1628 j += P - Emin;
1629 else
1630 j = P + 1 - bbbits;
1631 bb2 += j;
1632 bd2 += j;
1633 bd2 += bc.scale;
1634 i = bb2 < bd2 ? bb2 : bd2;
1635 if (i > bs2)
1636 i = bs2;
1637 if (i > 0) {
1638 bb2 -= i;
1639 bd2 -= i;
1640 bs2 -= i;
1642 if (bb5 > 0) {
1643 bs = pow5mult(bs, bb5);
1644 if (bs == NULL) {
1645 Bfree(bb);
1646 Bfree(bd);
1647 Bfree(bd0);
1648 goto failed_malloc;
1650 bb1 = mult(bs, bb);
1651 Bfree(bb);
1652 bb = bb1;
1653 if (bb == NULL) {
1654 Bfree(bs);
1655 Bfree(bd);
1656 Bfree(bd0);
1657 goto failed_malloc;
1660 if (bb2 > 0) {
1661 bb = lshift(bb, bb2);
1662 if (bb == NULL) {
1663 Bfree(bs);
1664 Bfree(bd);
1665 Bfree(bd0);
1666 goto failed_malloc;
1669 if (bd5 > 0) {
1670 bd = pow5mult(bd, bd5);
1671 if (bd == NULL) {
1672 Bfree(bb);
1673 Bfree(bs);
1674 Bfree(bd0);
1675 goto failed_malloc;
1678 if (bd2 > 0) {
1679 bd = lshift(bd, bd2);
1680 if (bd == NULL) {
1681 Bfree(bb);
1682 Bfree(bs);
1683 Bfree(bd0);
1684 goto failed_malloc;
1687 if (bs2 > 0) {
1688 bs = lshift(bs, bs2);
1689 if (bs == NULL) {
1690 Bfree(bb);
1691 Bfree(bd);
1692 Bfree(bd0);
1693 goto failed_malloc;
1696 delta = diff(bb, bd);
1697 if (delta == NULL) {
1698 Bfree(bb);
1699 Bfree(bs);
1700 Bfree(bd);
1701 Bfree(bd0);
1702 goto failed_malloc;
1704 bc.dsign = delta->sign;
1705 delta->sign = 0;
1706 i = cmp(delta, bs);
1707 if (bc.nd > nd && i <= 0) {
1708 if (bc.dsign)
1709 break; /* Must use bigcomp(). */
1711 bc.nd = nd;
1712 i = -1; /* Discarded digits make delta smaller. */
1716 if (i < 0) {
1717 /* Error is less than half an ulp -- check for
1718 * special case of mantissa a power of two.
1720 if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask
1721 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
1723 break;
1725 if (!delta->x[0] && delta->wds <= 1) {
1726 /* exact result */
1727 break;
1729 delta = lshift(delta,Log2P);
1730 if (delta == NULL) {
1731 Bfree(bb);
1732 Bfree(bs);
1733 Bfree(bd);
1734 Bfree(bd0);
1735 goto failed_malloc;
1737 if (cmp(delta, bs) > 0)
1738 goto drop_down;
1739 break;
1741 if (i == 0) {
1742 /* exactly half-way between */
1743 if (bc.dsign) {
1744 if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
1745 && word1(&rv) == (
1746 (bc.scale &&
1747 (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) ?
1748 (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
1749 0xffffffff)) {
1750 /*boundary case -- increment exponent*/
1751 word0(&rv) = (word0(&rv) & Exp_mask)
1752 + Exp_msk1
1754 word1(&rv) = 0;
1755 bc.dsign = 0;
1756 break;
1759 else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
1760 drop_down:
1761 /* boundary case -- decrement exponent */
1762 if (bc.scale) {
1763 L = word0(&rv) & Exp_mask;
1764 if (L <= (2*P+1)*Exp_msk1) {
1765 if (L > (P+2)*Exp_msk1)
1766 /* round even ==> */
1767 /* accept rv */
1768 break;
1769 /* rv = smallest denormal */
1770 if (bc.nd >nd) {
1771 bc.uflchk = 1;
1772 break;
1774 goto undfl;
1777 L = (word0(&rv) & Exp_mask) - Exp_msk1;
1778 word0(&rv) = L | Bndry_mask1;
1779 word1(&rv) = 0xffffffff;
1780 break;
1782 if (!(word1(&rv) & LSB))
1783 break;
1784 if (bc.dsign)
1785 dval(&rv) += ulp(&rv);
1786 else {
1787 dval(&rv) -= ulp(&rv);
1788 if (!dval(&rv)) {
1789 if (bc.nd >nd) {
1790 bc.uflchk = 1;
1791 break;
1793 goto undfl;
1796 bc.dsign = 1 - bc.dsign;
1797 break;
1799 if ((aadj = ratio(delta, bs)) <= 2.) {
1800 if (bc.dsign)
1801 aadj = aadj1 = 1.;
1802 else if (word1(&rv) || word0(&rv) & Bndry_mask) {
1803 if (word1(&rv) == Tiny1 && !word0(&rv)) {
1804 if (bc.nd >nd) {
1805 bc.uflchk = 1;
1806 break;
1808 goto undfl;
1810 aadj = 1.;
1811 aadj1 = -1.;
1813 else {
1814 /* special case -- power of FLT_RADIX to be */
1815 /* rounded down... */
1817 if (aadj < 2./FLT_RADIX)
1818 aadj = 1./FLT_RADIX;
1819 else
1820 aadj *= 0.5;
1821 aadj1 = -aadj;
1824 else {
1825 aadj *= 0.5;
1826 aadj1 = bc.dsign ? aadj : -aadj;
1827 if (Flt_Rounds == 0)
1828 aadj1 += 0.5;
1830 y = word0(&rv) & Exp_mask;
1832 /* Check for overflow */
1834 if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
1835 dval(&rv0) = dval(&rv);
1836 word0(&rv) -= P*Exp_msk1;
1837 adj.d = aadj1 * ulp(&rv);
1838 dval(&rv) += adj.d;
1839 if ((word0(&rv) & Exp_mask) >=
1840 Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
1841 if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
1842 goto ovfl;
1843 word0(&rv) = Big0;
1844 word1(&rv) = Big1;
1845 goto cont;
1847 else
1848 word0(&rv) += P*Exp_msk1;
1850 else {
1851 if (bc.scale && y <= 2*P*Exp_msk1) {
1852 if (aadj <= 0x7fffffff) {
1853 if ((z = (ULong)aadj) <= 0)
1854 z = 1;
1855 aadj = z;
1856 aadj1 = bc.dsign ? aadj : -aadj;
1858 dval(&aadj2) = aadj1;
1859 word0(&aadj2) += (2*P+1)*Exp_msk1 - y;
1860 aadj1 = dval(&aadj2);
1862 adj.d = aadj1 * ulp(&rv);
1863 dval(&rv) += adj.d;
1865 z = word0(&rv) & Exp_mask;
1866 if (bc.nd == nd) {
1867 if (!bc.scale)
1868 if (y == z) {
1869 /* Can we stop now? */
1870 L = (Long)aadj;
1871 aadj -= L;
1872 /* The tolerances below are conservative. */
1873 if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
1874 if (aadj < .4999999 || aadj > .5000001)
1875 break;
1877 else if (aadj < .4999999/FLT_RADIX)
1878 break;
1881 cont:
1882 Bfree(bb);
1883 Bfree(bd);
1884 Bfree(bs);
1885 Bfree(delta);
1887 Bfree(bb);
1888 Bfree(bd);
1889 Bfree(bs);
1890 Bfree(bd0);
1891 Bfree(delta);
1892 if (bc.nd > nd) {
1893 error = bigcomp(&rv, s0, &bc);
1894 if (error)
1895 goto failed_malloc;
1898 if (bc.scale) {
1899 word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
1900 word1(&rv0) = 0;
1901 dval(&rv) *= dval(&rv0);
1902 /* try to avoid the bug of testing an 8087 register value */
1903 if (!(word0(&rv) & Exp_mask))
1904 errno = ERANGE;
1906 ret:
1907 if (se)
1908 *se = (char *)s;
1909 return sign ? -dval(&rv) : dval(&rv);
1911 failed_malloc:
1912 if (se)
1913 *se = (char *)s00;
1914 errno = ENOMEM;
1915 return -1.0;
1918 static char *
1919 rv_alloc(int i)
1921 int j, k, *r;
1923 j = sizeof(ULong);
1924 for(k = 0;
1925 sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (unsigned)i;
1926 j <<= 1)
1927 k++;
1928 r = (int*)Balloc(k);
1929 if (r == NULL)
1930 return NULL;
1931 *r = k;
1932 return (char *)(r+1);
1935 static char *
1936 nrv_alloc(char *s, char **rve, int n)
1938 char *rv, *t;
1940 rv = rv_alloc(n);
1941 if (rv == NULL)
1942 return NULL;
1943 t = rv;
1944 while((*t = *s++)) t++;
1945 if (rve)
1946 *rve = t;
1947 return rv;
1950 /* freedtoa(s) must be used to free values s returned by dtoa
1951 * when MULTIPLE_THREADS is #defined. It should be used in all cases,
1952 * but for consistency with earlier versions of dtoa, it is optional
1953 * when MULTIPLE_THREADS is not defined.
1956 void
1957 _Py_dg_freedtoa(char *s)
1959 Bigint *b = (Bigint *)((int *)s - 1);
1960 b->maxwds = 1 << (b->k = *(int*)b);
1961 Bfree(b);
1964 /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
1966 * Inspired by "How to Print Floating-Point Numbers Accurately" by
1967 * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
1969 * Modifications:
1970 * 1. Rather than iterating, we use a simple numeric overestimate
1971 * to determine k = floor(log10(d)). We scale relevant
1972 * quantities using O(log2(k)) rather than O(k) multiplications.
1973 * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
1974 * try to generate digits strictly left to right. Instead, we
1975 * compute with fewer bits and propagate the carry if necessary
1976 * when rounding the final digit up. This is often faster.
1977 * 3. Under the assumption that input will be rounded nearest,
1978 * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
1979 * That is, we allow equality in stopping tests when the
1980 * round-nearest rule will give the same floating-point value
1981 * as would satisfaction of the stopping test with strict
1982 * inequality.
1983 * 4. We remove common factors of powers of 2 from relevant
1984 * quantities.
1985 * 5. When converting floating-point integers less than 1e16,
1986 * we use floating-point arithmetic rather than resorting
1987 * to multiple-precision integers.
1988 * 6. When asked to produce fewer than 15 digits, we first try
1989 * to get by with floating-point arithmetic; we resort to
1990 * multiple-precision integer arithmetic only if we cannot
1991 * guarantee that the floating-point calculation has given
1992 * the correctly rounded result. For k requested digits and
1993 * "uniformly" distributed input, the probability is
1994 * something like 10^(k-15) that we must resort to the Long
1995 * calculation.
1998 /* Additional notes (METD): (1) returns NULL on failure. (2) to avoid memory
1999 leakage, a successful call to _Py_dg_dtoa should always be matched by a
2000 call to _Py_dg_freedtoa. */
2002 char *
2003 _Py_dg_dtoa(double dd, int mode, int ndigits,
2004 int *decpt, int *sign, char **rve)
2006 /* Arguments ndigits, decpt, sign are similar to those
2007 of ecvt and fcvt; trailing zeros are suppressed from
2008 the returned string. If not null, *rve is set to point
2009 to the end of the return value. If d is +-Infinity or NaN,
2010 then *decpt is set to 9999.
2012 mode:
2013 0 ==> shortest string that yields d when read in
2014 and rounded to nearest.
2015 1 ==> like 0, but with Steele & White stopping rule;
2016 e.g. with IEEE P754 arithmetic , mode 0 gives
2017 1e23 whereas mode 1 gives 9.999999999999999e22.
2018 2 ==> max(1,ndigits) significant digits. This gives a
2019 return value similar to that of ecvt, except
2020 that trailing zeros are suppressed.
2021 3 ==> through ndigits past the decimal point. This
2022 gives a return value similar to that from fcvt,
2023 except that trailing zeros are suppressed, and
2024 ndigits can be negative.
2025 4,5 ==> similar to 2 and 3, respectively, but (in
2026 round-nearest mode) with the tests of mode 0 to
2027 possibly return a shorter string that rounds to d.
2028 With IEEE arithmetic and compilation with
2029 -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
2030 as modes 2 and 3 when FLT_ROUNDS != 1.
2031 6-9 ==> Debugging modes similar to mode - 4: don't try
2032 fast floating-point estimate (if applicable).
2034 Values of mode other than 0-9 are treated as mode 0.
2036 Sufficient space is allocated to the return value
2037 to hold the suppressed trailing zeros.
2040 int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
2041 j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
2042 spec_case, try_quick;
2043 Long L;
2044 int denorm;
2045 ULong x;
2046 Bigint *b, *b1, *delta, *mlo, *mhi, *S;
2047 U d2, eps, u;
2048 double ds;
2049 char *s, *s0;
2051 /* set pointers to NULL, to silence gcc compiler warnings and make
2052 cleanup easier on error */
2053 mlo = mhi = b = S = 0;
2054 s0 = 0;
2056 u.d = dd;
2057 if (word0(&u) & Sign_bit) {
2058 /* set sign for everything, including 0's and NaNs */
2059 *sign = 1;
2060 word0(&u) &= ~Sign_bit; /* clear sign bit */
2062 else
2063 *sign = 0;
2065 /* quick return for Infinities, NaNs and zeros */
2066 if ((word0(&u) & Exp_mask) == Exp_mask)
2068 /* Infinity or NaN */
2069 *decpt = 9999;
2070 if (!word1(&u) && !(word0(&u) & 0xfffff))
2071 return nrv_alloc("Infinity", rve, 8);
2072 return nrv_alloc("NaN", rve, 3);
2074 if (!dval(&u)) {
2075 *decpt = 1;
2076 return nrv_alloc("0", rve, 1);
2079 /* compute k = floor(log10(d)). The computation may leave k
2080 one too large, but should never leave k too small. */
2081 b = d2b(&u, &be, &bbits);
2082 if (b == NULL)
2083 goto failed_malloc;
2084 if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {
2085 dval(&d2) = dval(&u);
2086 word0(&d2) &= Frac_mask1;
2087 word0(&d2) |= Exp_11;
2089 /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
2090 * log10(x) = log(x) / log(10)
2091 * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
2092 * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
2094 * This suggests computing an approximation k to log10(d) by
2096 * k = (i - Bias)*0.301029995663981
2097 * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
2099 * We want k to be too large rather than too small.
2100 * The error in the first-order Taylor series approximation
2101 * is in our favor, so we just round up the constant enough
2102 * to compensate for any error in the multiplication of
2103 * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
2104 * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
2105 * adding 1e-13 to the constant term more than suffices.
2106 * Hence we adjust the constant term to 0.1760912590558.
2107 * (We could get a more accurate k by invoking log10,
2108 * but this is probably not worthwhile.)
2111 i -= Bias;
2112 denorm = 0;
2114 else {
2115 /* d is denormalized */
2117 i = bbits + be + (Bias + (P-1) - 1);
2118 x = i > 32 ? word0(&u) << (64 - i) | word1(&u) >> (i - 32)
2119 : word1(&u) << (32 - i);
2120 dval(&d2) = x;
2121 word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
2122 i -= (Bias + (P-1) - 1) + 1;
2123 denorm = 1;
2125 ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 +
2126 i*0.301029995663981;
2127 k = (int)ds;
2128 if (ds < 0. && ds != k)
2129 k--; /* want k = floor(ds) */
2130 k_check = 1;
2131 if (k >= 0 && k <= Ten_pmax) {
2132 if (dval(&u) < tens[k])
2133 k--;
2134 k_check = 0;
2136 j = bbits - i - 1;
2137 if (j >= 0) {
2138 b2 = 0;
2139 s2 = j;
2141 else {
2142 b2 = -j;
2143 s2 = 0;
2145 if (k >= 0) {
2146 b5 = 0;
2147 s5 = k;
2148 s2 += k;
2150 else {
2151 b2 -= k;
2152 b5 = -k;
2153 s5 = 0;
2155 if (mode < 0 || mode > 9)
2156 mode = 0;
2158 try_quick = 1;
2160 if (mode > 5) {
2161 mode -= 4;
2162 try_quick = 0;
2164 leftright = 1;
2165 ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */
2166 /* silence erroneous "gcc -Wall" warning. */
2167 switch(mode) {
2168 case 0:
2169 case 1:
2170 i = 18;
2171 ndigits = 0;
2172 break;
2173 case 2:
2174 leftright = 0;
2175 /* no break */
2176 case 4:
2177 if (ndigits <= 0)
2178 ndigits = 1;
2179 ilim = ilim1 = i = ndigits;
2180 break;
2181 case 3:
2182 leftright = 0;
2183 /* no break */
2184 case 5:
2185 i = ndigits + k + 1;
2186 ilim = i;
2187 ilim1 = i - 1;
2188 if (i <= 0)
2189 i = 1;
2191 s0 = rv_alloc(i);
2192 if (s0 == NULL)
2193 goto failed_malloc;
2194 s = s0;
2197 if (ilim >= 0 && ilim <= Quick_max && try_quick) {
2199 /* Try to get by with floating-point arithmetic. */
2201 i = 0;
2202 dval(&d2) = dval(&u);
2203 k0 = k;
2204 ilim0 = ilim;
2205 ieps = 2; /* conservative */
2206 if (k > 0) {
2207 ds = tens[k&0xf];
2208 j = k >> 4;
2209 if (j & Bletch) {
2210 /* prevent overflows */
2211 j &= Bletch - 1;
2212 dval(&u) /= bigtens[n_bigtens-1];
2213 ieps++;
2215 for(; j; j >>= 1, i++)
2216 if (j & 1) {
2217 ieps++;
2218 ds *= bigtens[i];
2220 dval(&u) /= ds;
2222 else if ((j1 = -k)) {
2223 dval(&u) *= tens[j1 & 0xf];
2224 for(j = j1 >> 4; j; j >>= 1, i++)
2225 if (j & 1) {
2226 ieps++;
2227 dval(&u) *= bigtens[i];
2230 if (k_check && dval(&u) < 1. && ilim > 0) {
2231 if (ilim1 <= 0)
2232 goto fast_failed;
2233 ilim = ilim1;
2234 k--;
2235 dval(&u) *= 10.;
2236 ieps++;
2238 dval(&eps) = ieps*dval(&u) + 7.;
2239 word0(&eps) -= (P-1)*Exp_msk1;
2240 if (ilim == 0) {
2241 S = mhi = 0;
2242 dval(&u) -= 5.;
2243 if (dval(&u) > dval(&eps))
2244 goto one_digit;
2245 if (dval(&u) < -dval(&eps))
2246 goto no_digits;
2247 goto fast_failed;
2249 if (leftright) {
2250 /* Use Steele & White method of only
2251 * generating digits needed.
2253 dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
2254 for(i = 0;;) {
2255 L = (Long)dval(&u);
2256 dval(&u) -= L;
2257 *s++ = '0' + (int)L;
2258 if (dval(&u) < dval(&eps))
2259 goto ret1;
2260 if (1. - dval(&u) < dval(&eps))
2261 goto bump_up;
2262 if (++i >= ilim)
2263 break;
2264 dval(&eps) *= 10.;
2265 dval(&u) *= 10.;
2268 else {
2269 /* Generate ilim digits, then fix them up. */
2270 dval(&eps) *= tens[ilim-1];
2271 for(i = 1;; i++, dval(&u) *= 10.) {
2272 L = (Long)(dval(&u));
2273 if (!(dval(&u) -= L))
2274 ilim = i;
2275 *s++ = '0' + (int)L;
2276 if (i == ilim) {
2277 if (dval(&u) > 0.5 + dval(&eps))
2278 goto bump_up;
2279 else if (dval(&u) < 0.5 - dval(&eps)) {
2280 while(*--s == '0');
2281 s++;
2282 goto ret1;
2284 break;
2288 fast_failed:
2289 s = s0;
2290 dval(&u) = dval(&d2);
2291 k = k0;
2292 ilim = ilim0;
2295 /* Do we have a "small" integer? */
2297 if (be >= 0 && k <= Int_max) {
2298 /* Yes. */
2299 ds = tens[k];
2300 if (ndigits < 0 && ilim <= 0) {
2301 S = mhi = 0;
2302 if (ilim < 0 || dval(&u) <= 5*ds)
2303 goto no_digits;
2304 goto one_digit;
2306 for(i = 1;; i++, dval(&u) *= 10.) {
2307 L = (Long)(dval(&u) / ds);
2308 dval(&u) -= L*ds;
2309 *s++ = '0' + (int)L;
2310 if (!dval(&u)) {
2311 break;
2313 if (i == ilim) {
2314 dval(&u) += dval(&u);
2315 if (dval(&u) > ds || (dval(&u) == ds && L & 1)) {
2316 bump_up:
2317 while(*--s == '9')
2318 if (s == s0) {
2319 k++;
2320 *s = '0';
2321 break;
2323 ++*s++;
2325 break;
2328 goto ret1;
2331 m2 = b2;
2332 m5 = b5;
2333 if (leftright) {
2335 denorm ? be + (Bias + (P-1) - 1 + 1) :
2336 1 + P - bbits;
2337 b2 += i;
2338 s2 += i;
2339 mhi = i2b(1);
2340 if (mhi == NULL)
2341 goto failed_malloc;
2343 if (m2 > 0 && s2 > 0) {
2344 i = m2 < s2 ? m2 : s2;
2345 b2 -= i;
2346 m2 -= i;
2347 s2 -= i;
2349 if (b5 > 0) {
2350 if (leftright) {
2351 if (m5 > 0) {
2352 mhi = pow5mult(mhi, m5);
2353 if (mhi == NULL)
2354 goto failed_malloc;
2355 b1 = mult(mhi, b);
2356 Bfree(b);
2357 b = b1;
2358 if (b == NULL)
2359 goto failed_malloc;
2361 if ((j = b5 - m5)) {
2362 b = pow5mult(b, j);
2363 if (b == NULL)
2364 goto failed_malloc;
2367 else {
2368 b = pow5mult(b, b5);
2369 if (b == NULL)
2370 goto failed_malloc;
2373 S = i2b(1);
2374 if (S == NULL)
2375 goto failed_malloc;
2376 if (s5 > 0) {
2377 S = pow5mult(S, s5);
2378 if (S == NULL)
2379 goto failed_malloc;
2382 /* Check for special case that d is a normalized power of 2. */
2384 spec_case = 0;
2385 if ((mode < 2 || leftright)
2387 if (!word1(&u) && !(word0(&u) & Bndry_mask)
2388 && word0(&u) & (Exp_mask & ~Exp_msk1)
2390 /* The special case */
2391 b2 += Log2P;
2392 s2 += Log2P;
2393 spec_case = 1;
2397 /* Arrange for convenient computation of quotients:
2398 * shift left if necessary so divisor has 4 leading 0 bits.
2400 * Perhaps we should just compute leading 28 bits of S once
2401 * and for all and pass them and a shift to quorem, so it
2402 * can do shifts and ors to compute the numerator for q.
2404 if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f))
2405 i = 32 - i;
2406 #define iInc 28
2407 i = dshift(S, s2);
2408 b2 += i;
2409 m2 += i;
2410 s2 += i;
2411 if (b2 > 0) {
2412 b = lshift(b, b2);
2413 if (b == NULL)
2414 goto failed_malloc;
2416 if (s2 > 0) {
2417 S = lshift(S, s2);
2418 if (S == NULL)
2419 goto failed_malloc;
2421 if (k_check) {
2422 if (cmp(b,S) < 0) {
2423 k--;
2424 b = multadd(b, 10, 0); /* we botched the k estimate */
2425 if (b == NULL)
2426 goto failed_malloc;
2427 if (leftright) {
2428 mhi = multadd(mhi, 10, 0);
2429 if (mhi == NULL)
2430 goto failed_malloc;
2432 ilim = ilim1;
2435 if (ilim <= 0 && (mode == 3 || mode == 5)) {
2436 if (ilim < 0) {
2437 /* no digits, fcvt style */
2438 no_digits:
2439 k = -1 - ndigits;
2440 goto ret;
2442 else {
2443 S = multadd(S, 5, 0);
2444 if (S == NULL)
2445 goto failed_malloc;
2446 if (cmp(b, S) <= 0)
2447 goto no_digits;
2449 one_digit:
2450 *s++ = '1';
2451 k++;
2452 goto ret;
2454 if (leftright) {
2455 if (m2 > 0) {
2456 mhi = lshift(mhi, m2);
2457 if (mhi == NULL)
2458 goto failed_malloc;
2461 /* Compute mlo -- check for special case
2462 * that d is a normalized power of 2.
2465 mlo = mhi;
2466 if (spec_case) {
2467 mhi = Balloc(mhi->k);
2468 if (mhi == NULL)
2469 goto failed_malloc;
2470 Bcopy(mhi, mlo);
2471 mhi = lshift(mhi, Log2P);
2472 if (mhi == NULL)
2473 goto failed_malloc;
2476 for(i = 1;;i++) {
2477 dig = quorem(b,S) + '0';
2478 /* Do we yet have the shortest decimal string
2479 * that will round to d?
2481 j = cmp(b, mlo);
2482 delta = diff(S, mhi);
2483 if (delta == NULL)
2484 goto failed_malloc;
2485 j1 = delta->sign ? 1 : cmp(b, delta);
2486 Bfree(delta);
2487 if (j1 == 0 && mode != 1 && !(word1(&u) & 1)
2489 if (dig == '9')
2490 goto round_9_up;
2491 if (j > 0)
2492 dig++;
2493 *s++ = dig;
2494 goto ret;
2496 if (j < 0 || (j == 0 && mode != 1
2497 && !(word1(&u) & 1)
2498 )) {
2499 if (!b->x[0] && b->wds <= 1) {
2500 goto accept_dig;
2502 if (j1 > 0) {
2503 b = lshift(b, 1);
2504 if (b == NULL)
2505 goto failed_malloc;
2506 j1 = cmp(b, S);
2507 if ((j1 > 0 || (j1 == 0 && dig & 1))
2508 && dig++ == '9')
2509 goto round_9_up;
2511 accept_dig:
2512 *s++ = dig;
2513 goto ret;
2515 if (j1 > 0) {
2516 if (dig == '9') { /* possible if i == 1 */
2517 round_9_up:
2518 *s++ = '9';
2519 goto roundoff;
2521 *s++ = dig + 1;
2522 goto ret;
2524 *s++ = dig;
2525 if (i == ilim)
2526 break;
2527 b = multadd(b, 10, 0);
2528 if (b == NULL)
2529 goto failed_malloc;
2530 if (mlo == mhi) {
2531 mlo = mhi = multadd(mhi, 10, 0);
2532 if (mlo == NULL)
2533 goto failed_malloc;
2535 else {
2536 mlo = multadd(mlo, 10, 0);
2537 if (mlo == NULL)
2538 goto failed_malloc;
2539 mhi = multadd(mhi, 10, 0);
2540 if (mhi == NULL)
2541 goto failed_malloc;
2545 else
2546 for(i = 1;; i++) {
2547 *s++ = dig = quorem(b,S) + '0';
2548 if (!b->x[0] && b->wds <= 1) {
2549 goto ret;
2551 if (i >= ilim)
2552 break;
2553 b = multadd(b, 10, 0);
2554 if (b == NULL)
2555 goto failed_malloc;
2558 /* Round off last digit */
2560 b = lshift(b, 1);
2561 if (b == NULL)
2562 goto failed_malloc;
2563 j = cmp(b, S);
2564 if (j > 0 || (j == 0 && dig & 1)) {
2565 roundoff:
2566 while(*--s == '9')
2567 if (s == s0) {
2568 k++;
2569 *s++ = '1';
2570 goto ret;
2572 ++*s++;
2574 else {
2575 while(*--s == '0');
2576 s++;
2578 ret:
2579 Bfree(S);
2580 if (mhi) {
2581 if (mlo && mlo != mhi)
2582 Bfree(mlo);
2583 Bfree(mhi);
2585 ret1:
2586 Bfree(b);
2587 *s = 0;
2588 *decpt = k + 1;
2589 if (rve)
2590 *rve = s;
2591 return s0;
2592 failed_malloc:
2593 if (S)
2594 Bfree(S);
2595 if (mlo && mlo != mhi)
2596 Bfree(mlo);
2597 if (mhi)
2598 Bfree(mhi);
2599 if (b)
2600 Bfree(b);
2601 if (s0)
2602 _Py_dg_freedtoa(s0);
2603 return NULL;
2605 #ifdef __cplusplus
2607 #endif
2609 #endif /* PY_NO_SHORT_FLOAT_REPR */