xref: /openbsd-src/lib/libc/gdtoa/gdtoaimp.h (revision 2c53affbcc0119d6480b86c18f2790523b6a0aad)
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