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