1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**************************************************************** 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The author of this software is David M. Gay. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copyright (c) 1991, 2000, 2001 by Lucent Technologies. 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Permission to use, copy, modify, and distribute this software for any 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * purpose without fee is hereby granted, provided that this entire notice 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * is included in all copies of any software which is or includes a copy 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * or modification of this software and in all copies of the supporting 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * documentation for such software. 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ***************************************************************/ 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* Please send bug reports to David M. Gay (dmg at acm dot org, 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * with " at " changed at "@" and " dot " changed to "."). */ 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* On a machine with IEEE extended-precision registers, it is 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * necessary to specify double-precision (53-bit) rounding precision 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * before invoking strtod or dtoa. If the machine uses (the equivalent 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * of) Intel 80x87 arithmetic, the call 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * _control87(PC_53, MCW_PC); 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * does this with many compilers. Whether this or another call is 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * appropriate depends on the compiler; for this to work, it may be 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * necessary to #include "float.h" or another system-dependent header 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * file. 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* strtod for IEEE-, VAX-, and IBM-arithmetic machines. 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * This strtod returns a nearest machine number to the input decimal 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * string (or sets errno to ERANGE). With IEEE arithmetic, ties are 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * broken by the IEEE round-even rule. Otherwise ties are broken by 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * biased rounding (add half and chop). 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Inspired loosely by William D. Clinger's paper "How to Read Floating 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101]. 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Modifications: 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1. We only require IEEE, IBM, or VAX double-precision 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * arithmetic (not IEEE double-extended). 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 2. We get by with floating-point arithmetic in a case that 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Clinger missed -- when we're computing d * 10^n 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * for a small integer d and the integer n is not too 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * much larger than 22 (the maximum integer k for which 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * we can represent 10^k exactly), we may be able to 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * compute (d*10^k) * 10^(e-k) with just one roundoff. 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 3. Rather than a bit-at-a-time adjustment of the binary 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * result in the hard case, we use floating-point 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * arithmetic to determine the adjustment to within 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * one bit; only in really hard cases do we need to 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * compute a second residual. 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 4. Because of 3., we don't need a large table of powers of 10 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * for ten-to-e (just some small tables, e.g. of 10^k 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * for 0 <= k <= 22). 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define IEEE_8087 for IEEE-arithmetic machines where the least 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * significant byte has the lowest address. 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define IEEE_MC68k for IEEE-arithmetic machines where the most 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * significant byte has the lowest address. 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define Long int on machines with 32-bit ints and 64-bit longs. 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define IBM for IBM mainframe-style floating-point arithmetic. 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define VAX for VAX-style floating-point arithmetic (D_floating). 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define No_leftright to omit left-right logic in fast floating-point 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * computation of dtoa. 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * and strtod and dtoa should round accordingly. Unless Trust_FLT_ROUNDS 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * is also #defined, fegetround() will be queried for the rounding mode. 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Note that both FLT_ROUNDS and fegetround() are specified by the C99 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * standard (and are specified to be consistent, with fesetround() 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * affecting the value of FLT_ROUNDS), but that some (Linux) systems 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * do not work correctly in this regard, so using fegetround() is more 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * portable than using FLT_FOUNDS directly. 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * and Honor_FLT_ROUNDS is not #defined. 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * that use extended-precision instructions to compute rounded 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * products and quotients) with IBM. 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define ROUND_BIASED for IEEE-format with biased rounding. 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define Inaccurate_Divide for IEEE-format with correctly rounded 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * products but inaccurate quotients, e.g., for Intel i860. 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define NO_LONG_LONG on machines that do not have a "long long" 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * integer type (of >= 64 bits). On such machines, you can 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define Just_16 to store 16 bits per 32-bit Long when doing 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * high-precision integer arithmetic. Whether this speeds things 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * up or slows things down depends on the machine and the number 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * being converted. If long long is available and the name is 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * something other than "long long", #define Llong to be the name, 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * and if "unsigned Llong" does not work as an unsigned version of 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Llong, #define #ULLong to be the corresponding unsigned type. 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define KR_headers for old-style C function headers. 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define Bad_float_h if your system lacks a float.h or if it does not 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * if memory is available and otherwise does something you deem 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * appropriate. If MALLOC is undefined, malloc will be invoked 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * directly -- and assumed always to succeed. Similarly, if you 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * want something other than the system's free() to be called to 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * recycle memory acquired from MALLOC, #define FREE to be the 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * name of the alternate routine. (FREE or free is only called in 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * pathological cases, e.g., in a dtoa call after a dtoa return in 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * mode 3 with thousands of digits requested.) 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * memory allocations from a private pool of memory when possible. 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes, 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * unless #defined to be a different length. This default length 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * suffices to get rid of MALLOC calls except for unusual cases, 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * such as decimal-to-binary conversion of a very long string of 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * digits. The longest string dtoa can return is about 751 bytes 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * long. For conversions by strtod of strings of 800 digits and 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * all dtoa conversions in single-threaded executions with 8-byte 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * pointers, PRIVATE_MEM >= 7112 appears adequate. 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #defined automatically on IEEE systems. On such systems, 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * when INFNAN_CHECK is #defined, strtod checks 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * for Infinity and NaN (case insensitively). On some systems 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * (e.g., some HP systems), it may be necessary to #define NAN_WORD0 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * appropriately -- to the most significant word of a quiet NaN. 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.) 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined, 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * strtod also accepts (case insensitively) strings of the form 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * NaN(x), where x is a string of hexadecimal digits and spaces; 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * if there is only one string of hexadecimal digits, it is taken 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * for the 52 fraction bits of the resulting NaN; if there are two 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * or more strings of hex digits, the first is for the high 20 bits, 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the second and subsequent for the low 32 bits, with intervening 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * white space ignored; but if this results in none of the 52 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * fraction bits being on (an IEEE Infinity symbol), then NAN_WORD0 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * and NAN_WORD1 are used instead. 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define MULTIPLE_THREADS if the system offers preemptively scheduled 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * multiple threads. In this case, you must provide (or suitably 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * in pow5mult, ensures lazy evaluation of only one copy of high 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * powers of 5; omitting this lock would introduce a small 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * probability of wasting memory, but would otherwise be harmless.) 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * You must also invoke freedtoa(s) to free the value s returned by 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined. 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * avoids underflows on inputs whose result does not underflow. 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * If you #define NO_IEEE_Scale on a machine that uses IEEE-format 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * floating-point numbers and flushes underflows to zero rather 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * than implementing gradual underflow, then you must also #define 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Sudden_Underflow. 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define USE_LOCALE to use the current locale's decimal_point value. 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define SET_INEXACT if IEEE arithmetic is being used and extra 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * computation should be done to set the inexact flag when the 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * result is inexact and avoid setting inexact when the result 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * is exact. In this case, dtoa.c must be compiled in 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * an environment, perhaps provided by #include "dtoa.c" in a 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * suitable wrapper, that defines two functions, 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * int get_inexact(void); 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * void clear_inexact(void); 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * such that get_inexact() returns a nonzero value if the 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * inexact bit is already set, and clear_inexact() sets the 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * inexact bit to 0. When SET_INEXACT is #defined, strtod 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * also does extra computations to set the underflow and overflow 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * flags when appropriate (i.e., when the result is tiny and 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * inexact or when it is a numeric value rounded to +-infinity). 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define NO_ERRNO if strtod should not assign errno = ERANGE when 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the result overflows to +-Infinity or underflows to 0. 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define NO_HEX_FP to omit recognition of hexadecimal floating-point 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * values by strtod. 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define NO_STRTOD_BIGCOMP (on IEEE-arithmetic systems only for now) 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * to disable logic for "fast" testing of very long input strings 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * to strtod. This testing proceeds by initially truncating the 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * input string, then if necessary comparing the whole string with 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * a decimal expansion to decide close cases. This logic is only 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * used for input more than STRTOD_DIGLIM digits long (default 40). 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define IEEE_8087 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NO_HEX_FP 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Long 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if __LP64__ 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Long int 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Long long 190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef ULong 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef unsigned Long ULong; 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef DEBUG 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "stdio.h" 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} 199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "stdlib.h" 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "string.h" 203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef USE_LOCALE 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "locale.h" 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Trust_FLT_ROUNDS 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <fenv.h> 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef MALLOC 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern char *MALLOC(); 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern void *MALLOC(size_t); 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define MALLOC malloc 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Omit_Private_Memory 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef PRIVATE_MEM 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define PRIVATE_MEM 2304 227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define PRIVATE_mem ((unsigned)((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))) 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic double private_mem[PRIVATE_mem], *pmem_next = private_mem; 230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef IEEE_Arith 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef Avoid_Underflow 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_MC68k 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define IEEE_Arith 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_8087 238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define IEEE_Arith 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_INFNAN_CHECK 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef INFNAN_CHECK 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define INFNAN_CHECK 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef INFNAN_CHECK 248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NO_STRTOD_BIGCOMP 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "errno.h" 252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Bad_float_h 254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith 256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define DBL_DIG 15 257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define DBL_MAX_10_EXP 308 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define DBL_MAX_EXP 1024 259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define FLT_RADIX 2 260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*IEEE_Arith*/ 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define DBL_DIG 16 264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define DBL_MAX_10_EXP 75 265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define DBL_MAX_EXP 63 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define FLT_RADIX 16 267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define DBL_MAX 7.2370055773322621e+75 268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef VAX 271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define DBL_DIG 16 272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define DBL_MAX_10_EXP 38 273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define DBL_MAX_EXP 127 274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define FLT_RADIX 2 275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define DBL_MAX 1.7014118346046923e+38 276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef LONG_MAX 279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define LONG_MAX 2147483647 280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else /* ifndef Bad_float_h */ 283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "float.h" 284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* Bad_float_h */ 285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef __MATH_H__ 287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "math.h" 288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace dmg_fp { 291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef CONST 293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define CONST /* blank */ 295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define CONST const 297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1 301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottExactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined. 302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef union { double d; ULong L[2]; } U; 305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_8087 307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define word0(x) (x)->L[1] 308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define word1(x) (x)->L[0] 309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define word0(x) (x)->L[0] 311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define word1(x) (x)->L[1] 312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define dval(x) (x)->d 314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef STRTOD_DIGLIM 316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define STRTOD_DIGLIM 40 317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef DIGLIM_DEBUG 320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern int strtod_diglim; 321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define strtod_diglim STRTOD_DIGLIM 323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* The following definition of Storeinc is appropriate for MIPS processors. 326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * An alternative that might be better on some machines is 327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) 328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(IEEE_8087) + defined(VAX) 330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \ 331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott((unsigned short *)a)[0] = (unsigned short)c, a++) 332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \ 334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott((unsigned short *)a)[1] = (unsigned short)c, a++) 335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* #define P DBL_MANT_DIG */ 338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* Ten_pmax = floor(P*log(2)/log(5)) */ 339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ 340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ 341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ 342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith 344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_shift 20 345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_shift1 20 346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_msk1 0x100000 347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_msk11 0x100000 348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_mask 0x7ff00000 349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define P 53 350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Nbits 53 351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bias 1023 352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Emax 1023 353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Emin (-1022) 354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_1 0x3ff00000 355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_11 0x3ff00000 356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Ebits 11 357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Frac_mask 0xfffff 358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Frac_mask1 0xfffff 359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Ten_pmax 22 360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bletch 0x10 361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bndry_mask 0xfffff 362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bndry_mask1 0xfffff 363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define LSB 1 364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Sign_bit 0x80000000 365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Log2P 1 366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Tiny0 0 367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Tiny1 1 368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Quick_max 14 369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Int_max 14 370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_IEEE_Scale 371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Avoid_Underflow 372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Flush_Denorm /* debugging option */ 373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef Sudden_Underflow 374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Flt_Rounds 378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef FLT_ROUNDS 379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Flt_Rounds FLT_ROUNDS 380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Flt_Rounds 1 382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Flt_Rounds*/ 384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef Check_FLT_ROUNDS 387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Check_FLT_ROUNDS 388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Rounding Flt_Rounds 390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else /* ifndef IEEE_Arith */ 393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef Check_FLT_ROUNDS 394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef Honor_FLT_ROUNDS 395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef SET_INEXACT 396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef Sudden_Underflow 397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Sudden_Underflow 398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef Flt_Rounds 400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Flt_Rounds 0 401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_shift 24 402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_shift1 24 403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_msk1 0x1000000 404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_msk11 0x1000000 405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_mask 0x7f000000 406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define P 14 407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Nbits 56 408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bias 65 409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Emax 248 410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Emin (-260) 411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_1 0x41000000 412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_11 0x41000000 413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ 414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Frac_mask 0xffffff 415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Frac_mask1 0xffffff 416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bletch 4 417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Ten_pmax 22 418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bndry_mask 0xefffff 419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bndry_mask1 0xffffff 420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define LSB 1 421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Sign_bit 0x80000000 422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Log2P 4 423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Tiny0 0x100000 424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Tiny1 0 425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Quick_max 14 426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Int_max 15 427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else /* VAX */ 428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef Flt_Rounds 429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Flt_Rounds 1 430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_shift 23 431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_shift1 7 432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_msk1 0x80 433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_msk11 0x800000 434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_mask 0x7f80 435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define P 56 436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Nbits 56 437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bias 129 438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Emax 126 439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Emin (-129) 440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_1 0x40800000 441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Exp_11 0x4080 442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Ebits 8 443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Frac_mask 0x7fffff 444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Frac_mask1 0xffff007f 445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Ten_pmax 24 446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bletch 2 447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bndry_mask 0xffff007f 448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bndry_mask1 0xffff007f 449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define LSB 0x10000 450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Sign_bit 0x8000 451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Log2P 1 452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Tiny0 0x80 453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Tiny1 0 454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Quick_max 15 455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Int_max 15 456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* IBM, VAX */ 457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* IEEE_Arith */ 458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef IEEE_Arith 460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ROUND_BIASED 461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef RND_PRODQUOT 464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define rounded_product(a,b) a = rnd_prod(a, b) 465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define rounded_quotient(a,b) a = rnd_quot(a, b) 466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern double rnd_prod(), rnd_quot(); 468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern double rnd_prod(double, double), rnd_quot(double, double); 470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define rounded_product(a,b) a *= b 473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define rounded_quotient(a,b) a /= b 474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) 477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Big1 0xffffffff 478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Pack_32 480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Pack_32 481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef struct BCinfo BCinfo; 484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct 485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottBCinfo { int dp0, dp1, dplen, dsign, e0, inexact, nd, nd0, rounding, scale, uflchk; }; 486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define FFFFFFFF ((((unsigned long)0xffff)<<16)|(unsigned long)0xffff) 489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define FFFFFFFF 0xffffffffUL 491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef NO_LONG_LONG 494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef ULLong 495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Just_16 496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef Pack_32 497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* When Pack_32 is not defined, we store 16 bits per 32-bit Long. 498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * This makes some inner loops simpler and sometimes saves work 499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * during multiplications, but it often seems to make things slightly 500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * slower. Hence the default is now to store 32 bits per Long. 501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else /* long long available */ 504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Llong 505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Llong long long 506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef ULLong 508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ULLong unsigned Llong 509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* NO_LONG_LONG */ 511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef MULTIPLE_THREADS 513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ACQUIRE_DTOA_LOCK(n) /*nothing*/ 514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define FREE_DTOA_LOCK(n) /*nothing*/ 515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Kmax 7 518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottdouble strtod(const char *s00, char **se); 520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottchar *dtoa(double d, int mode, int ndigits, 521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int *decpt, int *sign, char **rve); 522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct 524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottBigint { 525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct Bigint *next; 526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int k, maxwds, sign, wds; 527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong x[1]; 528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef struct Bigint Bigint; 531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bigint *freelist[Kmax+1]; 533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bigint * 535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottBalloc 536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (k) int k; 538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (int k) 540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int x; 543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *rv; 544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Omit_Private_Memory 545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott unsigned int len; 546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ACQUIRE_DTOA_LOCK(0); 549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */ 550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* but this case seems very unlikely. */ 551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k <= Kmax && (rv = freelist[k])) 552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott freelist[k] = rv->next; 553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = 1 << k; 555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Omit_Private_Memory 556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong)); 557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) 559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /sizeof(double); 560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) { 561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv = (Bigint*)pmem_next; 562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pmem_next += len; 563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv = (Bigint*)MALLOC(len*sizeof(double)); 566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv->k = k; 568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv->maxwds = x; 569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FREE_DTOA_LOCK(0); 571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv->sign = rv->wds = 0; 572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return rv; 573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static void 576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottBfree 577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (v) Bigint *v; 579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (Bigint *v) 581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (v) { 584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (v->k > Kmax) 585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef FREE 586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FREE((void*)v); 587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott free((void*)v); 589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ACQUIRE_DTOA_LOCK(0); 592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott v->next = freelist[v->k]; 593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott freelist[v->k] = v; 594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FREE_DTOA_LOCK(0); 595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \ 600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotty->wds*sizeof(Long) + 2*sizeof(int)) 601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bigint * 603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottmultadd 604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (b, m, a) Bigint *b; int m, a; 606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (Bigint *b, int m, int a) /* multiply by m and add a */ 608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i, wds; 611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef ULLong 612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong *x; 613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULLong carry, y; 614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong carry, *x, y; 616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong xi, z; 618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *b1; 621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott wds = b->wds; 623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = b->x; 624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 0; 625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = a; 626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef ULLong 628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = *x * (ULLong)m + carry; 629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = y >> 32; 630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *x++ = y & FFFFFFFF; 631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xi = *x; 634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = (xi & 0xffff) * m + carry; 635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = (xi >> 16) * m + (y >> 16); 636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = z >> 16; 637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *x++ = (z << 16) + (y & 0xffff); 638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = *x * m + carry; 640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = y >> 16; 641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *x++ = y & 0xffff; 642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(++i < wds); 646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (carry) { 647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (wds >= b->maxwds) { 648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b1 = Balloc(b->k+1); 649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bcopy(b1, b); 650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(b); 651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = b1; 652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->x[wds++] = carry; 654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->wds = wds; 655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return b; 657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bigint * 660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotts2b 661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (s, nd0, nd, y9, dplen) CONST char *s; int nd0, nd, dplen; ULong y9; 663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (CONST char *s, int nd0, int nd, ULong y9, int dplen) 665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *b; 668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i, k; 669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Long x, y; 670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = (nd + 8) / 9; 672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(k = 0, y = 1; x > y; y <<= 1, k++) ; 673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = Balloc(k); 675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->x[0] = y9; 676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->wds = 1; 677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = Balloc(k+1); 679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->x[0] = y9 & 0xffff; 680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->wds = (b->x[1] = y9 >> 16) ? 2 : 1; 681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 9; 684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (9 < nd0) { 685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s += 9; 686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do b = multadd(b, 10, *s++ - '0'); 687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(++i < nd0); 688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s += dplen; 689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s += dplen + 9; 692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(; i < nd; i++) 693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = multadd(b, 10, *s++ - '0'); 694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return b; 695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static int 698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotthi0bits 699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (x) ULong x; 701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (ULong x) 703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int k = 0; 706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(x & 0xffff0000)) { 708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = 16; 709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x <<= 16; 710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(x & 0xff000000)) { 712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k += 8; 713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x <<= 8; 714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(x & 0xf0000000)) { 716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k += 4; 717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x <<= 4; 718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(x & 0xc0000000)) { 720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k += 2; 721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x <<= 2; 722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(x & 0x80000000)) { 724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k++; 725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(x & 0x40000000)) 726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 32; 727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return k; 729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static int 732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottlo0bits 733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (y) ULong *y; 735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (ULong *y) 737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int k; 740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong x = *y; 741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (x & 7) { 743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (x & 1) 744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 0; 745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (x & 2) { 746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *y = x >> 1; 747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 1; 748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *y = x >> 2; 750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 2; 751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = 0; 753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(x & 0xffff)) { 754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = 16; 755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x >>= 16; 756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(x & 0xff)) { 758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k += 8; 759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x >>= 8; 760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(x & 0xf)) { 762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k += 4; 763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x >>= 4; 764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(x & 0x3)) { 766c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k += 2; 767c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x >>= 2; 768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(x & 1)) { 770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k++; 771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x >>= 1; 772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!x) 773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 32; 774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *y = x; 776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return k; 777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bigint * 780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotti2b 781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (i) int i; 783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (int i) 785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *b; 788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = Balloc(1); 790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->x[0] = i; 791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->wds = 1; 792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return b; 793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bigint * 796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottmult 797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (a, b) Bigint *a, *b; 799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (Bigint *a, Bigint *b) 801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *c; 804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int k, wa, wb, wc; 805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0; 806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong y; 807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef ULLong 808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULLong carry, z; 809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong carry, z; 811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong z2; 813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (a->wds < b->wds) { 817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c = a; 818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott a = b; 819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = c; 820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = a->k; 822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott wa = a->wds; 823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott wb = b->wds; 824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott wc = wa + wb; 825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (wc > a->maxwds) 826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k++; 827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c = Balloc(k); 828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(x = c->x, xa = x + wc; x < xa; x++) 829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *x = 0; 830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xa = a->x; 831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xae = xa + wa; 832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xb = b->x; 833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xbe = xb + wb; 834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xc0 = c->x; 835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef ULLong 836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(; xb < xbe; xc0++) { 837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((y = *xb++)) { 838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = xa; 839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xc = xc0; 840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = 0; 841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = *x++ * (ULLong)y + *xc + carry; 843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = z >> 32; 844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *xc++ = z & FFFFFFFF; 845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(x < xae); 847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *xc = carry; 848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(; xb < xbe; xb++, xc0++) { 853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (y = *xb & 0xffff) { 854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = xa; 855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xc = xc0; 856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = 0; 857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; 859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = z >> 16; 860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; 861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = z2 >> 16; 862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Storeinc(xc, z2, z); 863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(x < xae); 865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *xc = carry; 866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (y = *xb >> 16) { 868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = xa; 869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xc = xc0; 870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = 0; 871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z2 = *xc; 872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = (*x & 0xffff) * y + (*xc >> 16) + carry; 874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = z >> 16; 875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Storeinc(xc, z, z2); 876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; 877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = z2 >> 16; 878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(x < xae); 880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *xc = z2; 881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(; xb < xbe; xc0++) { 885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (y = *xb++) { 886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = xa; 887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xc = xc0; 888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = 0; 889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = *x++ * y + *xc + carry; 891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = z >> 16; 892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *xc++ = z & 0xffff; 893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(x < xae); 895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *xc = carry; 896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; 901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c->wds = wc; 902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return c; 903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bigint *p5s; 906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bigint * 908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottpow5mult 909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (b, k) Bigint *b; int k; 911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (Bigint *b, int k) 913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *b1, *p5, *p51; 916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i; 917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static int p05[3] = { 5, 25, 125 }; 918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((i = k & 3)) 920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = multadd(b, p05[i-1], 0); 921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(k >>= 2)) 923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return b; 924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(p5 = p5s)) { 925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* first time */ 926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef MULTIPLE_THREADS 927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ACQUIRE_DTOA_LOCK(1); 928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(p5 = p5s)) { 929c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p5 = p5s = i2b(625); 930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p5->next = 0; 931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 932c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FREE_DTOA_LOCK(1); 933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 934c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p5 = p5s = i2b(625); 935c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p5->next = 0; 936c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 937c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 938c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(;;) { 939c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k & 1) { 940c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b1 = mult(b, p5); 941c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(b); 942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = b1; 943c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(k >>= 1)) 945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(p51 = p5->next)) { 947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef MULTIPLE_THREADS 948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ACQUIRE_DTOA_LOCK(1); 949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(p51 = p5->next)) { 950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p51 = p5->next = mult(p5,p5); 951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p51->next = 0; 952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FREE_DTOA_LOCK(1); 954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p51 = p5->next = mult(p5,p5); 956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p51->next = 0; 957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p5 = p51; 960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 961c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return b; 962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bigint * 965c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottlshift 966c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 967c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (b, k) Bigint *b; int k; 968c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (Bigint *b, int k) 970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i, k1, n, n1; 973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *b1; 974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong *x, *x1, *xe, z; 975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n = k >> 5; 978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 979c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n = k >> 4; 980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k1 = b->k; 982c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n1 = n + b->wds + 1; 983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = b->maxwds; n1 > i; i <<= 1) 984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k1++; 985c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b1 = Balloc(k1); 986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x1 = b1->x; 987c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = 0; i < n; i++) 988c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *x1++ = 0; 989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = b->x; 990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xe = x + b->wds; 991c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k &= 0x1f) { 993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k1 = 32 - k; 994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = 0; 995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *x1++ = *x << k | z; 997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = *x++ >> k1; 998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 999c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(x < xe); 1000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((*x1 = z)) 1001c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ++n1; 1002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1003c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1004c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k &= 0xf) { 1005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k1 = 16 - k; 1006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = 0; 1007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 1008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *x1++ = *x << k & 0xffff | z; 1009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = *x++ >> k1; 1010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(x < xe); 1012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*x1 = z) 1013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ++n1; 1014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else do 1017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *x1++ = *x++; 1018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(x < xe); 1019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b1->wds = n1 - 1; 1020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(b); 1021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return b1; 1022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static int 1025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottcmp 1026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (a, b) Bigint *a, *b; 1028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (Bigint *a, Bigint *b) 1030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong *xa, *xa0, *xb, *xb0; 1033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i, j; 1034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = a->wds; 1036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = b->wds; 1037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef DEBUG 1038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i > 1 && !a->x[i-1]) 1039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bug("cmp called with a->x[a->wds-1] == 0"); 1040c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j > 1 && !b->x[j-1]) 1041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bug("cmp called with b->x[b->wds-1] == 0"); 1042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i -= j) 1044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return i; 1045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xa0 = a->x; 1046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xa = xa0 + j; 1047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xb0 = b->x; 1048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xb = xb0 + j; 1049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(;;) { 1050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*--xa != *--xb) 1051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return *xa < *xb ? -1 : 1; 1052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (xa <= xa0) 1053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 1054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 0; 1056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bigint * 1059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottdiff 1060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (a, b) Bigint *a, *b; 1062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (Bigint *a, Bigint *b) 1064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *c; 1067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i, wa, wb; 1068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong *xa, *xae, *xb, *xbe, *xc; 1069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef ULLong 1070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULLong borrow, y; 1071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong borrow, y; 1073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 1074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong z; 1075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = cmp(a,b); 1079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!i) { 1080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c = Balloc(0); 1081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c->wds = 1; 1082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c->x[0] = 0; 1083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return c; 1084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i < 0) { 1086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c = a; 1087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott a = b; 1088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = c; 1089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 1; 1090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 1092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 0; 1093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c = Balloc(a->k); 1094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c->sign = i; 1095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott wa = a->wds; 1096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xa = a->x; 1097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xae = xa + wa; 1098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott wb = b->wds; 1099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xb = b->x; 1100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xbe = xb + wb; 1101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xc = c->x; 1102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = 0; 1103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef ULLong 1104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 1105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = (ULLong)*xa++ - *xb++ - borrow; 1106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = y >> 32 & (ULong)1; 1107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *xc++ = y & FFFFFFFF; 1108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(xb < xbe); 1110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(xa < xae) { 1111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = *xa++ - borrow; 1112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = y >> 32 & (ULong)1; 1113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *xc++ = y & FFFFFFFF; 1114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 1117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 1118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = (*xa & 0xffff) - (*xb & 0xffff) - borrow; 1119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = (y & 0x10000) >> 16; 1120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = (*xa++ >> 16) - (*xb++ >> 16) - borrow; 1121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = (z & 0x10000) >> 16; 1122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Storeinc(xc, z, y); 1123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(xb < xbe); 1125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(xa < xae) { 1126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = (*xa & 0xffff) - borrow; 1127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = (y & 0x10000) >> 16; 1128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = (*xa++ >> 16) - borrow; 1129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = (z & 0x10000) >> 16; 1130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Storeinc(xc, z, y); 1131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 1134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = *xa++ - *xb++ - borrow; 1135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = (y & 0x10000) >> 16; 1136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *xc++ = y & 0xffff; 1137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(xb < xbe); 1139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(xa < xae) { 1140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = *xa++ - borrow; 1141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = (y & 0x10000) >> 16; 1142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *xc++ = y & 0xffff; 1143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(!*--xc) 1147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott wa--; 1148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c->wds = wa; 1149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return c; 1150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static double 1153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottulp 1154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (x) U *x; 1156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (U *x) 1158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Long L; 1161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott U u; 1162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; 1164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Avoid_Underflow 1165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 1166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (L > 0) { 1167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 1170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L |= Exp_msk1 >> 4; 1171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&u) = L; 1173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&u) = 0; 1174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Avoid_Underflow 1175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 1176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 1178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L = -L >> Exp_shift; 1179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (L < Exp_shift) { 1180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&u) = 0x80000 >> L; 1181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&u) = 0; 1182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 1184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&u) = 0; 1185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L -= Exp_shift; 1186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&u) = L >= 31 ? 1 : 1 << 31 - L; 1187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return dval(&u); 1192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static double 1195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottb2d 1196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (a, e) Bigint *a; int *e; 1198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (Bigint *a, int *e) 1200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong *xa, *xa0, w, y, z; 1203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int k; 1204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott U d; 1205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef VAX 1206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong d0, d1; 1207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define d0 word0(&d) 1209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define d1 word1(&d) 1210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xa0 = a->x; 1213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xa = xa0 + a->wds; 1214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = *--xa; 1215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef DEBUG 1216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!y) Bug("zero y in b2d"); 1217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = hi0bits(y); 1219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *e = 32 - k; 1220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 1221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k < Ebits) { 1222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d0 = Exp_1 | y >> (Ebits - k); 1223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott w = xa > xa0 ? *--xa : 0; 1224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d1 = y << ((32-Ebits) + k) | w >> (Ebits - k); 1225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret_d; 1226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = xa > xa0 ? *--xa : 0; 1228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k -= Ebits) { 1229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d0 = Exp_1 | y << k | z >> (32 - k); 1230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = xa > xa0 ? *--xa : 0; 1231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d1 = z << k | y >> (32 - k); 1232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 1234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d0 = Exp_1 | y; 1235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d1 = z; 1236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k < Ebits + 16) { 1239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = xa > xa0 ? *--xa : 0; 1240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k; 1241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott w = xa > xa0 ? *--xa : 0; 1242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = xa > xa0 ? *--xa : 0; 1243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k; 1244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret_d; 1245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = xa > xa0 ? *--xa : 0; 1247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott w = xa > xa0 ? *--xa : 0; 1248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k -= Ebits + 16; 1249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k; 1250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = xa > xa0 ? *--xa : 0; 1251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d1 = w << k + 16 | y << k; 1252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ret_d: 1254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef VAX 1255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&d) = d0 >> 16 | d0 << 16; 1256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&d) = d1 >> 16 | d1 << 16; 1257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef d0 1259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef d1 1260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return dval(&d); 1262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bigint * 1265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottd2b 1266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (d, e, bits) U *d; int *e, *bits; 1268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (U *d, int *e, int *bits) 1270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *b; 1273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int de, k; 1274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong *x, y, z; 1275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 1276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i; 1277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef VAX 1279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong d0, d1; 1280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d0 = word0(d) >> 16 | word0(d) << 16; 1281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d1 = word1(d) >> 16 | word1(d) << 16; 1282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define d0 word0(d) 1284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define d1 word1(d) 1285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 1288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = Balloc(1); 1289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = Balloc(2); 1291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = b->x; 1293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = d0 & Frac_mask; 1295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ 1296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Sudden_Underflow 1297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott de = (int)(d0 >> Exp_shift); 1298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef IBM 1299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z |= Exp_msk11; 1300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((de = (int)(d0 >> Exp_shift))) 1303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z |= Exp_msk1; 1304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 1306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((y = d1)) { 1307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((k = lo0bits(&y))) { 1308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[0] = y | z << (32 - k); 1309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z >>= k; 1310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 1312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[0] = y; 1313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 1314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 1315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->wds = (x[1] = z) ? 2 : 1; 1317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 1319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = lo0bits(&z); 1320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[0] = z; 1321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 1322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 1323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->wds = 1; 1325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k += 32; 1326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (y = d1) { 1329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k = lo0bits(&y)) 1330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k >= 16) { 1331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[0] = y | z << 32 - k & 0xffff; 1332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[1] = z >> k - 16 & 0xffff; 1333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[2] = z >> k; 1334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 2; 1335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 1337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[0] = y & 0xffff; 1338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[1] = y >> 16 | z << 16 - k & 0xffff; 1339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[2] = z >> k & 0xffff; 1340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[3] = z >> k+16; 1341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 3; 1342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 1344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[0] = y & 0xffff; 1345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[1] = y >> 16; 1346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[2] = z & 0xffff; 1347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[3] = z >> 16; 1348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 3; 1349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 1352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef DEBUG 1353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!z) 1354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bug("Zero passed to d2b"); 1355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = lo0bits(&z); 1357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k >= 16) { 1358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[0] = z; 1359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 0; 1360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 1362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[0] = z & 0xffff; 1363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[1] = z >> 16; 1364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 1; 1365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k += 32; 1367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(!x[i]) 1369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott --i; 1370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->wds = i + 1; 1371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 1373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (de) { 1374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 1376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *e = (de - Bias - (P-1) << 2) + k; 1377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask); 1378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *e = de - Bias - (P-1) + k; 1380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *bits = P - k; 1381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 1383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 1385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *e = de - Bias - (P-1) + 1 + k; 1386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 1387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *bits = 32*i - hi0bits(x[i-1]); 1388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *bits = (i+2)*16 - hi0bits(x[i]); 1390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return b; 1394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef d0 1396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef d1 1397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static double 1399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottratio 1400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (a, b) Bigint *a, *b; 1402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (Bigint *a, Bigint *b) 1404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott U da, db; 1407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int k, ka, kb; 1408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&da) = b2d(a, &ka); 1410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&db) = b2d(b, &kb); 1411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 1412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = ka - kb + 32*(a->wds - b->wds); 1413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = ka - kb + 16*(a->wds - b->wds); 1415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 1417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k > 0) { 1418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&da) += (k >> 2)*Exp_msk1; 1419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k &= 3) 1420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&da) *= 1 << k; 1421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 1423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = -k; 1424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&db) += (k >> 2)*Exp_msk1; 1425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k &= 3) 1426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&db) *= 1 << k; 1427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k > 0) 1430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&da) += k*Exp_msk1; 1431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 1432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = -k; 1433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&db) += k*Exp_msk1; 1434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return dval(&da) / dval(&db); 1437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static CONST double 1440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttens[] = { 1441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1e20, 1e21, 1e22 1444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef VAX 1445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott , 1e23, 1e24 1446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static CONST double 1450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith 1451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; 1452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 1454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9007199254740992.*9007199254740992.e-256 1455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* = 2^106 * 1e-256 */ 1456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1e-256 1458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */ 1461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* flag unnecessarily. It leads to a song and dance at the end of strtod. */ 1462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Scale_Bit 0x10 1463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define n_bigtens 5 1464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 1466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbigtens[] = { 1e16, 1e32, 1e64 }; 1467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 }; 1468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define n_bigtens 3 1469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbigtens[] = { 1e16, 1e32 }; 1471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic CONST double tinytens[] = { 1e-16, 1e-32 }; 1472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define n_bigtens 2 1473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef Need_Hexdig 1477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef INFNAN_CHECK 1478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef No_Hex_NaN 1479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Need_Hexdig 1480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Need_Hexdig 1484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_HEX_FP 1485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define Need_Hexdig 1486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Need_Hexdig /*{*/ 1490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic unsigned char hexdig[256]; 1491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static void 1493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotthtinit(h, s, inc) unsigned char *h; unsigned char *s; int inc; 1495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotthtinit(unsigned char *h, unsigned char *s, int inc) 1497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i, j; 1500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = 0; (j = s[i]) !=0; i++) 1501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott h[j] = i + inc; 1502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static void 1505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotthexdig_init() 1507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotthexdig_init(void) 1509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define USC (unsigned char *) 1512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott htinit(hexdig, USC "0123456789", 0x10); 1513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott htinit(hexdig, USC "abcdef", 0x10 + 10); 1514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott htinit(hexdig, USC "ABCDEF", 0x10 + 10); 1515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* } Need_Hexdig */ 1517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef INFNAN_CHECK 1519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NAN_WORD0 1521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NAN_WORD0 0x7ff80000 1522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NAN_WORD1 1525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NAN_WORD1 0 1526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static int 1529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottmatch 1530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (sp, t) char **sp, *t; 1532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (CONST char **sp, CONST char *t) 1534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int c, d; 1537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CONST char *s = *sp; 1538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while((d = *t++)) { 1540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((c = *++s) >= 'A' && c <= 'Z') 1541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c += 'a' - 'A'; 1542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (c != d) 1543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 0; 1544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *sp = s + 1; 1546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 1; 1547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef No_Hex_NaN 1550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static void 1551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotthexnan 1552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (rvp, sp) U *rvp; CONST char **sp; 1554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (U *rvp, CONST char **sp) 1556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong c, x[2]; 1559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CONST char *s; 1560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int c1, havedig, udx0, xshift; 1561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!hexdig['0']) 1563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott hexdig_init(); 1564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[0] = x[1] = 0; 1565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott havedig = xshift = 0; 1566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott udx0 = 1; 1567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s = *sp; 1568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* allow optional initial 0x or 0X */ 1569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while((c = *(CONST unsigned char*)(s+1)) && c <= ' ') 1570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ++s; 1571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X')) 1572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s += 2; 1573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while((c = *(CONST unsigned char*)++s)) { 1574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((c1 = hexdig[c])) 1575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c = c1 & 0xf; 1576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (c <= ' ') { 1577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (udx0 && havedig) { 1578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott udx0 = 0; 1579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xshift = 1; 1580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott continue; 1582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GDTOA_NON_PEDANTIC_NANCHECK 1584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (/*(*/ c == ')' && havedig) { 1585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *sp = s + 1; 1586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 1587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 1589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; /* invalid form: don't change *sp */ 1590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 1592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 1593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (/*(*/ c == ')') { 1594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *sp = s + 1; 1595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 1596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } while((c = *++s)); 1598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 1599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott havedig = 1; 1602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (xshift) { 1603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xshift = 0; 1604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[0] = x[1]; 1605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[1] = 0; 1606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (udx0) 1608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[0] = (x[0] << 4) | (x[1] >> 28); 1609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x[1] = (x[1] << 4) | c; 1610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((x[0] &= 0xfffff) || x[1]) { 1612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(rvp) = Exp_mask | x[0]; 1613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(rvp) = x[1]; 1614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*No_Hex_NaN*/ 1617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* INFNAN_CHECK */ 1618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 1620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ULbits 32 1621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define kshift 5 1622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define kmask 31 1623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ULbits 16 1625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define kshift 4 1626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define kmask 15 1627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_HEX_FP /*{*/ 1629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static void 1631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottrshift(b, k) Bigint *b; int k; 1633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottrshift(Bigint *b, int k) 1635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong *x, *x1, *xe, y; 1638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int n; 1639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = x1 = b->x; 1641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n = k >> kshift; 1642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (n < b->wds) { 1643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xe = x + b->wds; 1644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x += n; 1645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k &= kmask) { 1646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n = 32 - k; 1647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = *x++ >> k; 1648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(x < xe) { 1649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *x1++ = (y | (*x << n)) & 0xffffffff; 1650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = *x++ >> k; 1651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((*x1 = y) !=0) 1653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x1++; 1654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 1656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(x < xe) 1657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *x1++ = *x++; 1658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((b->wds = x1 - b->x) == 0) 1660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->x[0] = 0; 1661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static ULong 1664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottany_on(b, k) Bigint *b; int k; 1666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottany_on(Bigint *b, int k) 1668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int n, nwds; 1671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong *x, *x0, x1, x2; 1672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = b->x; 1674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nwds = b->wds; 1675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n = k >> kshift; 1676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (n > nwds) 1677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n = nwds; 1678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (n < nwds && (k &= kmask)) { 1679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x1 = x2 = x[n]; 1680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x1 >>= k; 1681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x1 <<= k; 1682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (x1 != x2) 1683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 1; 1684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x0 = x; 1686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x += n; 1687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(x > x0) 1688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*--x) 1689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 1; 1690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 0; 1691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottenum { /* rounding values: same as FLT_ROUNDS */ 1694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Round_zero = 0, 1695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Round_near = 1, 1696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Round_up = 2, 1697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Round_down = 3 1698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bigint * 1701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottincrement(b) Bigint *b; 1703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottincrement(Bigint *b) 1705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong *x, *xe; 1708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *b1; 1709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = b->x; 1711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xe = x + b->wds; 1712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 1713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*x < (ULong)0xffffffffL) { 1714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ++*x; 1715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return b; 1716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *x++ = 0; 1718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } while(x < xe); 1719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 1720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (b->wds >= b->maxwds) { 1721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b1 = Balloc(b->k+1); 1722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bcopy(b1,b); 1723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(b); 1724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = b1; 1725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->x[b->wds++] = 1; 1727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return b; 1729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void 1732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 1733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottgethex(sp, rvp, rounding, sign) 1734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CONST char **sp; U *rvp; int rounding, sign; 1735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottgethex( CONST char **sp, U *rvp, int rounding, int sign) 1737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *b; 1740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CONST unsigned char *decpt, *s0, *s, *s1; 1741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Long e, e1; 1742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong L, lostbits, *x; 1743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int big, denorm, esign, havedig, k, n, nbits, up, zret; 1744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 1745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int j; 1746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott enum { 1748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith /*{{*/ 1749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott emax = 0x7fe - Bias - P + 1, 1750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott emin = Emin - P + 1 1751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else /*}{*/ 1752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott emin = Emin - P, 1753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef VAX 1754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott emax = 0x7ff - Bias - P + 1 1755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 1757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott emax = 0x7f - Bias - P 1758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*}}*/ 1760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef USE_LOCALE 1762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i; 1763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef NO_LOCALE_CACHE 1764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const unsigned char *decimalpoint = (unsigned char*) 1765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott localeconv()->decimal_point; 1766c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1767c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const unsigned char *decimalpoint; 1768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static unsigned char *decimalpoint_cache; 1769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(s0 = decimalpoint_cache)) { 1770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s0 = (unsigned char*)localeconv()->decimal_point; 1771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((decimalpoint_cache = (unsigned char*) 1772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MALLOC(strlen((CONST char*)s0) + 1))) { 1773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott strcpy((char*)decimalpoint_cache, (CONST char*)s0); 1774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s0 = decimalpoint_cache; 1775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott decimalpoint = s0; 1778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!hexdig['0']) 1782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott hexdig_init(); 1783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott havedig = 0; 1784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s0 = *(CONST unsigned char **)sp + 2; 1785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(s0[havedig] == '0') 1786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott havedig++; 1787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s0 += havedig; 1788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s = s0; 1789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott decpt = 0; 1790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott zret = 0; 1791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e = 0; 1792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (hexdig[*s]) 1793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott havedig++; 1794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 1795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott zret = 1; 1796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef USE_LOCALE 1797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = 0; decimalpoint[i]; ++i) { 1798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (s[i] != decimalpoint[i]) 1799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto pcheck; 1800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott decpt = s += i; 1802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*s != '.') 1804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto pcheck; 1805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott decpt = ++s; 1806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!hexdig[*s]) 1808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto pcheck; 1809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(*s == '0') 1810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s++; 1811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (hexdig[*s]) 1812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott zret = 0; 1813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott havedig = 1; 1814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s0 = s; 1815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(hexdig[*s]) 1817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s++; 1818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef USE_LOCALE 1819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*s == *decimalpoint && !decpt) { 1820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = 1; decimalpoint[i]; ++i) { 1821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (s[i] != decimalpoint[i]) 1822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto pcheck; 1823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott decpt = s += i; 1825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*s == '.' && !decpt) { 1827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott decpt = ++s; 1828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(hexdig[*s]) 1830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s++; 1831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }/*}*/ 1832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (decpt) 1833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e = -(((Long)(s-decpt)) << 2); 1834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pcheck: 1835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s1 = s; 1836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott big = esign = 0; 1837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(*s) { 1838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 'p': 1839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 'P': 1840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(*++s) { 1841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '-': 1842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott esign = 1; 1843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* no break */ 1844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '+': 1845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s++; 1846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((n = hexdig[*s]) == 0 || n > 0x19) { 1848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s = s1; 1849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 1850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e1 = n - 0x10; 1852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while((n = hexdig[*++s]) !=0 && n <= 0x19) { 1853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e1 & 0xf8000000) 1854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott big = 1; 1855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e1 = 10*e1 + n - 0x10; 1856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (esign) 1858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e1 = -e1; 1859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e += e1; 1860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *sp = (char*)s; 1862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!havedig) 1863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *sp = (char*)s0 - 1; 1864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (zret) 1865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto retz1; 1866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (big) { 1867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (esign) { 1868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith 1869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(rounding) { 1870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_up: 1871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (sign) 1872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 1873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret_tiny; 1874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_down: 1875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!sign) 1876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 1877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret_tiny; 1878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto retz; 1881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith 1882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ret_tiny: 1883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_ERRNO 1884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott errno = ERANGE; 1885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(rvp) = 0; 1887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(rvp) = 1; 1888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 1889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* IEEE_Arith */ 1890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(rounding) { 1892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_near: 1893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ovfl1; 1894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_up: 1895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!sign) 1896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ovfl1; 1897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret_big; 1898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_down: 1899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (sign) 1900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ovfl1; 1901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret_big; 1902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ret_big: 1904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(rvp) = Big0; 1905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(rvp) = Big1; 1906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 1907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n = s1 - s0 - 1; 1909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(k = 0; n > (1 << (kshift-2)) - 1; n >>= 1) 1910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k++; 1911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = Balloc(k); 1912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = b->x; 1913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n = 0; 1914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L = 0; 1915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef USE_LOCALE 1916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = 0; decimalpoint[i+1]; ++i); 1917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(s1 > s0) { 1919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef USE_LOCALE 1920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*--s1 == decimalpoint[i]) { 1921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s1 -= i; 1922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott continue; 1923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*--s1 == '.') 1926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott continue; 1927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (n == ULbits) { 1929c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *x++ = L; 1930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L = 0; 1931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n = 0; 1932c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L |= (hexdig[*s1] & 0x0f) << n; 1934c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n += 4; 1935c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1936c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *x++ = L; 1937c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->wds = n = x - b->x; 1938c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n = ULbits*n - hi0bits(L); 1939c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nbits = Nbits; 1940c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott lostbits = 0; 1941c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = b->x; 1942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (n > nbits) { 1943c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n -= nbits; 1944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (any_on(b,n)) { 1945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott lostbits = 1; 1946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = n - 1; 1947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (x[k>>kshift] & 1 << (k & kmask)) { 1948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott lostbits = 2; 1949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k > 0 && any_on(b,k)) 1950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott lostbits = 3; 1951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rshift(b, n); 1954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e += n; 1955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (n < nbits) { 1957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n = nbits - n; 1958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = lshift(b, n); 1959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e -= n; 1960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = b->x; 1961c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e > Emax) { 1963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ovfl: 1964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(b); 1965c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ovfl1: 1966c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_ERRNO 1967c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott errno = ERANGE; 1968c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(rvp) = Exp_mask; 1970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(rvp) = 0; 1971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 1972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott denorm = 0; 1974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e < emin) { 1975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott denorm = 1; 1976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n = emin - e; 1977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (n >= nbits) { 1978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith /*{*/ 1979c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch (rounding) { 1980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_near: 1981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (n == nbits && (n < 2 || any_on(b,n-1))) 1982c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret_tiny; 1983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 1984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_up: 1985c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!sign) 1986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret_tiny; 1987c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 1988c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_down: 1989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (sign) 1990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret_tiny; 1991c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* } IEEE_Arith */ 1993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(b); 1994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott retz: 1995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_ERRNO 1996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott errno = ERANGE; 1997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott retz1: 1999c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rvp->d = 0.; 2000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 2001c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = n - 1; 2003c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (lostbits) 2004c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott lostbits = 1; 2005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (k > 0) 2006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott lostbits = any_on(b,k); 2007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (x[k>>kshift] & 1 << (k & kmask)) 2008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott lostbits |= 2; 2009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nbits -= n; 2010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rshift(b,n); 2011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e = emin; 2012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (lostbits) { 2014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott up = 0; 2015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(rounding) { 2016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_zero: 2017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_near: 2019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (lostbits & 2 2020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott && (lostbits & 1) | (x[0] & 1)) 2021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott up = 1; 2022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_up: 2024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott up = 1 - sign; 2025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_down: 2027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott up = sign; 2028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (up) { 2030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = b->wds; 2031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = increment(b); 2032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = b->x; 2033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (denorm) { 2034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if 0 2035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (nbits == Nbits - 1 2036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott && x[nbits >> kshift] & 1 << (nbits & kmask)) 2037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott denorm = 0; /* not currently used */ 2038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2040c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (b->wds > k 2041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott || ((n = nbits & kmask) !=0 2042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott && hi0bits(x[k-1]) < 32-n)) { 2043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rshift(b,1); 2044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (++e > Emax) 2045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ovfl; 2046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith 2050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (denorm) 2051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(rvp) = b->wds > 1 ? b->x[1] & ~0x100000 : 0; 2052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(rvp) = (b->x[1] & ~0x100000) | ((e + 0x3ff + 52) << 20); 2054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(rvp) = b->x[0]; 2055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 2057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((j = e & 3)) { 2058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = b->x[0] & ((1 << j) - 1); 2059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rshift(b,j); 2060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k) { 2061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(rounding) { 2062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_up: 2063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!sign) 2064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott increment(b); 2065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_down: 2067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (sign) 2068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott increment(b); 2069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case Round_near: 2071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = 1 << (j-1); 2072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k & j && ((k & (j-1)) | lostbits)) 2073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott increment(b); 2074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e >>= 2; 2078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(rvp) = b->x[1] | ((e + 65 + 13) << 24); 2079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(rvp) = b->x[0]; 2080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef VAX 2082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* The next two lines ignore swap of low- and high-order 2 bytes. */ 2083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* word0(rvp) = (b->x[1] & ~0x800000) | ((e + 129 + 55) << 23); */ 2084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* word1(rvp) = b->x[0]; */ 2085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(rvp) = ((b->x[1] & ~0x800000) >> 16) | ((e + 129 + 55) << 7) | (b->x[1] << 16); 2086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(rvp) = (b->x[0] >> 16) | (b->x[0] << 16); 2087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(b); 2089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*}!NO_HEX_FP*/ 2091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static int 2093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 2094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottdshift(b, p2) Bigint *b; int p2; 2095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottdshift(Bigint *b, int p2) 2097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 2099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int rv = hi0bits(b->x[b->wds-1]) - 4; 2100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (p2 > 0) 2101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv -= p2; 2102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return rv & kmask; 2103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static int 2106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottquorem 2107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 2108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (b, S) Bigint *b, *S; 2109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (Bigint *b, Bigint *S) 2111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 2113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int n; 2114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong *bx, *bxe, q, *sx, *sxe; 2115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef ULLong 2116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULLong borrow, carry, y, ys; 2117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong borrow, carry, y, ys; 2119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 2120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong si, z, zs; 2121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott n = S->wds; 2125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef DEBUG 2126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /*debug*/ if (b->wds > n) 2127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /*debug*/ Bug("oversize b in quorem"); 2128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (b->wds < n) 2130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 0; 2131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sx = S->x; 2132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sxe = sx + --n; 2133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bx = b->x; 2134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bxe = bx + n; 2135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ 2136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef DEBUG 2137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /*debug*/ if (q > 9) 2138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /*debug*/ Bug("oversized quotient in quorem"); 2139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (q) { 2141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = 0; 2142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = 0; 2143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 2144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef ULLong 2145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ys = *sx++ * (ULLong)q + carry; 2146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = ys >> 32; 2147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = *bx - (ys & FFFFFFFF) - borrow; 2148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = y >> 32 & (ULong)1; 2149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *bx++ = y & FFFFFFFF; 2150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 2152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott si = *sx++; 2153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ys = (si & 0xffff) * q + carry; 2154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott zs = (si >> 16) * q + (ys >> 16); 2155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = zs >> 16; 2156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = (*bx & 0xffff) - (ys & 0xffff) - borrow; 2157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = (y & 0x10000) >> 16; 2158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = (*bx >> 16) - (zs & 0xffff) - borrow; 2159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = (z & 0x10000) >> 16; 2160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Storeinc(bx, z, y); 2161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ys = *sx++ * q + carry; 2163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = ys >> 16; 2164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = *bx - (ys & 0xffff) - borrow; 2165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = (y & 0x10000) >> 16; 2166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *bx++ = y & 0xffff; 2167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(sx <= sxe); 2171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!*bxe) { 2172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bx = b->x; 2173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(--bxe > bx && !*bxe) 2174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott --n; 2175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->wds = n; 2176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (cmp(b, S) >= 0) { 2179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott q++; 2180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = 0; 2181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = 0; 2182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bx = b->x; 2183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sx = S->x; 2184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott do { 2185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef ULLong 2186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ys = *sx++ + carry; 2187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = ys >> 32; 2188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = *bx - (ys & FFFFFFFF) - borrow; 2189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = y >> 32 & (ULong)1; 2190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *bx++ = y & FFFFFFFF; 2191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 2193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott si = *sx++; 2194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ys = (si & 0xffff) + carry; 2195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott zs = (si >> 16) + (ys >> 16); 2196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = zs >> 16; 2197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = (*bx & 0xffff) - (ys & 0xffff) - borrow; 2198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = (y & 0x10000) >> 16; 2199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = (*bx >> 16) - (zs & 0xffff) - borrow; 2200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = (z & 0x10000) >> 16; 2201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Storeinc(bx, z, y); 2202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ys = *sx++ + carry; 2204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott carry = ys >> 16; 2205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = *bx - (ys & 0xffff) - borrow; 2206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott borrow = (y & 0x10000) >> 16; 2207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *bx++ = y & 0xffff; 2208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(sx <= sxe); 2212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bx = b->x; 2213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bxe = bx + n; 2214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!*bxe) { 2215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(--bxe > bx && !*bxe) 2216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott --n; 2217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->wds = n; 2218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return q; 2221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_STRTOD_BIGCOMP 2224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static void 2226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbigcomp 2227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 2228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (rv, s0, bc) 2229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott U *rv; CONST char *s0; BCinfo *bc; 2230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (U *rv, CONST char *s0, BCinfo *bc) 2232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 2234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *b, *d; 2235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int b2, bbits, d2, dd, dig, dsign, i, j, nd, nd0, p2, p5, speccase; 2236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dsign = bc->dsign; 2238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nd = bc->nd; 2239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nd0 = bc->nd0; 2240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p5 = nd + bc->e0 - 1; 2241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dd = speccase = 0; 2242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 2243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (rv->d == 0.) { /* special case: value near underflow-to-zero */ 2244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* threshold was rounded to zero */ 2245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = i2b(1); 2246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p2 = Emin - P + 1; 2247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bbits = 1; 2248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 2249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(rv) = (P+2) << Exp_shift; 2250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(rv) = 1; 2252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 0; 2254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 2255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc->rounding == 1) 2256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 2258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott speccase = 1; 2259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott --p2; 2260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dsign = 0; 2261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto have_i; 2262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = d2b(rv, &p2, &bbits); 2267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 2268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p2 -= bc->scale; 2269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* floor(log2(rv)) == bbits - 1 + p2 */ 2271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Check for denormal case. */ 2272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = P - bbits; 2273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i > (j = P - Emin - 1 + p2)) { 2274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Sudden_Underflow 2275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(b); 2276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = i2b(1); 2277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p2 = Emin; 2278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = P - 1; 2279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 2280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(rv) = (1 + bc->scale) << Exp_shift; 2281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(rv) = Exp_msk1; 2283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(rv) = 0; 2285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = j; 2287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 2290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc->rounding != 1) { 2291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i > 0) 2292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = lshift(b, i); 2293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dsign) 2294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = increment(b); 2295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 2299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = lshift(b, ++i); 2300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->x[0] |= 1; 2301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 2303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott have_i: 2304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p2 -= p5 + i; 2306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d = i2b(1); 2307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Arrange for convenient computation of quotients: 2308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * shift left if necessary so divisor has 4 leading 0 bits. 2309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 2310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (p5 > 0) 2311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d = pow5mult(d, p5); 2312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (p5 < 0) 2313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = pow5mult(b, -p5); 2314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (p2 > 0) { 2315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b2 = p2; 2316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d2 = 0; 2317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 2319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b2 = 0; 2320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d2 = -p2; 2321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = dshift(d, d2); 2323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((b2 += i) > 0) 2324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = lshift(b, b2); 2325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((d2 += i) > 0) 2326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott d = lshift(d, d2); 2327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Now b/d = exactly half-way between the two floating-point values */ 2329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* on either side of the input string. Compute first digit of b/d. */ 2330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(dig = quorem(b,d))) { 2332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = multadd(b, 10, 0); /* very unlikely */ 2333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dig = quorem(b,d); 2334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Compare b/d with s0 */ 2337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = 0; i < nd0; ) { 2339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((dd = s0[i++] - '0' - dig)) 2340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!b->x[0] && b->wds == 1) { 2342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i < nd) 2343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dd = 1; 2344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = multadd(b, 10, 0); 2347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dig = quorem(b,d); 2348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(j = bc->dp1; i++ < nd;) { 2350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((dd = s0[j++] - '0' - dig)) 2351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!b->x[0] && b->wds == 1) { 2353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i < nd) 2354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dd = 1; 2355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = multadd(b, 10, 0); 2358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dig = quorem(b,d); 2359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (b->x[0] || b->wds > 1) 2361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dd = -1; 2362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ret: 2363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(b); 2364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(d); 2365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 2366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc->rounding != 1) { 2367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dd < 0) { 2368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc->rounding == 0) { 2369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!dsign) 2370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto retlow1; 2371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (dsign) 2373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto rethi1; 2374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (dd > 0) { 2376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc->rounding == 0) { 2377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dsign) 2378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto rethi1; 2379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret1; 2380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!dsign) 2382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto rethi1; 2383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(rv) += 2.*ulp(rv); 2384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 2386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc->inexact = 0; 2387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dsign) 2388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto rethi1; 2389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (speccase) { 2394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dd <= 0) 2395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv->d = 0.; 2396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (dd < 0) { 2398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!dsign) /* does not happen for round-near */ 2399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottretlow1: 2400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(rv) -= ulp(rv); 2401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (dd > 0) { 2403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dsign) { 2404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rethi1: 2405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(rv) += ulp(rv); 2406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 2409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Exact half-way case: apply round-even rule. */ 2410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (word1(rv) & 1) { 2411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dsign) 2412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto rethi1; 2413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto retlow1; 2414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 2418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ret1: 2419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 2421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* NO_STRTOD_BIGCOMP */ 2423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott double 2425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstrtod 2426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 2427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (s00, se) CONST char *s00; char **se; 2428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (CONST char *s00, char **se) 2430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 2432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, e, e1; 2433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int esign, i, j, k, nd, nd0, nf, nz, nz0, sign; 2434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CONST char *s, *s0, *s1; 2435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott double aadj, aadj1; 2436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Long L; 2437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott U aadj2, adj, rv, rv0; 2438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong y, z; 2439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BCinfo bc; 2440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; 2441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 2442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int oldinexact; 2443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS /*{*/ 2445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */ 2446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.rounding = Flt_Rounds; 2447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else /*}{*/ 2448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.rounding = 1; 2449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(fegetround()) { 2450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case FE_TOWARDZERO: bc.rounding = 0; break; 2451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case FE_UPWARD: bc.rounding = 2; break; 2452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case FE_DOWNWARD: bc.rounding = 3; 2453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*}}*/ 2455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*}*/ 2456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef USE_LOCALE 2457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CONST char *s2; 2458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sign = nz0 = nz = bc.dplen = bc.uflchk = 0; 2461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) = 0.; 2462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(s = s00;;s++) switch(*s) { 2463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '-': 2464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sign = 1; 2465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* no break */ 2466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '+': 2467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*++s) 2468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto break2; 2469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* no break */ 2470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 0: 2471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret0; 2472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '\t': 2473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '\n': 2474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '\v': 2475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '\f': 2476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '\r': 2477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case ' ': 2478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott continue; 2479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott default: 2480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto break2; 2481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break2: 2483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*s == '0') { 2484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_HEX_FP /*{*/ 2485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(s[1]) { 2486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 'x': 2487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 'X': 2488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 2489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott gethex(&s, &rv, bc.rounding, sign); 2490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott gethex(&s, &rv, 1, sign); 2492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*}*/ 2496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nz0 = 1; 2497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(*++s == '0') ; 2498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!*s) 2499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s0 = s; 2502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = z = 0; 2503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) 2504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (nd < 9) 2505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = 10*y + c - '0'; 2506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (nd < 16) 2507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = 10*z + c - '0'; 2508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nd0 = nd; 2509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.dp0 = bc.dp1 = s - s0; 2510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef USE_LOCALE 2511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s1 = localeconv()->decimal_point; 2512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (c == *s1) { 2513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c = '.'; 2514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*++s1) { 2515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s2 = s; 2516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(;;) { 2517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*++s2 != *s1) { 2518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c = 0; 2519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!*++s1) { 2522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s = s2; 2523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (c == '.') { 2530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c = *++s; 2531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.dp1 = s - s0; 2532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.dplen = bc.dp1 - bc.dp0; 2533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!nd) { 2534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(; c == '0'; c = *++s) 2535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nz++; 2536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (c > '0' && c <= '9') { 2537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s0 = s; 2538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nf += nz; 2539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nz = 0; 2540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto have_dig; 2541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto dig_done; 2543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(; c >= '0' && c <= '9'; c = *++s) { 2545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott have_dig: 2546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nz++; 2547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (c -= '0') { 2548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nf += nz; 2549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = 1; i < nz; i++) 2550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (nd++ < 9) 2551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y *= 10; 2552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (nd <= DBL_DIG + 1) 2553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z *= 10; 2554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (nd++ < 9) 2555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = 10*y + c; 2556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (nd <= DBL_DIG + 1) 2557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = 10*z + c; 2558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nz = 0; 2559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dig_done: 2563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e = 0; 2564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (c == 'e' || c == 'E') { 2565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!nd && !nz && !nz0) { 2566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret0; 2567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s00 = s; 2569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott esign = 0; 2570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(c = *++s) { 2571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '-': 2572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott esign = 1; 2573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '+': 2574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c = *++s; 2575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (c >= '0' && c <= '9') { 2577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(c == '0') 2578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c = *++s; 2579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (c > '0' && c <= '9') { 2580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L = c - '0'; 2581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s1 = s; 2582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while((c = *++s) >= '0' && c <= '9') 2583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L = 10*L + c - '0'; 2584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (s - s1 > 8 || L > 19999) 2585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Avoid confusion from exponents 2586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * so large that e might overflow. 2587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 2588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e = 19999; /* safe for 16 bit ints */ 2589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e = (int)L; 2591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (esign) 2592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e = -e; 2593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e = 0; 2596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s = s00; 2599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!nd) { 2601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!nz && !nz0) { 2602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef INFNAN_CHECK 2603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Check for Nan and Infinity */ 2604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!bc.dplen) 2605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(c) { 2606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 'i': 2607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 'I': 2608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (match(&s,"nf")) { 2609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott --s; 2610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!match(&s,"inity")) 2611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ++s; 2612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) = 0x7ff00000; 2613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) = 0; 2614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 'n': 2618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 'N': 2619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (match(&s, "an")) { 2620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) = NAN_WORD0; 2621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) = NAN_WORD1; 2622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef No_Hex_NaN 2623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*s == '(') /*)*/ 2624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott hexnan(&rv, &s); 2625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* INFNAN_CHECK */ 2630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ret0: 2631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s = s00; 2632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sign = 0; 2633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.e0 = e1 = e -= nf; 2637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Now we have nd0 digits, starting at s0, followed by a 2639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * decimal point, followed by nd-nd0 digits. The number we're 2640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * after is the integer represented by those digits times 2641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 10**e */ 2642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!nd0) 2644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nd0 = nd; 2645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; 2646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) = y; 2647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k > 9) { 2648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 2649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k > DBL_DIG) 2650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott oldinexact = get_inexact(); 2651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) = tens[k - 9] * dval(&rv) + z; 2653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bd0 = 0; 2655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (nd <= DBL_DIG 2656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef RND_PRODQUOT 2657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Honor_FLT_ROUNDS 2658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott && Flt_Rounds == 1 2659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ) { 2662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!e) 2663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e > 0) { 2665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e <= Ten_pmax) { 2666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef VAX 2667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto vax_ovfl_check; 2668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 2670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* round correctly FLT_ROUNDS = 2 or 3 */ 2671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (sign) { 2672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv.d = -rv.d; 2673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sign = 0; 2674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* rv = */ rounded_product(dval(&rv), tens[e]); 2677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = DBL_DIG - nd; 2681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e <= Ten_pmax + i) { 2682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* A fancier test would sometimes let us do 2683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * this for larger i values. 2684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 2685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 2686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* round correctly FLT_ROUNDS = 2 or 3 */ 2687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (sign) { 2688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv.d = -rv.d; 2689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sign = 0; 2690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e -= i; 2693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) *= tens[i]; 2694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef VAX 2695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* VAX exponent range is so narrow we must 2696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * worry about overflow here... 2697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 2698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott vax_ovfl_check: 2699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) -= P*Exp_msk1; 2700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* rv = */ rounded_product(dval(&rv), tens[e]); 2701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((word0(&rv) & Exp_mask) 2702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) 2703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ovfl; 2704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) += P*Exp_msk1; 2705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* rv = */ rounded_product(dval(&rv), tens[e]); 2707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Inaccurate_Divide 2712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (e >= -Ten_pmax) { 2713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 2714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* round correctly FLT_ROUNDS = 2 or 3 */ 2715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (sign) { 2716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv.d = -rv.d; 2717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sign = 0; 2718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* rv = */ rounded_quotient(dval(&rv), tens[-e]); 2721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e1 += nd - k; 2726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith 2728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 2729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.inexact = 1; 2730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k <= DBL_DIG) 2731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott oldinexact = get_inexact(); 2732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 2734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.scale = 0; 2735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 2737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.rounding >= 2) { 2738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (sign) 2739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.rounding = bc.rounding == 2 ? 0 : 2; 2740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.rounding != 2) 2742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.rounding = 0; 2743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*IEEE_Arith*/ 2746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Get starting approximation = rv * 10**e1 */ 2748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e1 > 0) { 2750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((i = e1 & 15)) 2751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) *= tens[i]; 2752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e1 &= ~15) { 2753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e1 > DBL_MAX_10_EXP) { 2754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ovfl: 2755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_ERRNO 2756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott errno = ERANGE; 2757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Can't trust HUGE_VAL */ 2759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith 2760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 2761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(bc.rounding) { 2762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 0: /* toward 0 */ 2763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 3: /* toward -infinity */ 2764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) = Big0; 2765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) = Big1; 2766c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2767c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott default: 2768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) = Exp_mask; 2769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) = 0; 2770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else /*Honor_FLT_ROUNDS*/ 2772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) = Exp_mask; 2773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) = 0; 2774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Honor_FLT_ROUNDS*/ 2775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 2776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* set overflow bit */ 2777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv0) = 1e300; 2778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv0) *= dval(&rv0); 2779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else /*IEEE_Arith*/ 2781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) = Big0; 2782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) = Big1; 2783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*IEEE_Arith*/ 2784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e1 >>= 4; 2787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(j = 0; e1 > 1; j++, e1 >>= 1) 2788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e1 & 1) 2789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) *= bigtens[j]; 2790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* The last multiplication could overflow. */ 2791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) -= P*Exp_msk1; 2792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) *= bigtens[j]; 2793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((z = word0(&rv) & Exp_mask) 2794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott > Exp_msk1*(DBL_MAX_EXP+Bias-P)) 2795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ovfl; 2796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { 2797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* set to largest number */ 2798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* (Can't trust DBL_MAX) */ 2799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) = Big0; 2800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) = Big1; 2801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) += P*Exp_msk1; 2804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (e1 < 0) { 2807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e1 = -e1; 2808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((i = e1 & 15)) 2809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) /= tens[i]; 2810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e1 >>= 4) { 2811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e1 >= 1 << n_bigtens) 2812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto undfl; 2813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 2814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e1 & Scale_Bit) 2815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.scale = 2*P; 2816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(j = 0; e1 > 0; j++, e1 >>= 1) 2817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e1 & 1) 2818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) *= tinytens[j]; 2819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask) 2820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott >> Exp_shift)) > 0) { 2821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* scaled rv is denormal; clear j low bits */ 2822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j >= 32) { 2823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) = 0; 2824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j >= 53) 2825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) = (P+2)*Exp_msk1; 2826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) &= 0xffffffff << (j-32); 2828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) &= 0xffffffff << j; 2831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(j = 0; e1 > 1; j++, e1 >>= 1) 2834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e1 & 1) 2835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) *= tinytens[j]; 2836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* The last multiplication could underflow. */ 2837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv0) = dval(&rv); 2838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) *= tinytens[j]; 2839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!dval(&rv)) { 2840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) = 2.*dval(&rv0); 2841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) *= tinytens[j]; 2842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!dval(&rv)) { 2844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott undfl: 2845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) = 0.; 2846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_ERRNO 2847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott errno = ERANGE; 2848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 2850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Avoid_Underflow 2852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) = Tiny0; 2853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) = Tiny1; 2854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* The refinement below will clean 2855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * this approximation up. 2856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 2857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Now the hard part -- adjusting rv to the correct value.*/ 2863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Put digits into bd: true value = bd * 10^e */ 2865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.nd = nd; 2867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_STRTOD_BIGCOMP 2868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.nd0 = nd0; /* Only needed if nd > strtod_diglim, but done here */ 2869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* to silence an erroneous warning about bc.nd0 */ 2870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* possibly not being initialized. */ 2871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (nd > strtod_diglim) { 2872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* ASSERT(strtod_diglim >= 18); 18 == one more than the */ 2873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* minimum number of decimal digits to distinguish double values */ 2874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* in IEEE arithmetic. */ 2875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = j = 18; 2876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i > nd0) 2877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j += bc.dplen; 2878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(;;) { 2879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (--j <= bc.dp1 && j >= bc.dp0) 2880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = bc.dp0 - 1; 2881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (s0[j] != '0') 2882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott --i; 2884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e += nd - i; 2886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nd = i; 2887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (nd0 > nd) 2888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nd0 = nd; 2889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (nd < 9) { /* must recompute y */ 2890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = 0; 2891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = 0; i < nd0; ++i) 2892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = 10*y + s0[i] - '0'; 2893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(j = bc.dp1; i < nd; ++i) 2894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = 10*y + s0[j++] - '0'; 2895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bd0 = s2b(s0, nd0, nd, y, bc.dplen); 2899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(;;) { 2901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bd = Balloc(bd0->k); 2902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bcopy(bd, bd0); 2903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bb = d2b(&rv, &bbe, &bbbits); /* rv = bb * 2^bbe */ 2904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bs = i2b(1); 2905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e >= 0) { 2907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bb2 = bb5 = 0; 2908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bd2 = bd5 = e; 2909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 2911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bb2 = bb5 = -e; 2912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bd2 = bd5 = 0; 2913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bbe >= 0) 2915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bb2 += bbe; 2916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bd2 -= bbe; 2918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bs2 = bb2; 2919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 2920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.rounding != 1) 2921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bs2++; 2922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 2924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = bbe - bc.scale; 2925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = j + bbbits - 1; /* logb(rv) */ 2926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i < Emin) /* denormal */ 2927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j += P - Emin; 2928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2929c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = P + 1 - bbbits; 2930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else /*Avoid_Underflow*/ 2931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Sudden_Underflow 2932c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 2933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3); 2934c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2935c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = P + 1 - bbbits; 2936c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2937c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else /*Sudden_Underflow*/ 2938c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = bbe; 2939c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = j + bbbits - 1; /* logb(rv) */ 2940c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i < Emin) /* denormal */ 2941c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j += P - Emin; 2942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2943c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = P + 1 - bbbits; 2944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Sudden_Underflow*/ 2945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Avoid_Underflow*/ 2946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bb2 += j; 2947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bd2 += j; 2948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 2949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bd2 += bc.scale; 2950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = bb2 < bd2 ? bb2 : bd2; 2952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i > bs2) 2953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = bs2; 2954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i > 0) { 2955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bb2 -= i; 2956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bd2 -= i; 2957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bs2 -= i; 2958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bb5 > 0) { 2960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bs = pow5mult(bs, bb5); 2961c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bb1 = mult(bs, bb); 2962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(bb); 2963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bb = bb1; 2964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2965c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bb2 > 0) 2966c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bb = lshift(bb, bb2); 2967c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bd5 > 0) 2968c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bd = pow5mult(bd, bd5); 2969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bd2 > 0) 2970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bd = lshift(bd, bd2); 2971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bs2 > 0) 2972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bs = lshift(bs, bs2); 2973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delta = diff(bb, bd); 2974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.dsign = delta->sign; 2975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delta->sign = 0; 2976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = cmp(delta, bs); 2977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_STRTOD_BIGCOMP 2978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.nd > nd && i <= 0) { 2979c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.dsign) 2980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; /* Must use bigcomp(). */ 2981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 2982c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.rounding != 1) { 2983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i < 0) 2984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2985c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2987c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2988c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 2989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.nd = nd; 2990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = -1; /* Discarded digits make delta smaller. */ 2991c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 2994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 2995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.rounding != 1) { 2996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i < 0) { 2997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Error is less than an ulp */ 2998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!delta->x[0] && delta->wds <= 1) { 2999c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* exact */ 3000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 3001c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.inexact = 0; 3002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3003c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3004c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.rounding) { 3006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.dsign) { 3007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott adj.d = 1.; 3008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto apply_adj; 3009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (!bc.dsign) { 3012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott adj.d = -1.; 3013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!word1(&rv) 3014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott && !(word0(&rv) & Frac_mask)) { 3015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = word0(&rv) & Exp_mask; 3016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 3017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!bc.scale || y > 2*P*Exp_msk1) 3018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (y) 3020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 3022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delta = lshift(delta,Log2P); 3023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (cmp(delta, bs) <= 0) 3024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott adj.d = -0.5; 3025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott apply_adj: 3028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 3029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.scale && (y = word0(&rv) & Exp_mask) 3030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott <= 2*P*Exp_msk1) 3031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&adj) += (2*P+1)*Exp_msk1 - y; 3032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Sudden_Underflow 3034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((word0(&rv) & Exp_mask) <= 3035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott P*Exp_msk1) { 3036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) += P*Exp_msk1; 3037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) += adj.d*ulp(dval(&rv)); 3038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) -= P*Exp_msk1; 3039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3040c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 3041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Sudden_Underflow*/ 3042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Avoid_Underflow*/ 3043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) += adj.d*ulp(&rv); 3044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott adj.d = ratio(delta, bs); 3048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (adj.d < 1.) 3049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott adj.d = 1.; 3050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (adj.d <= 0x7ffffffe) { 3051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* adj = rounding ? ceil(adj) : floor(adj); */ 3052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = adj.d; 3053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (y != adj.d) { 3054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!((bc.rounding>>1) ^ bc.dsign)) 3055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y++; 3056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott adj.d = y; 3057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 3060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) 3061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&adj) += (2*P+1)*Exp_msk1 - y; 3062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Sudden_Underflow 3064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) { 3065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) += P*Exp_msk1; 3066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott adj.d *= ulp(dval(&rv)); 3067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.dsign) 3068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) += adj.d; 3069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 3070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) -= adj.d; 3071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) -= P*Exp_msk1; 3072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto cont; 3073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Sudden_Underflow*/ 3075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Avoid_Underflow*/ 3076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott adj.d *= ulp(&rv); 3077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.dsign) { 3078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (word0(&rv) == Big0 && word1(&rv) == Big1) 3079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ovfl; 3080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) += adj.d; 3081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 3083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) -= adj.d; 3084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto cont; 3085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Honor_FLT_ROUNDS*/ 3087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i < 0) { 3089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Error is less than half an ulp -- check for 3090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * special case of mantissa a power of two. 3091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 3092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask 3093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith 3094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 3095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1 3096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott || (word0(&rv) & Exp_mask) <= Exp_msk1 3098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ) { 3101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 3102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!delta->x[0] && delta->wds <= 1) 3103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.inexact = 0; 3104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!delta->x[0] && delta->wds <= 1) { 3108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* exact result */ 3109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 3110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.inexact = 0; 3111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delta = lshift(delta,Log2P); 3115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (cmp(delta, bs) > 0) 3116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto drop_down; 3117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i == 0) { 3120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* exactly half-way between */ 3121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.dsign) { 3122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((word0(&rv) & Bndry_mask1) == Bndry_mask1 3123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott && word1(&rv) == ( 3124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 3125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) 3126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) : 3127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xffffffff)) { 3129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /*boundary case -- increment exponent*/ 3130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) = (word0(&rv) & Exp_mask) 3131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott + Exp_msk1 3132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 3133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott | Exp_msk1 >> 4 3134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ; 3136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) = 0; 3137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 3138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.dsign = 0; 3139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) { 3144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott drop_down: 3145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* boundary case -- decrement exponent */ 3146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Sudden_Underflow /*{{*/ 3147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L = word0(&rv) & Exp_mask; 3148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 3149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (L < Exp_msk1) 3150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 3152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (L <= (bc.scale ? (2*P+1)*Exp_msk1 : Exp_msk1)) 3153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (L <= Exp_msk1) 3155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Avoid_Underflow*/ 3156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*IBM*/ 3157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 3158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.nd >nd) { 3159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.uflchk = 1; 3160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto undfl; 3163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L -= Exp_msk1; 3165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else /*Sudden_Underflow}{*/ 3166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 3167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.scale) { 3168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L = word0(&rv) & Exp_mask; 3169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (L <= (2*P+1)*Exp_msk1) { 3170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (L > (P+2)*Exp_msk1) 3171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* round even ==> */ 3172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* accept rv */ 3173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* rv = smallest denormal */ 3175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.nd >nd) { 3176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.uflchk = 1; 3177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto undfl; 3180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Avoid_Underflow*/ 3183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L = (word0(&rv) & Exp_mask) - Exp_msk1; 3184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Sudden_Underflow}}*/ 3185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) = L | Bndry_mask1; 3186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) = 0xffffffff; 3187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 3188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto cont; 3189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef ROUND_BIASED 3194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(word1(&rv) & LSB)) 3195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.dsign) 3198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) += ulp(&rv); 3199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef ROUND_BIASED 3200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 3201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) -= ulp(&rv); 3202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 3203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!dval(&rv)) { 3204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.nd >nd) { 3205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.uflchk = 1; 3206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto undfl; 3209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 3213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.dsign = 1 - bc.dsign; 3214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((aadj = ratio(delta, bs)) <= 2.) { 3219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.dsign) 3220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj = aadj1 = 1.; 3221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (word1(&rv) || word0(&rv) & Bndry_mask) { 3222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 3223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (word1(&rv) == Tiny1 && !word0(&rv)) { 3224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.nd >nd) { 3225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.uflchk = 1; 3226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto undfl; 3229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj = 1.; 3232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj1 = -1.; 3233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 3235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* special case -- power of FLT_RADIX to be */ 3236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* rounded down... */ 3237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (aadj < 2./FLT_RADIX) 3239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj = 1./FLT_RADIX; 3240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 3241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj *= 0.5; 3242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj1 = -aadj; 3243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 3246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj *= 0.5; 3247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj1 = bc.dsign ? aadj : -aadj; 3248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Check_FLT_ROUNDS 3249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(bc.rounding) { 3250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 2: /* towards +infinity */ 3251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj1 -= 0.5; 3252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 0: /* towards 0 */ 3254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 3: /* towards -infinity */ 3255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj1 += 0.5; 3256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (Flt_Rounds == 0) 3259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj1 += 0.5; 3260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Check_FLT_ROUNDS*/ 3261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott y = word0(&rv) & Exp_mask; 3263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Check for overflow */ 3265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { 3267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv0) = dval(&rv); 3268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) -= P*Exp_msk1; 3269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott adj.d = aadj1 * ulp(&rv); 3270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) += adj.d; 3271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((word0(&rv) & Exp_mask) >= 3272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Exp_msk1*(DBL_MAX_EXP+Bias-P)) { 3273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (word0(&rv0) == Big0 && word1(&rv0) == Big1) 3274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ovfl; 3275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) = Big0; 3276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) = Big1; 3277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto cont; 3278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 3280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) += P*Exp_msk1; 3281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 3283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 3284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.scale && y <= 2*P*Exp_msk1) { 3285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (aadj <= 0x7fffffff) { 3286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((z = aadj) <= 0) 3287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = 1; 3288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj = z; 3289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj1 = bc.dsign ? aadj : -aadj; 3290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&aadj2) = aadj1; 3292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&aadj2) += (2*P+1)*Exp_msk1 - y; 3293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj1 = dval(&aadj2); 3294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott adj.d = aadj1 * ulp(&rv); 3296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) += adj.d; 3297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Sudden_Underflow 3299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) { 3300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv0) = dval(&rv); 3301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) += P*Exp_msk1; 3302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott adj.d = aadj1 * ulp(&rv); 3303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) += adj.d; 3304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 3305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((word0(&rv) & Exp_mask) < P*Exp_msk1) 3306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) 3308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 3310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (word0(&rv0) == Tiny0 3311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott && word1(&rv0) == Tiny1) { 3312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.nd >nd) { 3313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bc.uflchk = 1; 3314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto undfl; 3317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) = Tiny0; 3319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv) = Tiny1; 3320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto cont; 3321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 3323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv) -= P*Exp_msk1; 3324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 3326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott adj.d = aadj1 * ulp(&rv); 3327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) += adj.d; 3328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else /*Sudden_Underflow*/ 3330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Compute adj so that the IEEE rounding rules will 3331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * correctly round rv + adj in some half-way cases. 3332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * If rv * ulp(rv) is denormalized (i.e., 3333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid 3334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * trouble from bits lost to denormalization; 3335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * example: 1.2e-307 . 3336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 3337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (y <= (P-1)*Exp_msk1 && aadj > 1.) { 3338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj1 = (double)(int)(aadj + 0.5); 3339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!bc.dsign) 3340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj1 = -aadj1; 3341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott adj.d = aadj1 * ulp(&rv); 3343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) += adj.d; 3344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Sudden_Underflow*/ 3345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Avoid_Underflow*/ 3346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott z = word0(&rv) & Exp_mask; 3348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef SET_INEXACT 3349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.nd == nd) { 3350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 3351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!bc.scale) 3352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (y == z) { 3354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Can we stop now? */ 3355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L = (Long)aadj; 3356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott aadj -= L; 3357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* The tolerances below are conservative. */ 3358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) { 3359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (aadj < .4999999 || aadj > .5000001) 3360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (aadj < .4999999/FLT_RADIX) 3363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cont: 3368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(bb); 3369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(bd); 3370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(bs); 3371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(delta); 3372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(bb); 3374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(bd); 3375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(bs); 3376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(bd0); 3377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(delta); 3378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_STRTOD_BIGCOMP 3379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.nd > nd) 3380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bigcomp(&rv, s0, &bc); 3381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 3383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.inexact) { 3384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!oldinexact) { 3385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv0) = Exp_1 + (70 << Exp_shift); 3386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv0) = 0; 3387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv0) += 1.; 3388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (!oldinexact) 3391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott clear_inexact(); 3392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Avoid_Underflow 3394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.scale) { 3395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&rv0) = Exp_1 - 2*P*Exp_msk1; 3396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&rv0) = 0; 3397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv) *= dval(&rv0); 3398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NO_ERRNO 3399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* try to avoid the bug of testing an 8087 register value */ 3400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith 3401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(word0(&rv) & Exp_mask)) 3402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (word0(&rv) == 0 && word1(&rv) == 0) 3404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott errno = ERANGE; 3406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* Avoid_Underflow */ 3409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 3410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc.inexact && !(word0(&rv) & Exp_mask)) { 3411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* set underflow bit */ 3412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv0) = 1e-300; 3413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&rv0) *= dval(&rv0); 3414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ret: 3417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (se) 3418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *se = (char *)s; 3419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return sign ? -dval(&rv) : dval(&rv); 3420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef MULTIPLE_THREADS 3423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static char *dtoa_result; 3424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static char * 3427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 3428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottrv_alloc(i) int i; 3429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottrv_alloc(int i) 3431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 3433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int j, k, *r; 3434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = sizeof(ULong); 3436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(k = 0; 3437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (size_t)i; 3438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j <<= 1) 3439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k++; 3440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott r = (int*)Balloc(k); 3441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *r = k; 3442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 3443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef MULTIPLE_THREADS 3444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dtoa_result = 3445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (char *)(r+1); 3447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static char * 3450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 3451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnrv_alloc(s, rve, n) char *s, **rve; int n; 3452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnrv_alloc(CONST char *s, char **rve, int n) 3454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 3456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char *rv, *t; 3457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott t = rv = rv_alloc(n); 3459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while((*t = *s++)) t++; 3460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (rve) 3461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *rve = t; 3462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return rv; 3463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* freedtoa(s) must be used to free values s returned by dtoa 3466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * when MULTIPLE_THREADS is #defined. It should be used in all cases, 3467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * but for consistency with earlier versions of dtoa, it is optional 3468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * when MULTIPLE_THREADS is not defined. 3469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 3470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void 3472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 3473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottfreedtoa(s) char *s; 3474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottfreedtoa(char *s) 3476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 3478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *b = (Bigint *)((int *)s - 1); 3479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b->maxwds = 1 << (b->k = *(int*)b); 3480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(b); 3481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef MULTIPLE_THREADS 3482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (s == dtoa_result) 3483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dtoa_result = 0; 3484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. 3488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 3489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Inspired by "How to Print Floating-Point Numbers Accurately" by 3490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. 3491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 3492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Modifications: 3493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1. Rather than iterating, we use a simple numeric overestimate 3494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * to determine k = floor(log10(d)). We scale relevant 3495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * quantities using O(log2(k)) rather than O(k) multiplications. 3496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't 3497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * try to generate digits strictly left to right. Instead, we 3498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * compute with fewer bits and propagate the carry if necessary 3499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * when rounding the final digit up. This is often faster. 3500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 3. Under the assumption that input will be rounded nearest, 3501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. 3502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * That is, we allow equality in stopping tests when the 3503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * round-nearest rule will give the same floating-point value 3504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * as would satisfaction of the stopping test with strict 3505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * inequality. 3506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 4. We remove common factors of powers of 2 from relevant 3507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * quantities. 3508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 5. When converting floating-point integers less than 1e16, 3509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * we use floating-point arithmetic rather than resorting 3510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * to multiple-precision integers. 3511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 6. When asked to produce fewer than 15 digits, we first try 3512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * to get by with floating-point arithmetic; we resort to 3513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * multiple-precision integer arithmetic only if we cannot 3514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * guarantee that the floating-point calculation has given 3515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the correctly rounded result. For k requested digits and 3516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * "uniformly" distributed input, the probability is 3517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * something like 10^(k-15) that we must resort to the Long 3518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * calculation. 3519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 3520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char * 3522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottdtoa 3523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef KR_headers 3524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (dd, mode, ndigits, decpt, sign, rve) 3525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott double dd; int mode, ndigits, *decpt, *sign; char **rve; 3526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (double dd, int mode, int ndigits, int *decpt, int *sign, char **rve) 3528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 3530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Arguments ndigits, decpt, sign are similar to those 3531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott of ecvt and fcvt; trailing zeros are suppressed from 3532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott the returned string. If not null, *rve is set to point 3533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott to the end of the return value. If d is +-Infinity or NaN, 3534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott then *decpt is set to 9999. 3535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mode: 3537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0 ==> shortest string that yields d when read in 3538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott and rounded to nearest. 3539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1 ==> like 0, but with Steele & White stopping rule; 3540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott e.g. with IEEE P754 arithmetic , mode 0 gives 3541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1e23 whereas mode 1 gives 9.999999999999999e22. 3542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2 ==> max(1,ndigits) significant digits. This gives a 3543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return value similar to that of ecvt, except 3544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott that trailing zeros are suppressed. 3545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3 ==> through ndigits past the decimal point. This 3546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott gives a return value similar to that from fcvt, 3547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott except that trailing zeros are suppressed, and 3548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ndigits can be negative. 3549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4,5 ==> similar to 2 and 3, respectively, but (in 3550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott round-nearest mode) with the tests of mode 0 to 3551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott possibly return a shorter string that rounds to d. 3552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott With IEEE arithmetic and compilation with 3553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same 3554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott as modes 2 and 3 when FLT_ROUNDS != 1. 3555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 6-9 ==> Debugging modes similar to mode - 4: don't try 3556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fast floating-point estimate (if applicable). 3557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Values of mode other than 0-9 are treated as mode 0. 3559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Sufficient space is allocated to the return value 3561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott to hold the suppressed trailing zeros. 3562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 3563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, 3565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, 3566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott spec_case, try_quick; 3567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Long L; 3568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 3569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int denorm; 3570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULong x; 3571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bigint *b, *b1, *delta, *mlo, *mhi, *S; 3573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott U d2, eps, u; 3574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott double ds; 3575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char *s, *s0; 3576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 3577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int inexact, oldinexact; 3578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS /*{*/ 3580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int Rounding; 3581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */ 3582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rounding = Flt_Rounds; 3583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else /*}{*/ 3584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rounding = 1; 3585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(fegetround()) { 3586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case FE_TOWARDZERO: Rounding = 0; break; 3587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case FE_UPWARD: Rounding = 2; break; 3588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case FE_DOWNWARD: Rounding = 3; 3589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*}}*/ 3591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*}*/ 3592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef MULTIPLE_THREADS 3594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dtoa_result) { 3595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott freedtoa(dtoa_result); 3596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dtoa_result = 0; 3597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott u.d = dd; 3601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (word0(&u) & Sign_bit) { 3602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* set sign for everything, including 0's and NaNs */ 3603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *sign = 1; 3604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&u) &= ~Sign_bit; /* clear sign bit */ 3605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 3607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *sign = 0; 3608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(IEEE_Arith) + defined(VAX) 3610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith 3611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((word0(&u) & Exp_mask) == Exp_mask) 3612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (word0(&u) == 0x8000) 3614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 3616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Infinity or NaN */ 3617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *decpt = 9999; 3618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IEEE_Arith 3619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!word1(&u) && !(word0(&u) & 0xfffff)) 3620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return nrv_alloc("Infinity", rve, 8); 3621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return nrv_alloc("NaN", rve, 3); 3623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 3626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) += 0; /* normalize */ 3627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!dval(&u)) { 3629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *decpt = 1; 3630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return nrv_alloc("0", rve, 1); 3631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 3634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott try_quick = oldinexact = get_inexact(); 3635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott inexact = 1; 3636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 3638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (Rounding >= 2) { 3639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*sign) 3640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rounding = Rounding == 2 ? 0 : 2; 3641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 3642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (Rounding != 2) 3643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rounding = 0; 3644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = d2b(&u, &be, &bbits); 3648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Sudden_Underflow 3649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); 3650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) { 3652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&d2) = dval(&u); 3654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&d2) &= Frac_mask1; 3655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&d2) |= Exp_11; 3656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 3657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j = 11 - hi0bits(word0(&d2) & Frac_mask)) 3658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&d2) /= 1 << j; 3659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 3662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * log10(x) = log(x) / log(10) 3663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) 3664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2) 3665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 3666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * This suggests computing an approximation k to log10(d) by 3667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 3668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * k = (i - Bias)*0.301029995663981 3669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); 3670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 3671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * We want k to be too large rather than too small. 3672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The error in the first-order Taylor series approximation 3673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * is in our favor, so we just round up the constant enough 3674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * to compensate for any error in the multiplication of 3675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, 3676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, 3677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * adding 1e-13 to the constant term more than suffices. 3678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Hence we adjust the constant term to 0.1760912590558. 3679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * (We could get a more accurate k by invoking log10, 3680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * but this is probably not worthwhile.) 3681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 3682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i -= Bias; 3684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 3685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i <<= 2; 3686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i += j; 3687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 3689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott denorm = 0; 3690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 3692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* d is denormalized */ 3693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = bbits + be + (Bias + (P-1) - 1); 3695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x = i > 32 ? word0(&u) << (64 - i) | word1(&u) >> (i - 32) 3696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : word1(&u) << (32 - i); 3697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&d2) = x; 3698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&d2) -= 31*Exp_msk1; /* adjust exponent */ 3699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i -= (Bias + (P-1) - 1) + 1; 3700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott denorm = 1; 3701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; 3704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = (int)ds; 3705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (ds < 0. && ds != k) 3706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k--; /* want k = floor(ds) */ 3707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k_check = 1; 3708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k >= 0 && k <= Ten_pmax) { 3709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dval(&u) < tens[k]) 3710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k--; 3711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k_check = 0; 3712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = bbits - i - 1; 3714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j >= 0) { 3715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b2 = 0; 3716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s2 = j; 3717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 3719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b2 = -j; 3720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s2 = 0; 3721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k >= 0) { 3723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b5 = 0; 3724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s5 = k; 3725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s2 += k; 3726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 3728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b2 -= k; 3729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b5 = -k; 3730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s5 = 0; 3731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (mode < 0 || mode > 9) 3733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mode = 0; 3734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef SET_INEXACT 3736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Check_FLT_ROUNDS 3737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott try_quick = Rounding == 1; 3738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott try_quick = 1; 3740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*SET_INEXACT*/ 3742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (mode > 5) { 3744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mode -= 4; 3745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott try_quick = 0; 3746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott leftright = 1; 3748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */ 3749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* silence erroneous "gcc -Wall" warning. */ 3750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(mode) { 3751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 0: 3752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 1: 3753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 18; 3754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ndigits = 0; 3755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 2: 3757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott leftright = 0; 3758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* no break */ 3759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 4: 3760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (ndigits <= 0) 3761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ndigits = 1; 3762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ilim = ilim1 = i = ndigits; 3763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 3: 3765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott leftright = 0; 3766c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* no break */ 3767c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 5: 3768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = ndigits + k + 1; 3769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ilim = i; 3770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ilim1 = i - 1; 3771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i <= 0) 3772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 1; 3773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s = s0 = rv_alloc(i); 3775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 3777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (mode > 1 && Rounding != 1) 3778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott leftright = 0; 3779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (ilim >= 0 && ilim <= Quick_max && try_quick) { 3782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Try to get by with floating-point arithmetic. */ 3784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 0; 3786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&d2) = dval(&u); 3787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k0 = k; 3788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ilim0 = ilim; 3789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ieps = 2; /* conservative */ 3790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k > 0) { 3791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ds = tens[k&0xf]; 3792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = k >> 4; 3793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j & Bletch) { 3794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* prevent overflows */ 3795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j &= Bletch - 1; 3796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) /= bigtens[n_bigtens-1]; 3797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ieps++; 3798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(; j; j >>= 1, i++) 3800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j & 1) { 3801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ieps++; 3802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ds *= bigtens[i]; 3803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) /= ds; 3805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if ((j1 = -k)) { 3807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) *= tens[j1 & 0xf]; 3808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(j = j1 >> 4; j; j >>= 1, i++) 3809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j & 1) { 3810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ieps++; 3811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) *= bigtens[i]; 3812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k_check && dval(&u) < 1. && ilim > 0) { 3815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (ilim1 <= 0) 3816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto fast_failed; 3817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ilim = ilim1; 3818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k--; 3819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) *= 10.; 3820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ieps++; 3821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&eps) = ieps*dval(&u) + 7.; 3823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&eps) -= (P-1)*Exp_msk1; 3824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (ilim == 0) { 3825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott S = mhi = 0; 3826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) -= 5.; 3827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dval(&u) > dval(&eps)) 3828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto one_digit; 3829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dval(&u) < -dval(&eps)) 3830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto no_digits; 3831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto fast_failed; 3832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef No_leftright 3834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (leftright) { 3835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Use Steele & White method of only 3836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * generating digits needed. 3837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 3838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&eps) = 0.5/tens[ilim-1] - dval(&eps); 3839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = 0;;) { 3840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L = dval(&u); 3841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) -= L; 3842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *s++ = '0' + (int)L; 3843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dval(&u) < dval(&eps)) 3844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret1; 3845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (1. - dval(&u) < dval(&eps)) 3846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto bump_up; 3847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (++i >= ilim) 3848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&eps) *= 10.; 3850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) *= 10.; 3851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 3854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Generate ilim digits, then fix them up. */ 3856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&eps) *= tens[ilim-1]; 3857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = 1;; i++, dval(&u) *= 10.) { 3858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L = (Long)(dval(&u)); 3859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!(dval(&u) -= L)) 3860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ilim = i; 3861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *s++ = '0' + (int)L; 3862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i == ilim) { 3863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dval(&u) > 0.5 + dval(&eps)) 3864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto bump_up; 3865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (dval(&u) < 0.5 - dval(&eps)) { 3866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while(*--s == '0') {} 3867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s++; 3868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret1; 3869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef No_leftright 3874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fast_failed: 3877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s = s0; 3878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) = dval(&d2); 3879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = k0; 3880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ilim = ilim0; 3881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Do we have a "small" integer? */ 3884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (be >= 0 && k <= Int_max) { 3886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Yes. */ 3887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ds = tens[k]; 3888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (ndigits < 0 && ilim <= 0) { 3889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott S = mhi = 0; 3890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (ilim < 0 || dval(&u) <= 5*ds) 3891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto no_digits; 3892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto one_digit; 3893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = 1;; i++, dval(&u) *= 10.) { 3895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L = (Long)(dval(&u) / ds); 3896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) -= L*ds; 3897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Check_FLT_ROUNDS 3898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* If FLT_ROUNDS == 2, L will usually be high by 1 */ 3899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dval(&u) < 0) { 3900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott L--; 3901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) += ds; 3902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *s++ = '0' + (int)L; 3905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!dval(&u)) { 3906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 3907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott inexact = 0; 3908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i == ilim) { 3912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 3913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (mode > 1) 3914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(Rounding) { 3915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 0: goto ret1; 3916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 2: goto bump_up; 3917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) += dval(&u); 3920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dval(&u) > ds || (dval(&u) == ds && L & 1)) { 3921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bump_up: 3922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(*--s == '9') 3923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (s == s0) { 3924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k++; 3925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *s = '0'; 3926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ++*s++; 3929c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 3931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3932c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret1; 3934c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3935c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3936c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott m2 = b2; 3937c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott m5 = b5; 3938c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mhi = mlo = 0; 3939c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (leftright) { 3940c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 3941c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 3942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott denorm ? be + (Bias + (P-1) - 1 + 1) : 3943c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef IBM 3945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3); 3946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1 + P - bbits; 3948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b2 += i; 3950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s2 += i; 3951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mhi = i2b(1); 3952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (m2 > 0 && s2 > 0) { 3954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = m2 < s2 ? m2 : s2; 3955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b2 -= i; 3956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott m2 -= i; 3957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s2 -= i; 3958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (b5 > 0) { 3960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (leftright) { 3961c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (m5 > 0) { 3962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mhi = pow5mult(mhi, m5); 3963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b1 = mult(mhi, b); 3964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(b); 3965c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = b1; 3966c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3967c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((j = b5 - m5)) 3968c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = pow5mult(b, j); 3969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 3971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = pow5mult(b, b5); 3972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott S = i2b(1); 3974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (s5 > 0) 3975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott S = pow5mult(S, s5); 3976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Check for special case that d is a normalized power of 2. */ 3978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3979c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott spec_case = 0; 3980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((mode < 2 || leftright) 3981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 3982c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott && Rounding == 1 3983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ) { 3985c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!word1(&u) && !(word0(&u) & Bndry_mask) 3986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef Sudden_Underflow 3987c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott && word0(&u) & (Exp_mask & ~Exp_msk1) 3988c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 3989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ) { 3990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* The special case */ 3991c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b2 += Log2P; 3992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s2 += Log2P; 3993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott spec_case = 1; 3994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Arrange for convenient computation of quotients: 3998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * shift left if necessary so divisor has 4 leading 0 bits. 3999c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 4000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Perhaps we should just compute leading 28 bits of S once 4001c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * and for all and pass them and a shift to quorem, so it 4002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * can do shifts and ors to compute the numerator for q. 4003c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 4004c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Pack_32 4005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f)) 4006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 32 - i; 4007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define iInc 28 4008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 4009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf) 4010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = 16 - i; 4011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define iInc 12 4012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 4013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i = dshift(S, s2); 4014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b2 += i; 4015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott m2 += i; 4016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s2 += i; 4017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (b2 > 0) 4018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = lshift(b, b2); 4019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (s2 > 0) 4020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott S = lshift(S, s2); 4021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (k_check) { 4022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (cmp(b,S) < 0) { 4023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k--; 4024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = multadd(b, 10, 0); /* we botched the k estimate */ 4025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (leftright) 4026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mhi = multadd(mhi, 10, 0); 4027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ilim = ilim1; 4028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (ilim <= 0 && (mode == 3 || mode == 5)) { 4031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) { 4032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* no digits, fcvt style */ 4033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott no_digits: 4034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k = -1 - ndigits; 4035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 4036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott one_digit: 4038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *s++ = '1'; 4039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k++; 4040c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 4041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (leftright) { 4043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (m2 > 0) 4044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mhi = lshift(mhi, m2); 4045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Compute mlo -- check for special case 4047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * that d is a normalized power of 2. 4048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 4049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mlo = mhi; 4051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (spec_case) { 4052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mhi = Balloc(mhi->k); 4053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bcopy(mhi, mlo); 4054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mhi = lshift(mhi, Log2P); 4055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = 1;;i++) { 4058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dig = quorem(b,S) + '0'; 4059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Do we yet have the shortest decimal string 4060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * that will round to d? 4061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 4062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = cmp(b, mlo); 4063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delta = diff(S, mhi); 4064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j1 = delta->sign ? 1 : cmp(b, delta); 4065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(delta); 4066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef ROUND_BIASED 4067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j1 == 0 && mode != 1 && !(word1(&u) & 1) 4068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 4069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott && Rounding >= 1 4070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 4071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ) { 4072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dig == '9') 4073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto round_9_up; 4074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j > 0) 4075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dig++; 4076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 4077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (!b->x[0] && b->wds <= 1) 4078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott inexact = 0; 4079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 4080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *s++ = dig; 4081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 4082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 4084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j < 0 || (j == 0 && mode != 1 4085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef ROUND_BIASED 4086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott && !(word1(&u) & 1) 4087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 4088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott )) { 4089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!b->x[0] && b->wds <= 1) { 4090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 4091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott inexact = 0; 4092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 4093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto accept_dig; 4094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 4096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (mode > 1) 4097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(Rounding) { 4098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 0: goto accept_dig; 4099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 2: goto keep_dig; 4100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /*Honor_FLT_ROUNDS*/ 4102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j1 > 0) { 4103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = lshift(b, 1); 4104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j1 = cmp(b, S); 4105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((j1 > 0 || (j1 == 0 && dig & 1)) 4106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott && dig++ == '9') 4107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto round_9_up; 4108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott accept_dig: 4110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *s++ = dig; 4111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 4112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j1 > 0) { 4114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 4115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!Rounding) 4116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto accept_dig; 4117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 4118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dig == '9') { /* possible if i == 1 */ 4119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott round_9_up: 4120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *s++ = '9'; 4121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto roundoff; 4122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *s++ = dig + 1; 4124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 4125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 4127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott keep_dig: 4128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 4129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *s++ = dig; 4130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i == ilim) 4131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 4132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = multadd(b, 10, 0); 4133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (mlo == mhi) 4134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mlo = mhi = multadd(mhi, 10, 0); 4135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 4136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mlo = multadd(mlo, 10, 0); 4137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mhi = multadd(mhi, 10, 0); 4138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 4142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for(i = 1;; i++) { 4143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *s++ = dig = quorem(b,S) + '0'; 4144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!b->x[0] && b->wds <= 1) { 4145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 4146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott inexact = 0; 4147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 4148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 4149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (i >= ilim) 4151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 4152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = multadd(b, 10, 0); 4153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Round off last digit */ 4156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 4158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch(Rounding) { 4159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 0: goto trimzeros; 4160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case 2: goto roundoff; 4161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 4163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b = lshift(b, 1); 4164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott j = cmp(b, S); 4165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (j > 0 || (j == 0 && dig & 1)) { 4166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott roundoff: 4167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(*--s == '9') 4168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (s == s0) { 4169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott k++; 4170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *s++ = '1'; 4171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto ret; 4172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ++*s++; 4174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 4176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef Honor_FLT_ROUNDS 4177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott trimzeros: 4178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 4179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while(*--s == '0') {} 4180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s++; 4181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ret: 4183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(S); 4184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (mhi) { 4185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (mlo && mlo != mhi) 4186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(mlo); 4187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(mhi); 4188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ret1: 4190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef SET_INEXACT 4191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (inexact) { 4192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!oldinexact) { 4193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word0(&u) = Exp_1 + (70 << Exp_shift); 4194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott word1(&u) = 0; 4195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dval(&u) += 1.; 4196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (!oldinexact) 4199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott clear_inexact(); 4200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 4201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bfree(b); 4202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *s = 0; 4203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *decpt = k + 1; 4204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (rve) 4205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *rve = s; 4206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return s0; 4207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 4208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace dmg_fp 4210