17b36286aSmartynas /**************************************************************** 27b36286aSmartynas 37b36286aSmartynas The author of this software is David M. Gay. 47b36286aSmartynas 57b36286aSmartynas Copyright (C) 1998-2000 by Lucent Technologies 67b36286aSmartynas All Rights Reserved 77b36286aSmartynas 87b36286aSmartynas Permission to use, copy, modify, and distribute this software and 97b36286aSmartynas its documentation for any purpose and without fee is hereby 107b36286aSmartynas granted, provided that the above copyright notice appear in all 117b36286aSmartynas copies and that both that the copyright notice and this 127b36286aSmartynas permission notice and warranty disclaimer appear in supporting 137b36286aSmartynas documentation, and that the name of Lucent or any of its entities 147b36286aSmartynas not be used in advertising or publicity pertaining to 157b36286aSmartynas distribution of the software without specific, written prior 167b36286aSmartynas permission. 177b36286aSmartynas 187b36286aSmartynas LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 197b36286aSmartynas INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. 207b36286aSmartynas IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY 217b36286aSmartynas SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 227b36286aSmartynas WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER 237b36286aSmartynas IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 247b36286aSmartynas ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 257b36286aSmartynas THIS SOFTWARE. 267b36286aSmartynas 277b36286aSmartynas ****************************************************************/ 287b36286aSmartynas 29*2c53affbSjmc /* This is a variation on dtoa.c that converts arbitrary binary 307b36286aSmartynas floating-point formats to and from decimal notation. It uses 317b36286aSmartynas double-precision arithmetic internally, so there are still 327b36286aSmartynas various #ifdefs that adapt the calculations to the native 337b36286aSmartynas double-precision arithmetic (any of IEEE, VAX D_floating, 347b36286aSmartynas or IBM mainframe arithmetic). 357b36286aSmartynas 367b36286aSmartynas Please send bug reports to David M. Gay (dmg at acm dot org, 377b36286aSmartynas with " at " changed at "@" and " dot " changed to "."). 387b36286aSmartynas */ 397b36286aSmartynas 407b36286aSmartynas /* On a machine with IEEE extended-precision registers, it is 417b36286aSmartynas * necessary to specify double-precision (53-bit) rounding precision 427b36286aSmartynas * before invoking strtod or dtoa. If the machine uses (the equivalent 437b36286aSmartynas * of) Intel 80x87 arithmetic, the call 447b36286aSmartynas * _control87(PC_53, MCW_PC); 457b36286aSmartynas * does this with many compilers. Whether this or another call is 467b36286aSmartynas * appropriate depends on the compiler; for this to work, it may be 477b36286aSmartynas * necessary to #include "float.h" or another system-dependent header 487b36286aSmartynas * file. 497b36286aSmartynas */ 507b36286aSmartynas 517b36286aSmartynas /* strtod for IEEE-, VAX-, and IBM-arithmetic machines. 527b36286aSmartynas * 537b36286aSmartynas * This strtod returns a nearest machine number to the input decimal 547b36286aSmartynas * string (or sets errno to ERANGE). With IEEE arithmetic, ties are 557b36286aSmartynas * broken by the IEEE round-even rule. Otherwise ties are broken by 567b36286aSmartynas * biased rounding (add half and chop). 577b36286aSmartynas * 587b36286aSmartynas * Inspired loosely by William D. Clinger's paper "How to Read Floating 597b36286aSmartynas * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 112-126]. 607b36286aSmartynas * 617b36286aSmartynas * Modifications: 627b36286aSmartynas * 637b36286aSmartynas * 1. We only require IEEE, IBM, or VAX double-precision 647b36286aSmartynas * arithmetic (not IEEE double-extended). 657b36286aSmartynas * 2. We get by with floating-point arithmetic in a case that 667b36286aSmartynas * Clinger missed -- when we're computing d * 10^n 677b36286aSmartynas * for a small integer d and the integer n is not too 687b36286aSmartynas * much larger than 22 (the maximum integer k for which 697b36286aSmartynas * we can represent 10^k exactly), we may be able to 707b36286aSmartynas * compute (d*10^k) * 10^(e-k) with just one roundoff. 717b36286aSmartynas * 3. Rather than a bit-at-a-time adjustment of the binary 727b36286aSmartynas * result in the hard case, we use floating-point 737b36286aSmartynas * arithmetic to determine the adjustment to within 747b36286aSmartynas * one bit; only in really hard cases do we need to 757b36286aSmartynas * compute a second residual. 767b36286aSmartynas * 4. Because of 3., we don't need a large table of powers of 10 777b36286aSmartynas * for ten-to-e (just some small tables, e.g. of 10^k 787b36286aSmartynas * for 0 <= k <= 22). 797b36286aSmartynas */ 807b36286aSmartynas 817b36286aSmartynas /* 827b36286aSmartynas * #define IEEE_8087 for IEEE-arithmetic machines where the least 837b36286aSmartynas * significant byte has the lowest address. 847b36286aSmartynas * #define IEEE_MC68k for IEEE-arithmetic machines where the most 857b36286aSmartynas * significant byte has the lowest address. 867b36286aSmartynas * #define Long int on machines with 32-bit ints and 64-bit longs. 877b36286aSmartynas * #define Sudden_Underflow for IEEE-format machines without gradual 887b36286aSmartynas * underflow (i.e., that flush to zero on underflow). 897b36286aSmartynas * #define IBM for IBM mainframe-style floating-point arithmetic. 907b36286aSmartynas * #define VAX for VAX-style floating-point arithmetic (D_floating). 917b36286aSmartynas * #define No_leftright to omit left-right logic in fast floating-point 921a653cbcSmartynas * computation of dtoa and gdtoa. This will cause modes 4 and 5 to be 931a653cbcSmartynas * treated the same as modes 2 and 3 for some inputs. 947b36286aSmartynas * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3. 957b36286aSmartynas * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines 967b36286aSmartynas * that use extended-precision instructions to compute rounded 977b36286aSmartynas * products and quotients) with IBM. 981a653cbcSmartynas * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic 991a653cbcSmartynas * that rounds toward +Infinity. 1001a653cbcSmartynas * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased 1011a653cbcSmartynas * rounding when the underlying floating-point arithmetic uses 1021a653cbcSmartynas * unbiased rounding. This prevent using ordinary floating-point 1031a653cbcSmartynas * arithmetic when the result could be computed with one rounding error. 1047b36286aSmartynas * #define Inaccurate_Divide for IEEE-format with correctly rounded 1057b36286aSmartynas * products but inaccurate quotients, e.g., for Intel i860. 1067b36286aSmartynas * #define NO_LONG_LONG on machines that do not have a "long long" 1077b36286aSmartynas * integer type (of >= 64 bits). On such machines, you can 1087b36286aSmartynas * #define Just_16 to store 16 bits per 32-bit Long when doing 1097b36286aSmartynas * high-precision integer arithmetic. Whether this speeds things 1107b36286aSmartynas * up or slows things down depends on the machine and the number 1117b36286aSmartynas * being converted. If long long is available and the name is 1127b36286aSmartynas * something other than "long long", #define Llong to be the name, 1137b36286aSmartynas * and if "unsigned Llong" does not work as an unsigned version of 1147b36286aSmartynas * Llong, #define #ULLong to be the corresponding unsigned type. 1157b36286aSmartynas * #define KR_headers for old-style C function headers. 1167b36286aSmartynas * #define Bad_float_h if your system lacks a float.h or if it does not 1177b36286aSmartynas * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, 1187b36286aSmartynas * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. 1197b36286aSmartynas * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) 1207b36286aSmartynas * if memory is available and otherwise does something you deem 1217b36286aSmartynas * appropriate. If MALLOC is undefined, malloc will be invoked 1221a653cbcSmartynas * directly -- and assumed always to succeed. Similarly, if you 1231a653cbcSmartynas * want something other than the system's free() to be called to 1241a653cbcSmartynas * recycle memory acquired from MALLOC, #define FREE to be the 1251a653cbcSmartynas * name of the alternate routine. (FREE or free is only called in 1261a653cbcSmartynas * pathological cases, e.g., in a gdtoa call after a gdtoa return in 1271a653cbcSmartynas * mode 3 with thousands of digits requested.) 1287b36286aSmartynas * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making 1297b36286aSmartynas * memory allocations from a private pool of memory when possible. 1307b36286aSmartynas * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes, 1317b36286aSmartynas * unless #defined to be a different length. This default length 1327b36286aSmartynas * suffices to get rid of MALLOC calls except for unusual cases, 1337b36286aSmartynas * such as decimal-to-binary conversion of a very long string of 1347b36286aSmartynas * digits. When converting IEEE double precision values, the 1357b36286aSmartynas * longest string gdtoa can return is about 751 bytes long. For 1367b36286aSmartynas * conversions by strtod of strings of 800 digits and all gdtoa 1377b36286aSmartynas * conversions of IEEE doubles in single-threaded executions with 1387b36286aSmartynas * 8-byte pointers, PRIVATE_MEM >= 7400 appears to suffice; with 1397b36286aSmartynas * 4-byte pointers, PRIVATE_MEM >= 7112 appears adequate. 1401a653cbcSmartynas * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK 1411a653cbcSmartynas * #defined automatically on IEEE systems. On such systems, 1421a653cbcSmartynas * when INFNAN_CHECK is #defined, strtod checks 1431a653cbcSmartynas * for Infinity and NaN (case insensitively). 1447b36286aSmartynas * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined, 1457b36286aSmartynas * strtodg also accepts (case insensitively) strings of the form 1467b36286aSmartynas * NaN(x), where x is a string of hexadecimal digits (optionally 1477b36286aSmartynas * preceded by 0x or 0X) and spaces; if there is only one string 1487b36286aSmartynas * of hexadecimal digits, it is taken for the fraction bits of the 1497b36286aSmartynas * resulting NaN; if there are two or more strings of hexadecimal 1507b36286aSmartynas * digits, each string is assigned to the next available sequence 1517b36286aSmartynas * of 32-bit words of fractions bits (starting with the most 1527b36286aSmartynas * significant), right-aligned in each sequence. 1537b36286aSmartynas * Unless GDTOA_NON_PEDANTIC_NANCHECK is #defined, input "NaN(...)" 1547b36286aSmartynas * is consumed even when ... has the wrong form (in which case the 1557b36286aSmartynas * "(...)" is consumed but ignored). 1567b36286aSmartynas * #define MULTIPLE_THREADS if the system offers preemptively scheduled 1577b36286aSmartynas * multiple threads. In this case, you must provide (or suitably 1587b36286aSmartynas * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed 1597b36286aSmartynas * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed 1607b36286aSmartynas * in pow5mult, ensures lazy evaluation of only one copy of high 1617b36286aSmartynas * powers of 5; omitting this lock would introduce a small 1627b36286aSmartynas * probability of wasting memory, but would otherwise be harmless.) 1637b36286aSmartynas * You must also invoke freedtoa(s) to free the value s returned by 1647b36286aSmartynas * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined. 1657b36286aSmartynas * #define IMPRECISE_INEXACT if you do not care about the setting of 1667b36286aSmartynas * the STRTOG_Inexact bits in the special case of doing IEEE double 167aad11945Smartynas * precision conversions (which could also be done by the strtod in 1687b36286aSmartynas * dtoa.c). 1697b36286aSmartynas * #define NO_HEX_FP to disable recognition of C9x's hexadecimal 1707b36286aSmartynas * floating-point constants. 1717b36286aSmartynas * #define -DNO_ERRNO to suppress setting errno (in strtod.c and 1727b36286aSmartynas * strtodg.c). 1737b36286aSmartynas * #define NO_STRING_H to use private versions of memcpy. 1747b36286aSmartynas * On some K&R systems, it may also be necessary to 1757b36286aSmartynas * #define DECLARE_SIZE_T in this case. 1767b36286aSmartynas * #define USE_LOCALE to use the current locale's decimal_point value. 1777b36286aSmartynas */ 1787b36286aSmartynas 1797b36286aSmartynas #ifndef GDTOAIMP_H_INCLUDED 1807b36286aSmartynas #define GDTOAIMP_H_INCLUDED 1817b36286aSmartynas #include "gdtoa.h" 1827b36286aSmartynas #include "gd_qnan.h" 183aad11945Smartynas #ifdef Honor_FLT_ROUNDS 184aad11945Smartynas #include <fenv.h> 185aad11945Smartynas #endif 1867b36286aSmartynas 1877b36286aSmartynas #ifdef DEBUG 1887b36286aSmartynas #include "stdio.h" 1897b36286aSmartynas #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} 1907b36286aSmartynas #endif 1917b36286aSmartynas 1927b36286aSmartynas #include "stdlib.h" 1937b36286aSmartynas #include "string.h" 1947b36286aSmartynas 1957b36286aSmartynas #ifdef KR_headers 1967b36286aSmartynas #define Char char 1977b36286aSmartynas #else 1987b36286aSmartynas #define Char void 1997b36286aSmartynas #endif 2007b36286aSmartynas 2017b36286aSmartynas #ifdef MALLOC 2027b36286aSmartynas extern Char *MALLOC ANSI((size_t)); 2037b36286aSmartynas #else 2047b36286aSmartynas #define MALLOC malloc 2057b36286aSmartynas #endif 2067b36286aSmartynas 2077b36286aSmartynas #undef IEEE_Arith 2087b36286aSmartynas #undef Avoid_Underflow 2097b36286aSmartynas #ifdef IEEE_MC68k 2107b36286aSmartynas #define IEEE_Arith 2117b36286aSmartynas #endif 2127b36286aSmartynas #ifdef IEEE_8087 2137b36286aSmartynas #define IEEE_Arith 2147b36286aSmartynas #endif 2157b36286aSmartynas 2167b36286aSmartynas #include "errno.h" 2177b36286aSmartynas #ifdef Bad_float_h 2187b36286aSmartynas 2197b36286aSmartynas #ifdef IEEE_Arith 2207b36286aSmartynas #define DBL_DIG 15 2217b36286aSmartynas #define DBL_MAX_10_EXP 308 2227b36286aSmartynas #define DBL_MAX_EXP 1024 2237b36286aSmartynas #define FLT_RADIX 2 2247b36286aSmartynas #define DBL_MAX 1.7976931348623157e+308 2257b36286aSmartynas #endif 2267b36286aSmartynas 2277b36286aSmartynas #ifdef IBM 2287b36286aSmartynas #define DBL_DIG 16 2297b36286aSmartynas #define DBL_MAX_10_EXP 75 2307b36286aSmartynas #define DBL_MAX_EXP 63 2317b36286aSmartynas #define FLT_RADIX 16 2327b36286aSmartynas #define DBL_MAX 7.2370055773322621e+75 2337b36286aSmartynas #endif 2347b36286aSmartynas 2357b36286aSmartynas #ifdef VAX 2367b36286aSmartynas #define DBL_DIG 16 2377b36286aSmartynas #define DBL_MAX_10_EXP 38 2387b36286aSmartynas #define DBL_MAX_EXP 127 2397b36286aSmartynas #define FLT_RADIX 2 2407b36286aSmartynas #define DBL_MAX 1.7014118346046923e+38 2417b36286aSmartynas #define n_bigtens 2 2427b36286aSmartynas #endif 2437b36286aSmartynas 2447b36286aSmartynas #ifndef LONG_MAX 2457b36286aSmartynas #define LONG_MAX 2147483647 2467b36286aSmartynas #endif 2477b36286aSmartynas 2487b36286aSmartynas #else /* ifndef Bad_float_h */ 2497b36286aSmartynas #include "float.h" 2507b36286aSmartynas #endif /* Bad_float_h */ 2517b36286aSmartynas 2527b36286aSmartynas #ifdef IEEE_Arith 2537b36286aSmartynas #define Scale_Bit 0x10 2547b36286aSmartynas #define n_bigtens 5 2557b36286aSmartynas #endif 2567b36286aSmartynas 2577b36286aSmartynas #ifdef IBM 2587b36286aSmartynas #define n_bigtens 3 2597b36286aSmartynas #endif 2607b36286aSmartynas 2617b36286aSmartynas #ifdef VAX 2627b36286aSmartynas #define n_bigtens 2 2637b36286aSmartynas #endif 2647b36286aSmartynas 2657b36286aSmartynas #ifndef __MATH_H__ 2667b36286aSmartynas #include "math.h" 2677b36286aSmartynas #endif 2687b36286aSmartynas 2697b36286aSmartynas #ifdef __cplusplus 2707b36286aSmartynas extern "C" { 2717b36286aSmartynas #endif 2727b36286aSmartynas 2737b36286aSmartynas #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1 2747b36286aSmartynas Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined. 2757b36286aSmartynas #endif 2767b36286aSmartynas 2777b36286aSmartynas typedef union { double d; ULong L[2]; } U; 2787b36286aSmartynas 2797b36286aSmartynas #ifdef IEEE_8087 2801a653cbcSmartynas #define word0(x) (x)->L[1] 2811a653cbcSmartynas #define word1(x) (x)->L[0] 2827b36286aSmartynas #else 2831a653cbcSmartynas #define word0(x) (x)->L[0] 2841a653cbcSmartynas #define word1(x) (x)->L[1] 2857b36286aSmartynas #endif 2861a653cbcSmartynas #define dval(x) (x)->d 2877b36286aSmartynas 2887b36286aSmartynas /* The following definition of Storeinc is appropriate for MIPS processors. 2897b36286aSmartynas * An alternative that might be better on some machines is 2907b36286aSmartynas * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) 2917b36286aSmartynas */ 2927b36286aSmartynas #if defined(IEEE_8087) + defined(VAX) 2937b36286aSmartynas #define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \ 2947b36286aSmartynas ((unsigned short *)a)[0] = (unsigned short)c, a++) 2957b36286aSmartynas #else 2967b36286aSmartynas #define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \ 2977b36286aSmartynas ((unsigned short *)a)[1] = (unsigned short)c, a++) 2987b36286aSmartynas #endif 2997b36286aSmartynas 3007b36286aSmartynas /* #define P DBL_MANT_DIG */ 3017b36286aSmartynas /* Ten_pmax = floor(P*log(2)/log(5)) */ 3027b36286aSmartynas /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ 3037b36286aSmartynas /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ 3047b36286aSmartynas /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ 3057b36286aSmartynas 3067b36286aSmartynas #ifdef IEEE_Arith 3077b36286aSmartynas #define Exp_shift 20 3087b36286aSmartynas #define Exp_shift1 20 3097b36286aSmartynas #define Exp_msk1 0x100000 3107b36286aSmartynas #define Exp_msk11 0x100000 3117b36286aSmartynas #define Exp_mask 0x7ff00000 3127b36286aSmartynas #define P 53 3137b36286aSmartynas #define Bias 1023 3147b36286aSmartynas #define Emin (-1022) 3157b36286aSmartynas #define Exp_1 0x3ff00000 3167b36286aSmartynas #define Exp_11 0x3ff00000 3177b36286aSmartynas #define Ebits 11 3187b36286aSmartynas #define Frac_mask 0xfffff 3197b36286aSmartynas #define Frac_mask1 0xfffff 3207b36286aSmartynas #define Ten_pmax 22 3217b36286aSmartynas #define Bletch 0x10 3227b36286aSmartynas #define Bndry_mask 0xfffff 3237b36286aSmartynas #define Bndry_mask1 0xfffff 3247b36286aSmartynas #define LSB 1 3257b36286aSmartynas #define Sign_bit 0x80000000 3267b36286aSmartynas #define Log2P 1 3277b36286aSmartynas #define Tiny0 0 3287b36286aSmartynas #define Tiny1 1 3297b36286aSmartynas #define Quick_max 14 3307b36286aSmartynas #define Int_max 14 3317b36286aSmartynas 3327b36286aSmartynas #ifndef Flt_Rounds 3337b36286aSmartynas #ifdef FLT_ROUNDS 3347b36286aSmartynas #define Flt_Rounds FLT_ROUNDS 3357b36286aSmartynas #else 3367b36286aSmartynas #define Flt_Rounds 1 3377b36286aSmartynas #endif 3387b36286aSmartynas #endif /*Flt_Rounds*/ 3397b36286aSmartynas 3407b36286aSmartynas #else /* ifndef IEEE_Arith */ 3417b36286aSmartynas #undef Sudden_Underflow 3427b36286aSmartynas #define Sudden_Underflow 3437b36286aSmartynas #ifdef IBM 3447b36286aSmartynas #undef Flt_Rounds 3457b36286aSmartynas #define Flt_Rounds 0 3467b36286aSmartynas #define Exp_shift 24 3477b36286aSmartynas #define Exp_shift1 24 3487b36286aSmartynas #define Exp_msk1 0x1000000 3497b36286aSmartynas #define Exp_msk11 0x1000000 3507b36286aSmartynas #define Exp_mask 0x7f000000 3517b36286aSmartynas #define P 14 3527b36286aSmartynas #define Bias 65 3537b36286aSmartynas #define Exp_1 0x41000000 3547b36286aSmartynas #define Exp_11 0x41000000 3557b36286aSmartynas #define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ 3567b36286aSmartynas #define Frac_mask 0xffffff 3577b36286aSmartynas #define Frac_mask1 0xffffff 3587b36286aSmartynas #define Bletch 4 3597b36286aSmartynas #define Ten_pmax 22 3607b36286aSmartynas #define Bndry_mask 0xefffff 3617b36286aSmartynas #define Bndry_mask1 0xffffff 3627b36286aSmartynas #define LSB 1 3637b36286aSmartynas #define Sign_bit 0x80000000 3647b36286aSmartynas #define Log2P 4 3657b36286aSmartynas #define Tiny0 0x100000 3667b36286aSmartynas #define Tiny1 0 3677b36286aSmartynas #define Quick_max 14 3687b36286aSmartynas #define Int_max 15 3697b36286aSmartynas #else /* VAX */ 3707b36286aSmartynas #undef Flt_Rounds 3717b36286aSmartynas #define Flt_Rounds 1 3727b36286aSmartynas #define Exp_shift 23 3737b36286aSmartynas #define Exp_shift1 7 3747b36286aSmartynas #define Exp_msk1 0x80 3757b36286aSmartynas #define Exp_msk11 0x800000 3767b36286aSmartynas #define Exp_mask 0x7f80 3777b36286aSmartynas #define P 56 3787b36286aSmartynas #define Bias 129 3791a653cbcSmartynas #define Emin (-127) 3807b36286aSmartynas #define Exp_1 0x40800000 3817b36286aSmartynas #define Exp_11 0x4080 3827b36286aSmartynas #define Ebits 8 3837b36286aSmartynas #define Frac_mask 0x7fffff 3847b36286aSmartynas #define Frac_mask1 0xffff007f 3857b36286aSmartynas #define Ten_pmax 24 3867b36286aSmartynas #define Bletch 2 3877b36286aSmartynas #define Bndry_mask 0xffff007f 3887b36286aSmartynas #define Bndry_mask1 0xffff007f 3897b36286aSmartynas #define LSB 0x10000 3907b36286aSmartynas #define Sign_bit 0x8000 3917b36286aSmartynas #define Log2P 1 3927b36286aSmartynas #define Tiny0 0x80 3937b36286aSmartynas #define Tiny1 0 3947b36286aSmartynas #define Quick_max 15 3957b36286aSmartynas #define Int_max 15 3967b36286aSmartynas #endif /* IBM, VAX */ 3977b36286aSmartynas #endif /* IEEE_Arith */ 3987b36286aSmartynas 3997b36286aSmartynas #ifndef IEEE_Arith 4007b36286aSmartynas #define ROUND_BIASED 4011a653cbcSmartynas #else 4021a653cbcSmartynas #ifdef ROUND_BIASED_without_Round_Up 4031a653cbcSmartynas #undef ROUND_BIASED 4041a653cbcSmartynas #define ROUND_BIASED 4051a653cbcSmartynas #endif 4067b36286aSmartynas #endif 4077b36286aSmartynas 4087b36286aSmartynas #ifdef RND_PRODQUOT 4097b36286aSmartynas #define rounded_product(a,b) a = rnd_prod(a, b) 4107b36286aSmartynas #define rounded_quotient(a,b) a = rnd_quot(a, b) 4117b36286aSmartynas #ifdef KR_headers 4127b36286aSmartynas extern double rnd_prod(), rnd_quot(); 4137b36286aSmartynas #else 4147b36286aSmartynas extern double rnd_prod(double, double), rnd_quot(double, double); 4157b36286aSmartynas #endif 4167b36286aSmartynas #else 4177b36286aSmartynas #define rounded_product(a,b) a *= b 4187b36286aSmartynas #define rounded_quotient(a,b) a /= b 4197b36286aSmartynas #endif 4207b36286aSmartynas 4217b36286aSmartynas #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) 4227b36286aSmartynas #define Big1 0xffffffff 4237b36286aSmartynas 4247b36286aSmartynas #undef Pack_16 4257b36286aSmartynas #ifndef Pack_32 4267b36286aSmartynas #define Pack_32 4277b36286aSmartynas #endif 4287b36286aSmartynas 4297b36286aSmartynas #ifdef NO_LONG_LONG 4307b36286aSmartynas #undef ULLong 4317b36286aSmartynas #ifdef Just_16 4327b36286aSmartynas #undef Pack_32 4337b36286aSmartynas #define Pack_16 4347b36286aSmartynas /* When Pack_32 is not defined, we store 16 bits per 32-bit Long. 4357b36286aSmartynas * This makes some inner loops simpler and sometimes saves work 4367b36286aSmartynas * during multiplications, but it often seems to make things slightly 4377b36286aSmartynas * slower. Hence the default is now to store 32 bits per Long. 4387b36286aSmartynas */ 4397b36286aSmartynas #endif 4407b36286aSmartynas #else /* long long available */ 4417b36286aSmartynas #ifndef Llong 4427b36286aSmartynas #define Llong long long 4437b36286aSmartynas #endif 4447b36286aSmartynas #ifndef ULLong 4457b36286aSmartynas #define ULLong unsigned Llong 4467b36286aSmartynas #endif 4477b36286aSmartynas #endif /* NO_LONG_LONG */ 4487b36286aSmartynas 4497b36286aSmartynas #ifdef Pack_32 4507b36286aSmartynas #define ULbits 32 4517b36286aSmartynas #define kshift 5 4527b36286aSmartynas #define kmask 31 4537b36286aSmartynas #define ALL_ON 0xffffffff 4547b36286aSmartynas #else 4557b36286aSmartynas #define ULbits 16 4567b36286aSmartynas #define kshift 4 4577b36286aSmartynas #define kmask 15 4587b36286aSmartynas #define ALL_ON 0xffff 4597b36286aSmartynas #endif 4607b36286aSmartynas 4617b36286aSmartynas #ifndef MULTIPLE_THREADS 4627b36286aSmartynas #define ACQUIRE_DTOA_LOCK(n) /*nothing*/ 4637b36286aSmartynas #define FREE_DTOA_LOCK(n) /*nothing*/ 4647b36286aSmartynas #else 4657b36286aSmartynas #include "thread_private.h" 4667b36286aSmartynas #define ACQUIRE_DTOA_LOCK(n) _MUTEX_LOCK(&__dtoa_locks[n]) 4677b36286aSmartynas #define FREE_DTOA_LOCK(n) _MUTEX_UNLOCK(&__dtoa_locks[n]) 4687b36286aSmartynas #endif 4697b36286aSmartynas 4701a653cbcSmartynas #define Kmax 9 4717b36286aSmartynas 4727b36286aSmartynas struct 4737b36286aSmartynas Bigint { 4747b36286aSmartynas struct Bigint *next; 4757b36286aSmartynas int k, maxwds, sign, wds; 4767b36286aSmartynas ULong x[1]; 4777b36286aSmartynas }; 4787b36286aSmartynas 4797b36286aSmartynas typedef struct Bigint Bigint; 4807b36286aSmartynas 4817b36286aSmartynas #ifdef NO_STRING_H 4827b36286aSmartynas #ifdef DECLARE_SIZE_T 4837b36286aSmartynas typedef unsigned int size_t; 4847b36286aSmartynas #endif 4857b36286aSmartynas extern void memcpy_D2A ANSI((void*, const void*, size_t)); 4867b36286aSmartynas #define Bcopy(x,y) memcpy_D2A(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int)) 4877b36286aSmartynas #else /* !NO_STRING_H */ 4887b36286aSmartynas #define Bcopy(x,y) memcpy(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int)) 4897b36286aSmartynas #endif /* NO_STRING_H */ 4907b36286aSmartynas 4917b36286aSmartynas #define dtoa __dtoa 4927b36286aSmartynas #define gdtoa __gdtoa 4937b36286aSmartynas #define freedtoa __freedtoa 4947b36286aSmartynas #define strtodg __strtodg 4957b36286aSmartynas #define g_ddfmt __g_ddfmt 4967b36286aSmartynas #define g_dfmt __g_dfmt 4977b36286aSmartynas #define g_ffmt __g_ffmt 4987b36286aSmartynas #define g_Qfmt __g_Qfmt 4997b36286aSmartynas #define g_xfmt __g_xfmt 5007b36286aSmartynas #define g_xLfmt __g_xLfmt 5017b36286aSmartynas #define strtoId __strtoId 5027b36286aSmartynas #define strtoIdd __strtoIdd 5037b36286aSmartynas #define strtoIf __strtoIf 5047b36286aSmartynas #define strtoIQ __strtoIQ 5057b36286aSmartynas #define strtoIx __strtoIx 5067b36286aSmartynas #define strtoIxL __strtoIxL 5077b36286aSmartynas #define strtord __strtord 5087b36286aSmartynas #define strtordd __strtordd 5097b36286aSmartynas #define strtorf __strtorf 5107b36286aSmartynas #define strtorQ __strtorQ 5117b36286aSmartynas #define strtorx __strtorx 5127b36286aSmartynas #define strtorxL __strtorxL 5137b36286aSmartynas #define strtodI __strtodI 5147b36286aSmartynas #define strtopd __strtopd 5157b36286aSmartynas #define strtopdd __strtopdd 5167b36286aSmartynas #define strtopf __strtopf 5177b36286aSmartynas #define strtopQ __strtopQ 5187b36286aSmartynas #define strtopx __strtopx 5197b36286aSmartynas #define strtopxL __strtopxL 5207b36286aSmartynas 5217b36286aSmartynas #define Balloc __Balloc_D2A 5227b36286aSmartynas #define Bfree __Bfree_D2A 5237b36286aSmartynas #define ULtoQ __ULtoQ_D2A 5247b36286aSmartynas #define ULtof __ULtof_D2A 5257b36286aSmartynas #define ULtod __ULtod_D2A 5267b36286aSmartynas #define ULtodd __ULtodd_D2A 5277b36286aSmartynas #define ULtox __ULtox_D2A 5287b36286aSmartynas #define ULtoxL __ULtoxL_D2A 5297b36286aSmartynas #define any_on __any_on_D2A 5307b36286aSmartynas #define b2d __b2d_D2A 5317b36286aSmartynas #define bigtens __bigtens_D2A 5327b36286aSmartynas #define cmp __cmp_D2A 5337b36286aSmartynas #define copybits __copybits_D2A 5347b36286aSmartynas #define d2b __d2b_D2A 5357b36286aSmartynas #define decrement __decrement_D2A 5367b36286aSmartynas #define diff __diff_D2A 5377b36286aSmartynas #define dtoa_result __dtoa_result_D2A 5387b36286aSmartynas #define g__fmt __g__fmt_D2A 5397b36286aSmartynas #define gethex __gethex_D2A 5407b36286aSmartynas #define hexdig __hexdig_D2A 5417b36286aSmartynas #define hexnan __hexnan_D2A 5421a653cbcSmartynas #define hi0bits(x) __hi0bits_D2A((ULong)(x)) 5437b36286aSmartynas #define hi0bits_D2A __hi0bits_D2A 5447b36286aSmartynas #define i2b __i2b_D2A 5457b36286aSmartynas #define increment __increment_D2A 5467b36286aSmartynas #define lo0bits __lo0bits_D2A 5477b36286aSmartynas #define lshift __lshift_D2A 5487b36286aSmartynas #define match __match_D2A 5497b36286aSmartynas #define mult __mult_D2A 5507b36286aSmartynas #define multadd __multadd_D2A 5517b36286aSmartynas #define nrv_alloc __nrv_alloc_D2A 5527b36286aSmartynas #define pow5mult __pow5mult_D2A 5537b36286aSmartynas #define quorem __quorem_D2A 5547b36286aSmartynas #define ratio __ratio_D2A 5557b36286aSmartynas #define rshift __rshift_D2A 5567b36286aSmartynas #define rv_alloc __rv_alloc_D2A 5577b36286aSmartynas #define s2b __s2b_D2A 5587b36286aSmartynas #define set_ones __set_ones_D2A 5597b36286aSmartynas #define strcp __strcp_D2A 5607b36286aSmartynas #define strtoIg __strtoIg_D2A 5611a653cbcSmartynas #define sulp __sulp_D2A 5627b36286aSmartynas #define sum __sum_D2A 5637b36286aSmartynas #define tens __tens_D2A 5647b36286aSmartynas #define tinytens __tinytens_D2A 5657b36286aSmartynas #define tinytens __tinytens_D2A 5667b36286aSmartynas #define trailz __trailz_D2A 5677b36286aSmartynas #define ulp __ulp_D2A 5687b36286aSmartynas 5690d943ef0Sguenther __BEGIN_HIDDEN_DECLS 5707b36286aSmartynas extern char *dtoa_result; 5717b36286aSmartynas extern CONST double bigtens[], tens[], tinytens[]; 5727b36286aSmartynas extern unsigned char hexdig[]; 5737b36286aSmartynas 5747b36286aSmartynas extern Bigint *Balloc ANSI((int)); 5757b36286aSmartynas extern void Bfree ANSI((Bigint*)); 5767b36286aSmartynas extern void ULtof ANSI((ULong*, ULong*, Long, int)); 5777b36286aSmartynas extern void ULtod ANSI((ULong*, ULong*, Long, int)); 5787b36286aSmartynas extern void ULtodd ANSI((ULong*, ULong*, Long, int)); 5797b36286aSmartynas extern void ULtoQ ANSI((ULong*, ULong*, Long, int)); 5807b36286aSmartynas extern void ULtox ANSI((UShort*, ULong*, Long, int)); 5817b36286aSmartynas extern void ULtoxL ANSI((ULong*, ULong*, Long, int)); 5827b36286aSmartynas extern ULong any_on ANSI((Bigint*, int)); 5837b36286aSmartynas extern double b2d ANSI((Bigint*, int*)); 5847b36286aSmartynas extern int cmp ANSI((Bigint*, Bigint*)); 5857b36286aSmartynas extern void copybits ANSI((ULong*, int, Bigint*)); 5867b36286aSmartynas extern Bigint *d2b ANSI((double, int*, int*)); 587aad11945Smartynas extern void decrement ANSI((Bigint*)); 5887b36286aSmartynas extern Bigint *diff ANSI((Bigint*, Bigint*)); 589aad11945Smartynas extern char *g__fmt ANSI((char*, char*, char*, int, ULong, size_t)); 5907b36286aSmartynas extern int gethex ANSI((CONST char**, FPI*, Long*, Bigint**, int)); 591b3b7ef2eSguenther extern void __hexdig_init_D2A(Void); 5927b36286aSmartynas extern int hexnan ANSI((CONST char**, FPI*, ULong*)); 5937b36286aSmartynas extern int hi0bits_D2A ANSI((ULong)); 5947b36286aSmartynas extern Bigint *i2b ANSI((int)); 5957b36286aSmartynas extern Bigint *increment ANSI((Bigint*)); 5967b36286aSmartynas extern int lo0bits ANSI((ULong*)); 5977b36286aSmartynas extern Bigint *lshift ANSI((Bigint*, int)); 5987b36286aSmartynas extern int match ANSI((CONST char**, char*)); 5997b36286aSmartynas extern Bigint *mult ANSI((Bigint*, Bigint*)); 6007b36286aSmartynas extern Bigint *multadd ANSI((Bigint*, int, int)); 6017b36286aSmartynas extern char *nrv_alloc ANSI((char*, char **, int)); 6027b36286aSmartynas extern Bigint *pow5mult ANSI((Bigint*, int)); 6037b36286aSmartynas extern int quorem ANSI((Bigint*, Bigint*)); 6047b36286aSmartynas extern double ratio ANSI((Bigint*, Bigint*)); 6057b36286aSmartynas extern void rshift ANSI((Bigint*, int)); 6067b36286aSmartynas extern char *rv_alloc ANSI((int)); 6071a653cbcSmartynas extern Bigint *s2b ANSI((CONST char*, int, int, ULong, int)); 6087b36286aSmartynas extern Bigint *set_ones ANSI((Bigint*, int)); 6097b36286aSmartynas extern char *strcp ANSI((char*, const char*)); 6107b36286aSmartynas extern int strtoIg ANSI((CONST char*, char**, FPI*, Long*, Bigint**, int*)); 6117b36286aSmartynas extern Bigint *sum ANSI((Bigint*, Bigint*)); 6127b36286aSmartynas extern int trailz ANSI((Bigint*)); 6131a653cbcSmartynas extern double ulp ANSI((U*)); 6140d943ef0Sguenther __END_HIDDEN_DECLS 6157b36286aSmartynas 6167b36286aSmartynas #ifdef __cplusplus 6177b36286aSmartynas } 6187b36286aSmartynas #endif 6197b36286aSmartynas /* 6207b36286aSmartynas * NAN_WORD0 and NAN_WORD1 are only referenced in strtod.c. Prior to 6217b36286aSmartynas * 20050115, they used to be hard-wired here (to 0x7ff80000 and 0, 6227b36286aSmartynas * respectively), but now are determined by compiling and running 6237b36286aSmartynas * qnan.c to generate gd_qnan.h, which specifies d_QNAN0 and d_QNAN1. 6247b36286aSmartynas * Formerly gdtoaimp.h recommended supplying suitable -DNAN_WORD0=... 6257b36286aSmartynas * and -DNAN_WORD1=... values if necessary. This should still work. 6267b36286aSmartynas * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.) 6277b36286aSmartynas */ 6287b36286aSmartynas #ifdef IEEE_Arith 6291a653cbcSmartynas #ifndef NO_INFNAN_CHECK 6301a653cbcSmartynas #undef INFNAN_CHECK 6311a653cbcSmartynas #define INFNAN_CHECK 6321a653cbcSmartynas #endif 6337b36286aSmartynas #ifdef IEEE_MC68k 6347b36286aSmartynas #define _0 0 6357b36286aSmartynas #define _1 1 6367b36286aSmartynas #ifndef NAN_WORD0 6377b36286aSmartynas #define NAN_WORD0 d_QNAN0 6387b36286aSmartynas #endif 6397b36286aSmartynas #ifndef NAN_WORD1 6407b36286aSmartynas #define NAN_WORD1 d_QNAN1 6417b36286aSmartynas #endif 6427b36286aSmartynas #else 6437b36286aSmartynas #define _0 1 6447b36286aSmartynas #define _1 0 6457b36286aSmartynas #ifndef NAN_WORD0 6467b36286aSmartynas #define NAN_WORD0 d_QNAN1 6477b36286aSmartynas #endif 6487b36286aSmartynas #ifndef NAN_WORD1 6497b36286aSmartynas #define NAN_WORD1 d_QNAN0 6507b36286aSmartynas #endif 6517b36286aSmartynas #endif 6527b36286aSmartynas #else 6537b36286aSmartynas #undef INFNAN_CHECK 6547b36286aSmartynas #endif 6557b36286aSmartynas 6567b36286aSmartynas #undef SI 6577b36286aSmartynas #ifdef Sudden_Underflow 6587b36286aSmartynas #define SI 1 6597b36286aSmartynas #else 6607b36286aSmartynas #define SI 0 6617b36286aSmartynas #endif 6627b36286aSmartynas 6637b36286aSmartynas #endif /* GDTOAIMP_H_INCLUDED */ 664