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