| @@ -1,653 +1,653 @@ | | | @@ -1,653 +1,653 @@ |
1 | /* $NetBSD: gdtoaimp.h,v 1.7 2009/05/07 20:31:44 christos Exp $ */ | | 1 | /* $NetBSD: gdtoaimp.h,v 1.8 2011/01/21 23:36:49 christos Exp $ */ |
2 | | | 2 | |
3 | /**************************************************************** | | 3 | /**************************************************************** |
4 | | | 4 | |
5 | The author of this software is David M. Gay. | | 5 | The author of this software is David M. Gay. |
6 | | | 6 | |
7 | Copyright (C) 1998-2000 by Lucent Technologies | | 7 | Copyright (C) 1998-2000 by Lucent Technologies |
8 | All Rights Reserved | | 8 | All Rights Reserved |
9 | | | 9 | |
10 | Permission to use, copy, modify, and distribute this software and | | 10 | Permission to use, copy, modify, and distribute this software and |
11 | its documentation for any purpose and without fee is hereby | | 11 | its documentation for any purpose and without fee is hereby |
12 | granted, provided that the above copyright notice appear in all | | 12 | granted, provided that the above copyright notice appear in all |
13 | copies and that both that the copyright notice and this | | 13 | copies and that both that the copyright notice and this |
14 | permission notice and warranty disclaimer appear in supporting | | 14 | permission notice and warranty disclaimer appear in supporting |
15 | documentation, and that the name of Lucent or any of its entities | | 15 | documentation, and that the name of Lucent or any of its entities |
16 | not be used in advertising or publicity pertaining to | | 16 | not be used in advertising or publicity pertaining to |
17 | distribution of the software without specific, written prior | | 17 | distribution of the software without specific, written prior |
18 | permission. | | 18 | permission. |
19 | | | 19 | |
20 | LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, | | 20 | LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
21 | INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. | | 21 | INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. |
22 | IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY | | 22 | IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY |
23 | SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | | 23 | SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
24 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | | 24 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER |
25 | IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, | | 25 | IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, |
26 | ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF | | 26 | ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF |
27 | THIS SOFTWARE. | | 27 | THIS SOFTWARE. |
28 | | | 28 | |
29 | ****************************************************************/ | | 29 | ****************************************************************/ |
30 | | | 30 | |
31 | /* This is a variation on dtoa.c that converts arbitary binary | | 31 | /* This is a variation on dtoa.c that converts arbitary binary |
32 | floating-point formats to and from decimal notation. It uses | | 32 | floating-point formats to and from decimal notation. It uses |
33 | double-precision arithmetic internally, so there are still | | 33 | double-precision arithmetic internally, so there are still |
34 | various #ifdefs that adapt the calculations to the native | | 34 | various #ifdefs that adapt the calculations to the native |
35 | double-precision arithmetic (any of IEEE, VAX D_floating, | | 35 | double-precision arithmetic (any of IEEE, VAX D_floating, |
36 | or IBM mainframe arithmetic). | | 36 | or IBM mainframe arithmetic). |
37 | | | 37 | |
38 | Please send bug reports to David M. Gay (dmg at acm dot org, | | 38 | Please send bug reports to David M. Gay (dmg at acm dot org, |
39 | with " at " changed at "@" and " dot " changed to "."). | | 39 | with " at " changed at "@" and " dot " changed to "."). |
40 | */ | | 40 | */ |
41 | | | 41 | |
42 | /* On a machine with IEEE extended-precision registers, it is | | 42 | /* On a machine with IEEE extended-precision registers, it is |
43 | * necessary to specify double-precision (53-bit) rounding precision | | 43 | * necessary to specify double-precision (53-bit) rounding precision |
44 | * before invoking strtod or dtoa. If the machine uses (the equivalent | | 44 | * before invoking strtod or dtoa. If the machine uses (the equivalent |
45 | * of) Intel 80x87 arithmetic, the call | | 45 | * of) Intel 80x87 arithmetic, the call |
46 | * _control87(PC_53, MCW_PC); | | 46 | * _control87(PC_53, MCW_PC); |
47 | * does this with many compilers. Whether this or another call is | | 47 | * does this with many compilers. Whether this or another call is |
48 | * appropriate depends on the compiler; for this to work, it may be | | 48 | * appropriate depends on the compiler; for this to work, it may be |
49 | * necessary to #include "float.h" or another system-dependent header | | 49 | * necessary to #include "float.h" or another system-dependent header |
50 | * file. | | 50 | * file. |
51 | */ | | 51 | */ |
52 | | | 52 | |
53 | /* strtod for IEEE-, VAX-, and IBM-arithmetic machines. | | 53 | /* strtod for IEEE-, VAX-, and IBM-arithmetic machines. |
54 | * | | 54 | * |
55 | * This strtod returns a nearest machine number to the input decimal | | 55 | * This strtod returns a nearest machine number to the input decimal |
56 | * string (or sets errno to ERANGE). With IEEE arithmetic, ties are | | 56 | * string (or sets errno to ERANGE). With IEEE arithmetic, ties are |
57 | * broken by the IEEE round-even rule. Otherwise ties are broken by | | 57 | * broken by the IEEE round-even rule. Otherwise ties are broken by |
58 | * biased rounding (add half and chop). | | 58 | * biased rounding (add half and chop). |
59 | * | | 59 | * |
60 | * Inspired loosely by William D. Clinger's paper "How to Read Floating | | 60 | * Inspired loosely by William D. Clinger's paper "How to Read Floating |
61 | * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 112-126]. | | 61 | * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 112-126]. |
62 | * | | 62 | * |
63 | * Modifications: | | 63 | * Modifications: |
64 | * | | 64 | * |
65 | * 1. We only require IEEE, IBM, or VAX double-precision | | 65 | * 1. We only require IEEE, IBM, or VAX double-precision |
66 | * arithmetic (not IEEE double-extended). | | 66 | * arithmetic (not IEEE double-extended). |
67 | * 2. We get by with floating-point arithmetic in a case that | | 67 | * 2. We get by with floating-point arithmetic in a case that |
68 | * Clinger missed -- when we're computing d * 10^n | | 68 | * Clinger missed -- when we're computing d * 10^n |
69 | * for a small integer d and the integer n is not too | | 69 | * for a small integer d and the integer n is not too |
70 | * much larger than 22 (the maximum integer k for which | | 70 | * much larger than 22 (the maximum integer k for which |
71 | * we can represent 10^k exactly), we may be able to | | 71 | * we can represent 10^k exactly), we may be able to |
72 | * compute (d*10^k) * 10^(e-k) with just one roundoff. | | 72 | * compute (d*10^k) * 10^(e-k) with just one roundoff. |
73 | * 3. Rather than a bit-at-a-time adjustment of the binary | | 73 | * 3. Rather than a bit-at-a-time adjustment of the binary |
74 | * result in the hard case, we use floating-point | | 74 | * result in the hard case, we use floating-point |
75 | * arithmetic to determine the adjustment to within | | 75 | * arithmetic to determine the adjustment to within |
76 | * one bit; only in really hard cases do we need to | | 76 | * one bit; only in really hard cases do we need to |
77 | * compute a second residual. | | 77 | * compute a second residual. |
78 | * 4. Because of 3., we don't need a large table of powers of 10 | | 78 | * 4. Because of 3., we don't need a large table of powers of 10 |
79 | * for ten-to-e (just some small tables, e.g. of 10^k | | 79 | * for ten-to-e (just some small tables, e.g. of 10^k |
80 | * for 0 <= k <= 22). | | 80 | * for 0 <= k <= 22). |
81 | */ | | 81 | */ |
82 | | | 82 | |
83 | /* | | 83 | /* |
84 | * #define IEEE_LITTLE_ENDIAN for IEEE-arithmetic machines where the least | | 84 | * #define IEEE_LITTLE_ENDIAN for IEEE-arithmetic machines where the least |
85 | * significant byte has the lowest address. | | 85 | * significant byte has the lowest address. |
86 | * #define IEEE_BIG_ENDIAN for IEEE-arithmetic machines where the most | | 86 | * #define IEEE_BIG_ENDIAN for IEEE-arithmetic machines where the most |
87 | * significant byte has the lowest address. | | 87 | * significant byte has the lowest address. |
88 | * #define Long int on machines with 32-bit ints and 64-bit longs. | | 88 | * #define Long int on machines with 32-bit ints and 64-bit longs. |
89 | * #define Sudden_Underflow for IEEE-format machines without gradual | | 89 | * #define Sudden_Underflow for IEEE-format machines without gradual |
90 | * underflow (i.e., that flush to zero on underflow). | | 90 | * underflow (i.e., that flush to zero on underflow). |
91 | * #define IBM for IBM mainframe-style floating-point arithmetic. | | 91 | * #define IBM for IBM mainframe-style floating-point arithmetic. |
92 | * #define VAX for VAX-style floating-point arithmetic (D_floating). | | 92 | * #define VAX for VAX-style floating-point arithmetic (D_floating). |
93 | * #define No_leftright to omit left-right logic in fast floating-point | | 93 | * #define No_leftright to omit left-right logic in fast floating-point |
94 | * computation of dtoa. | | 94 | * computation of dtoa. |
95 | * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3. | | 95 | * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3. |
96 | * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines | | 96 | * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines |
97 | * that use extended-precision instructions to compute rounded | | 97 | * that use extended-precision instructions to compute rounded |
98 | * products and quotients) with IBM. | | 98 | * products and quotients) with IBM. |
99 | * #define ROUND_BIASED for IEEE-format with biased rounding. | | 99 | * #define ROUND_BIASED for IEEE-format with biased rounding. |
100 | * #define Inaccurate_Divide for IEEE-format with correctly rounded | | 100 | * #define Inaccurate_Divide for IEEE-format with correctly rounded |
101 | * products but inaccurate quotients, e.g., for Intel i860. | | 101 | * products but inaccurate quotients, e.g., for Intel i860. |
102 | * #define NO_LONG_LONG on machines that do not have a "long long" | | 102 | * #define NO_LONG_LONG on machines that do not have a "long long" |
103 | * integer type (of >= 64 bits). On such machines, you can | | 103 | * integer type (of >= 64 bits). On such machines, you can |
104 | * #define Just_16 to store 16 bits per 32-bit Long when doing | | 104 | * #define Just_16 to store 16 bits per 32-bit Long when doing |
105 | * high-precision integer arithmetic. Whether this speeds things | | 105 | * high-precision integer arithmetic. Whether this speeds things |
106 | * up or slows things down depends on the machine and the number | | 106 | * up or slows things down depends on the machine and the number |
107 | * being converted. If long long is available and the name is | | 107 | * being converted. If long long is available and the name is |
108 | * something other than "long long", #define Llong to be the name, | | 108 | * something other than "long long", #define Llong to be the name, |
109 | * and if "unsigned Llong" does not work as an unsigned version of | | 109 | * and if "unsigned Llong" does not work as an unsigned version of |
110 | * Llong, #define #ULLong to be the corresponding unsigned type. | | 110 | * Llong, #define #ULLong to be the corresponding unsigned type. |
111 | * #define KR_headers for old-style C function headers. | | 111 | * #define KR_headers for old-style C function headers. |
112 | * #define Bad_float_h if your system lacks a float.h or if it does not | | 112 | * #define Bad_float_h if your system lacks a float.h or if it does not |
113 | * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, | | 113 | * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, |
114 | * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. | | 114 | * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. |
115 | * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) | | 115 | * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) |
116 | * if memory is available and otherwise does something you deem | | 116 | * if memory is available and otherwise does something you deem |
117 | * appropriate. If MALLOC is undefined, malloc will be invoked | | 117 | * appropriate. If MALLOC is undefined, malloc will be invoked |
118 | * directly -- and assumed always to succeed. | | 118 | * directly -- and assumed always to succeed. |
119 | * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making | | 119 | * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making |
120 | * memory allocations from a private pool of memory when possible. | | 120 | * memory allocations from a private pool of memory when possible. |
121 | * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes, | | 121 | * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes, |
122 | * unless #defined to be a different length. This default length | | 122 | * unless #defined to be a different length. This default length |
123 | * suffices to get rid of MALLOC calls except for unusual cases, | | 123 | * suffices to get rid of MALLOC calls except for unusual cases, |
124 | * such as decimal-to-binary conversion of a very long string of | | 124 | * such as decimal-to-binary conversion of a very long string of |
125 | * digits. When converting IEEE double precision values, the | | 125 | * digits. When converting IEEE double precision values, the |
126 | * longest string gdtoa can return is about 751 bytes long. For | | 126 | * longest string gdtoa can return is about 751 bytes long. For |
127 | * conversions by strtod of strings of 800 digits and all gdtoa | | 127 | * conversions by strtod of strings of 800 digits and all gdtoa |
128 | * conversions of IEEE doubles in single-threaded executions with | | 128 | * conversions of IEEE doubles in single-threaded executions with |
129 | * 8-byte pointers, PRIVATE_MEM >= 7400 appears to suffice; with | | 129 | * 8-byte pointers, PRIVATE_MEM >= 7400 appears to suffice; with |
130 | * 4-byte pointers, PRIVATE_MEM >= 7112 appears adequate. | | 130 | * 4-byte pointers, PRIVATE_MEM >= 7112 appears adequate. |
131 | * #define INFNAN_CHECK on IEEE systems to cause strtod to check for | | 131 | * #define INFNAN_CHECK on IEEE systems to cause strtod to check for |
132 | * Infinity and NaN (case insensitively). | | 132 | * Infinity and NaN (case insensitively). |
133 | * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined, | | 133 | * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined, |
134 | * strtodg also accepts (case insensitively) strings of the form | | 134 | * strtodg also accepts (case insensitively) strings of the form |
135 | * NaN(x), where x is a string of hexadecimal digits and spaces; | | 135 | * NaN(x), where x is a string of hexadecimal digits and spaces; |
136 | * if there is only one string of hexadecimal digits, it is taken | | 136 | * if there is only one string of hexadecimal digits, it is taken |
137 | * for the fraction bits of the resulting NaN; if there are two or | | 137 | * for the fraction bits of the resulting NaN; if there are two or |
138 | * more strings of hexadecimal digits, each string is assigned | | 138 | * more strings of hexadecimal digits, each string is assigned |
139 | * to the next available sequence of 32-bit words of fractions | | 139 | * to the next available sequence of 32-bit words of fractions |
140 | * bits (starting with the most significant), right-aligned in | | 140 | * bits (starting with the most significant), right-aligned in |
141 | * each sequence. | | 141 | * each sequence. |
142 | * #define MULTIPLE_THREADS if the system offers preemptively scheduled | | 142 | * #define MULTIPLE_THREADS if the system offers preemptively scheduled |
143 | * multiple threads. In this case, you must provide (or suitably | | 143 | * multiple threads. In this case, you must provide (or suitably |
144 | * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed | | 144 | * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed |
145 | * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed | | 145 | * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed |
146 | * in pow5mult, ensures lazy evaluation of only one copy of high | | 146 | * in pow5mult, ensures lazy evaluation of only one copy of high |
147 | * powers of 5; omitting this lock would introduce a small | | 147 | * powers of 5; omitting this lock would introduce a small |
148 | * probability of wasting memory, but would otherwise be harmless.) | | 148 | * probability of wasting memory, but would otherwise be harmless.) |
149 | * You must also invoke freedtoa(s) to free the value s returned by | | 149 | * You must also invoke freedtoa(s) to free the value s returned by |
150 | * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined. | | 150 | * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined. |
151 | * #define IMPRECISE_INEXACT if you do not care about the setting of | | 151 | * #define IMPRECISE_INEXACT if you do not care about the setting of |
152 | * the STRTOG_Inexact bits in the special case of doing IEEE double | | 152 | * the STRTOG_Inexact bits in the special case of doing IEEE double |
153 | * precision conversions (which could also be done by the strtog in | | 153 | * precision conversions (which could also be done by the strtog in |
154 | * dtoa.c). | | 154 | * dtoa.c). |
155 | * #define NO_HEX_FP to disable recognition of C9x's hexadecimal | | 155 | * #define NO_HEX_FP to disable recognition of C9x's hexadecimal |
156 | * floating-point constants. | | 156 | * floating-point constants. |
157 | * #define -DNO_ERRNO to suppress setting errno (in strtod.c and | | 157 | * #define -DNO_ERRNO to suppress setting errno (in strtod.c and |
158 | * strtodg.c). | | 158 | * strtodg.c). |
159 | * #define NO_STRING_H to use private versions of memcpy. | | 159 | * #define NO_STRING_H to use private versions of memcpy. |
160 | * On some K&R systems, it may also be necessary to | | 160 | * On some K&R systems, it may also be necessary to |
161 | * #define DECLARE_SIZE_T in this case. | | 161 | * #define DECLARE_SIZE_T in this case. |
162 | * #define YES_ALIAS to permit aliasing certain double values with | | 162 | * #define YES_ALIAS to permit aliasing certain double values with |
163 | * arrays of ULongs. This leads to slightly better code with | | 163 | * arrays of ULongs. This leads to slightly better code with |
164 | * some compilers and was always used prior to 19990916, but it | | 164 | * some compilers and was always used prior to 19990916, but it |
165 | * is not strictly legal and can cause trouble with aggressively | | 165 | * is not strictly legal and can cause trouble with aggressively |
166 | * optimizing compilers (e.g., gcc 2.95.1 under -O2). | | 166 | * optimizing compilers (e.g., gcc 2.95.1 under -O2). |
167 | * #define USE_LOCALE to use the current locale's decimal_point value. | | 167 | * #define USE_LOCALE to use the current locale's decimal_point value. |
168 | */ | | 168 | */ |
169 | | | 169 | |
170 | /* #define IEEE_{BIG,LITTLE}_ENDIAN in ${ARCHDIR}/gdtoa/arith.h */ | | 170 | /* #define IEEE_{BIG,LITTLE}_ENDIAN in ${ARCHDIR}/gdtoa/arith.h */ |
171 | | | 171 | |
172 | #include <stdint.h> | | 172 | #include <stdint.h> |
173 | #define Short int16_t | | 173 | #define Short int16_t |
174 | #define UShort uint16_t | | 174 | #define UShort uint16_t |
175 | #define Long int32_t | | 175 | #define Long int32_t |
176 | #define ULong uint32_t | | 176 | #define ULong uint32_t |
177 | #define LLong int64_t | | 177 | #define LLong int64_t |
178 | #define ULLong uint64_t | | 178 | #define ULLong uint64_t |
179 | | | 179 | |
180 | #define INFNAN_CHECK | | 180 | #define INFNAN_CHECK |
181 | #ifdef _REENTRANT | | 181 | #ifdef _REENTRANT |
182 | #define MULTIPLE_THREADS | | 182 | #define MULTIPLE_THREADS |
183 | #endif | | 183 | #endif |
184 | #define USE_LOCALE | | 184 | #define USE_LOCALE |
185 | | | 185 | |
186 | #ifndef GDTOAIMP_H_INCLUDED | | 186 | #ifndef GDTOAIMP_H_INCLUDED |
187 | #define GDTOAIMP_H_INCLUDED | | 187 | #define GDTOAIMP_H_INCLUDED |
188 | #include "gdtoa.h" | | 188 | #include "gdtoa.h" |
189 | #include "gd_qnan.h" | | 189 | #include "gd_qnan.h" |
190 | | | 190 | |
191 | #ifdef DEBUG | | 191 | #ifdef DEBUG |
192 | #include "stdio.h" | | 192 | #include "stdio.h" |
193 | #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} | | 193 | #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} |
194 | #endif | | 194 | #endif |
195 | | | 195 | |
196 | #include "stdlib.h" | | 196 | #include "stdlib.h" |
197 | #include "string.h" | | 197 | #include "string.h" |
198 | | | 198 | |
199 | #ifdef KR_headers | | 199 | #ifdef KR_headers |
200 | #define Char char | | 200 | #define Char char |
201 | #else | | 201 | #else |
202 | #define Char void | | 202 | #define Char void |
203 | #endif | | 203 | #endif |
204 | | | 204 | |
205 | #ifdef MALLOC | | 205 | #ifdef MALLOC |
206 | extern Char *MALLOC ANSI((size_t)); | | 206 | extern Char *MALLOC ANSI((size_t)); |
207 | #else | | 207 | #else |
208 | #define MALLOC malloc | | 208 | #define MALLOC malloc |
209 | #endif | | 209 | #endif |
210 | | | 210 | |
211 | #undef IEEE_Arith | | 211 | #undef IEEE_Arith |
212 | #undef Avoid_Underflow | | 212 | #undef Avoid_Underflow |
213 | #ifdef IEEE_BIG_ENDIAN | | 213 | #ifdef IEEE_BIG_ENDIAN |
214 | #define IEEE_Arith | | 214 | #define IEEE_Arith |
215 | #endif | | 215 | #endif |
216 | #ifdef IEEE_LITTLE_ENDIAN | | 216 | #ifdef IEEE_LITTLE_ENDIAN |
217 | #define IEEE_Arith | | 217 | #define IEEE_Arith |
218 | #endif | | 218 | #endif |
219 | | | 219 | |
220 | #include "errno.h" | | 220 | #include "errno.h" |
221 | #ifdef Bad_float_h | | 221 | #ifdef Bad_float_h |
222 | | | 222 | |
223 | #ifdef IEEE_Arith | | 223 | #ifdef IEEE_Arith |
224 | #define DBL_DIG 15 | | 224 | #define DBL_DIG 15 |
225 | #define DBL_MAX_10_EXP 308 | | 225 | #define DBL_MAX_10_EXP 308 |
226 | #define DBL_MAX_EXP 1024 | | 226 | #define DBL_MAX_EXP 1024 |
227 | #define FLT_RADIX 2 | | 227 | #define FLT_RADIX 2 |
228 | #define DBL_MAX 1.7976931348623157e+308 | | 228 | #define DBL_MAX 1.7976931348623157e+308 |
229 | #endif | | 229 | #endif |
230 | | | 230 | |
231 | #ifdef IBM | | 231 | #ifdef IBM |
232 | #define DBL_DIG 16 | | 232 | #define DBL_DIG 16 |
233 | #define DBL_MAX_10_EXP 75 | | 233 | #define DBL_MAX_10_EXP 75 |
234 | #define DBL_MAX_EXP 63 | | 234 | #define DBL_MAX_EXP 63 |
235 | #define FLT_RADIX 16 | | 235 | #define FLT_RADIX 16 |
236 | #define DBL_MAX 7.2370055773322621e+75 | | 236 | #define DBL_MAX 7.2370055773322621e+75 |
237 | #endif | | 237 | #endif |
238 | | | 238 | |
239 | #ifdef VAX | | 239 | #ifdef VAX |
240 | #define DBL_DIG 16 | | 240 | #define DBL_DIG 16 |
241 | #define DBL_MAX_10_EXP 38 | | 241 | #define DBL_MAX_10_EXP 38 |
242 | #define DBL_MAX_EXP 127 | | 242 | #define DBL_MAX_EXP 127 |
243 | #define FLT_RADIX 2 | | 243 | #define FLT_RADIX 2 |
244 | #define DBL_MAX 1.7014118346046923e+38 | | 244 | #define DBL_MAX 1.7014118346046923e+38 |
245 | #define n_bigtens 2 | | 245 | #define n_bigtens 2 |
246 | #endif | | 246 | #endif |
247 | | | 247 | |
248 | #ifndef LONG_MAX | | 248 | #ifndef LONG_MAX |
249 | #define LONG_MAX 2147483647 | | 249 | #define LONG_MAX 2147483647 |
250 | #endif | | 250 | #endif |
251 | | | 251 | |
252 | #else /* ifndef Bad_float_h */ | | 252 | #else /* ifndef Bad_float_h */ |
253 | #include "float.h" | | 253 | #include "float.h" |
254 | #endif /* Bad_float_h */ | | 254 | #endif /* Bad_float_h */ |
255 | | | 255 | |
256 | #ifdef IEEE_Arith | | 256 | #ifdef IEEE_Arith |
257 | #define Scale_Bit 0x10 | | 257 | #define Scale_Bit 0x10 |
258 | #define n_bigtens 5 | | 258 | #define n_bigtens 5 |
259 | #endif | | 259 | #endif |
260 | | | 260 | |
261 | #ifdef IBM | | 261 | #ifdef IBM |
262 | #define n_bigtens 3 | | 262 | #define n_bigtens 3 |
263 | #endif | | 263 | #endif |
264 | | | 264 | |
265 | #ifdef VAX | | 265 | #ifdef VAX |
266 | #define n_bigtens 2 | | 266 | #define n_bigtens 2 |
267 | #endif | | 267 | #endif |
268 | | | 268 | |
269 | #include "math.h" | | 269 | #include "math.h" |
270 | | | 270 | |
271 | #ifdef __cplusplus | | 271 | #ifdef __cplusplus |
272 | extern "C" { | | 272 | extern "C" { |
273 | #endif | | 273 | #endif |
274 | | | 274 | |
275 | #if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) + defined(IBM) != 1 | | 275 | #if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) + defined(IBM) != 1 |
276 | Exactly one of IEEE_LITTLE_ENDIAN, IEEE_BIG_ENDIAN, VAX, or IBM should be defined. | | 276 | Exactly one of IEEE_LITTLE_ENDIAN, IEEE_BIG_ENDIAN, VAX, or IBM should be defined. |
277 | #endif | | 277 | #endif |
278 | | | 278 | |
279 | typedef union { double d; ULong L[2]; } U; | | 279 | typedef union { double d; ULong L[2]; } __attribute__((__may_alias__)) U; |
280 | | | 280 | |
281 | #ifdef YES_ALIAS | | 281 | #ifdef YES_ALIAS |
282 | #define dval(x) x | | 282 | #define dval(x) x |
283 | #ifdef IEEE_LITTLE_ENDIAN | | 283 | #ifdef IEEE_LITTLE_ENDIAN |
284 | #define word0(x) ((ULong *)&x)[1] | | 284 | #define word0(x) ((ULong *)&x)[1] |
285 | #define word1(x) ((ULong *)&x)[0] | | 285 | #define word1(x) ((ULong *)&x)[0] |
286 | #else | | 286 | #else |
287 | #define word0(x) ((ULong *)&x)[0] | | 287 | #define word0(x) ((ULong *)&x)[0] |
288 | #define word1(x) ((ULong *)&x)[1] | | 288 | #define word1(x) ((ULong *)&x)[1] |
289 | #endif | | 289 | #endif |
290 | #else /* !YES_ALIAS */ | | 290 | #else /* !YES_ALIAS */ |
291 | #ifdef IEEE_LITTLE_ENDIAN | | 291 | #ifdef IEEE_LITTLE_ENDIAN |
292 | #define word0(x) ( /* LINTED */ (U*)&x)->L[1] | | 292 | #define word0(x) ( /* LINTED */ (U*)&x)->L[1] |
293 | #define word1(x) ( /* LINTED */ (U*)&x)->L[0] | | 293 | #define word1(x) ( /* LINTED */ (U*)&x)->L[0] |
294 | #else | | 294 | #else |
295 | #define word0(x) ( /* LINTED */ (U*)&x)->L[0] | | 295 | #define word0(x) ( /* LINTED */ (U*)&x)->L[0] |
296 | #define word1(x) ( /* LINTED */ (U*)&x)->L[1] | | 296 | #define word1(x) ( /* LINTED */ (U*)&x)->L[1] |
297 | #endif | | 297 | #endif |
298 | #define dval(x) ( /* LINTED */ (U*)&x)->d | | 298 | #define dval(x) ( /* LINTED */ (U*)&x)->d |
299 | #endif /* YES_ALIAS */ | | 299 | #endif /* YES_ALIAS */ |
300 | | | 300 | |
301 | /* The following definition of Storeinc is appropriate for MIPS processors. | | 301 | /* The following definition of Storeinc is appropriate for MIPS processors. |
302 | * An alternative that might be better on some machines is | | 302 | * An alternative that might be better on some machines is |
303 | * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) | | 303 | * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) |
304 | */ | | 304 | */ |
305 | #if defined(IEEE_LITTLE_ENDIAN) + defined(VAX) | | 305 | #if defined(IEEE_LITTLE_ENDIAN) + defined(VAX) |
306 | #define Storeinc(a,b,c) \ | | 306 | #define Storeinc(a,b,c) \ |
307 | (((unsigned short *)(void *)a)[1] = (unsigned short)b, \ | | 307 | (((unsigned short *)(void *)a)[1] = (unsigned short)b, \ |
308 | ((unsigned short *)(void *)a)[0] = (unsigned short)c, \ | | 308 | ((unsigned short *)(void *)a)[0] = (unsigned short)c, \ |
309 | a++) | | 309 | a++) |
310 | #else | | 310 | #else |
311 | #define Storeinc(a,b,c) \ | | 311 | #define Storeinc(a,b,c) \ |
312 | (((unsigned short *)(void *)a)[0] = (unsigned short)b, \ | | 312 | (((unsigned short *)(void *)a)[0] = (unsigned short)b, \ |
313 | ((unsigned short *)(void *)a)[1] = (unsigned short)c, \ | | 313 | ((unsigned short *)(void *)a)[1] = (unsigned short)c, \ |
314 | a++) | | 314 | a++) |
315 | #endif | | 315 | #endif |
316 | | | 316 | |
317 | /* #define P DBL_MANT_DIG */ | | 317 | /* #define P DBL_MANT_DIG */ |
318 | /* Ten_pmax = floor(P*log(2)/log(5)) */ | | 318 | /* Ten_pmax = floor(P*log(2)/log(5)) */ |
319 | /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ | | 319 | /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ |
320 | /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ | | 320 | /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ |
321 | /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ | | 321 | /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ |
322 | | | 322 | |
323 | #ifdef IEEE_Arith | | 323 | #ifdef IEEE_Arith |
324 | #define Exp_shift 20 | | 324 | #define Exp_shift 20 |
325 | #define Exp_shift1 20 | | 325 | #define Exp_shift1 20 |
326 | #define Exp_msk1 0x100000 | | 326 | #define Exp_msk1 0x100000 |
327 | #define Exp_msk11 0x100000 | | 327 | #define Exp_msk11 0x100000 |
328 | #define Exp_mask 0x7ff00000 | | 328 | #define Exp_mask 0x7ff00000 |
329 | #define P 53 | | 329 | #define P 53 |
330 | #define Bias 1023 | | 330 | #define Bias 1023 |
331 | #define Emin (-1022) | | 331 | #define Emin (-1022) |
332 | #define Exp_1 0x3ff00000 | | 332 | #define Exp_1 0x3ff00000 |
333 | #define Exp_11 0x3ff00000 | | 333 | #define Exp_11 0x3ff00000 |
334 | #define Ebits 11 | | 334 | #define Ebits 11 |
335 | #define Frac_mask 0xfffff | | 335 | #define Frac_mask 0xfffff |
336 | #define Frac_mask1 0xfffff | | 336 | #define Frac_mask1 0xfffff |
337 | #define Ten_pmax 22 | | 337 | #define Ten_pmax 22 |
338 | #define Bletch 0x10 | | 338 | #define Bletch 0x10 |
339 | #define Bndry_mask 0xfffff | | 339 | #define Bndry_mask 0xfffff |
340 | #define Bndry_mask1 0xfffff | | 340 | #define Bndry_mask1 0xfffff |
341 | #define LSB 1 | | 341 | #define LSB 1 |
342 | #define Sign_bit 0x80000000 | | 342 | #define Sign_bit 0x80000000 |
343 | #define Log2P 1 | | 343 | #define Log2P 1 |
344 | #define Tiny0 0 | | 344 | #define Tiny0 0 |
345 | #define Tiny1 1 | | 345 | #define Tiny1 1 |
346 | #define Quick_max 14 | | 346 | #define Quick_max 14 |
347 | #define Int_max 14 | | 347 | #define Int_max 14 |
348 | | | 348 | |
349 | #ifndef Flt_Rounds | | 349 | #ifndef Flt_Rounds |
350 | #ifdef FLT_ROUNDS | | 350 | #ifdef FLT_ROUNDS |
351 | #define Flt_Rounds FLT_ROUNDS | | 351 | #define Flt_Rounds FLT_ROUNDS |
352 | #else | | 352 | #else |
353 | #define Flt_Rounds 1 | | 353 | #define Flt_Rounds 1 |
354 | #endif | | 354 | #endif |
355 | #endif /*Flt_Rounds*/ | | 355 | #endif /*Flt_Rounds*/ |
356 | | | 356 | |
357 | #else /* ifndef IEEE_Arith */ | | 357 | #else /* ifndef IEEE_Arith */ |
358 | #undef Sudden_Underflow | | 358 | #undef Sudden_Underflow |
359 | #define Sudden_Underflow | | 359 | #define Sudden_Underflow |
360 | #ifdef IBM | | 360 | #ifdef IBM |
361 | #undef Flt_Rounds | | 361 | #undef Flt_Rounds |
362 | #define Flt_Rounds 0 | | 362 | #define Flt_Rounds 0 |
363 | #define Exp_shift 24 | | 363 | #define Exp_shift 24 |
364 | #define Exp_shift1 24 | | 364 | #define Exp_shift1 24 |
365 | #define Exp_msk1 0x1000000 | | 365 | #define Exp_msk1 0x1000000 |
366 | #define Exp_msk11 0x1000000 | | 366 | #define Exp_msk11 0x1000000 |
367 | #define Exp_mask 0x7f000000 | | 367 | #define Exp_mask 0x7f000000 |
368 | #define P 14 | | 368 | #define P 14 |
369 | #define Bias 65 | | 369 | #define Bias 65 |
370 | #define Exp_1 0x41000000 | | 370 | #define Exp_1 0x41000000 |
371 | #define Exp_11 0x41000000 | | 371 | #define Exp_11 0x41000000 |
372 | #define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ | | 372 | #define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ |
373 | #define Frac_mask 0xffffff | | 373 | #define Frac_mask 0xffffff |
374 | #define Frac_mask1 0xffffff | | 374 | #define Frac_mask1 0xffffff |
375 | #define Bletch 4 | | 375 | #define Bletch 4 |
376 | #define Ten_pmax 22 | | 376 | #define Ten_pmax 22 |
377 | #define Bndry_mask 0xefffff | | 377 | #define Bndry_mask 0xefffff |
378 | #define Bndry_mask1 0xffffff | | 378 | #define Bndry_mask1 0xffffff |
379 | #define LSB 1 | | 379 | #define LSB 1 |
380 | #define Sign_bit 0x80000000 | | 380 | #define Sign_bit 0x80000000 |
381 | #define Log2P 4 | | 381 | #define Log2P 4 |
382 | #define Tiny0 0x100000 | | 382 | #define Tiny0 0x100000 |
383 | #define Tiny1 0 | | 383 | #define Tiny1 0 |
384 | #define Quick_max 14 | | 384 | #define Quick_max 14 |
385 | #define Int_max 15 | | 385 | #define Int_max 15 |
386 | #else /* VAX */ | | 386 | #else /* VAX */ |
387 | #undef Flt_Rounds | | 387 | #undef Flt_Rounds |
388 | #define Flt_Rounds 1 | | 388 | #define Flt_Rounds 1 |
389 | #define Exp_shift 23 | | 389 | #define Exp_shift 23 |
390 | #define Exp_shift1 7 | | 390 | #define Exp_shift1 7 |
391 | #define Exp_msk1 0x80 | | 391 | #define Exp_msk1 0x80 |
392 | #define Exp_msk11 0x800000 | | 392 | #define Exp_msk11 0x800000 |
393 | #define Exp_mask 0x7f80 | | 393 | #define Exp_mask 0x7f80 |
394 | #define P 56 | | 394 | #define P 56 |
395 | #define Bias 129 | | 395 | #define Bias 129 |
396 | #define Exp_1 0x40800000 | | 396 | #define Exp_1 0x40800000 |
397 | #define Exp_11 0x4080 | | 397 | #define Exp_11 0x4080 |
398 | #define Ebits 8 | | 398 | #define Ebits 8 |
399 | #define Frac_mask 0x7fffff | | 399 | #define Frac_mask 0x7fffff |
400 | #define Frac_mask1 0xffff007f | | 400 | #define Frac_mask1 0xffff007f |
401 | #define Ten_pmax 24 | | 401 | #define Ten_pmax 24 |
402 | #define Bletch 2 | | 402 | #define Bletch 2 |
403 | #define Bndry_mask 0xffff007f | | 403 | #define Bndry_mask 0xffff007f |
404 | #define Bndry_mask1 0xffff007f | | 404 | #define Bndry_mask1 0xffff007f |
405 | #define LSB 0x10000 | | 405 | #define LSB 0x10000 |
406 | #define Sign_bit 0x8000 | | 406 | #define Sign_bit 0x8000 |
407 | #define Log2P 1 | | 407 | #define Log2P 1 |
408 | #define Tiny0 0x80 | | 408 | #define Tiny0 0x80 |
409 | #define Tiny1 0 | | 409 | #define Tiny1 0 |
410 | #define Quick_max 15 | | 410 | #define Quick_max 15 |
411 | #define Int_max 15 | | 411 | #define Int_max 15 |
412 | #endif /* IBM, VAX */ | | 412 | #endif /* IBM, VAX */ |
413 | #endif /* IEEE_Arith */ | | 413 | #endif /* IEEE_Arith */ |
414 | | | 414 | |
415 | #ifndef IEEE_Arith | | 415 | #ifndef IEEE_Arith |
416 | #define ROUND_BIASED | | 416 | #define ROUND_BIASED |
417 | #endif | | 417 | #endif |
418 | | | 418 | |
419 | #ifdef RND_PRODQUOT | | 419 | #ifdef RND_PRODQUOT |
420 | #define rounded_product(a,b) a = rnd_prod(a, b) | | 420 | #define rounded_product(a,b) a = rnd_prod(a, b) |
421 | #define rounded_quotient(a,b) a = rnd_quot(a, b) | | 421 | #define rounded_quotient(a,b) a = rnd_quot(a, b) |
422 | #ifdef KR_headers | | 422 | #ifdef KR_headers |
423 | extern double rnd_prod(), rnd_quot(); | | 423 | extern double rnd_prod(), rnd_quot(); |
424 | #else | | 424 | #else |
425 | extern double rnd_prod(double, double), rnd_quot(double, double); | | 425 | extern double rnd_prod(double, double), rnd_quot(double, double); |
426 | #endif | | 426 | #endif |
427 | #else | | 427 | #else |
428 | #define rounded_product(a,b) a *= b | | 428 | #define rounded_product(a,b) a *= b |
429 | #define rounded_quotient(a,b) a /= b | | 429 | #define rounded_quotient(a,b) a /= b |
430 | #endif | | 430 | #endif |
431 | | | 431 | |
432 | #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) | | 432 | #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) |
433 | #define Big1 0xffffffff | | 433 | #define Big1 0xffffffff |
434 | | | 434 | |
435 | #undef Pack_16 | | 435 | #undef Pack_16 |
436 | #ifndef Pack_32 | | 436 | #ifndef Pack_32 |
437 | #define Pack_32 | | 437 | #define Pack_32 |
438 | #endif | | 438 | #endif |
439 | | | 439 | |
440 | #ifdef NO_LONG_LONG | | 440 | #ifdef NO_LONG_LONG |
441 | #undef ULLong | | 441 | #undef ULLong |
442 | #ifdef Just_16 | | 442 | #ifdef Just_16 |
443 | #undef Pack_32 | | 443 | #undef Pack_32 |
444 | #define Pack_16 | | 444 | #define Pack_16 |
445 | /* When Pack_32 is not defined, we store 16 bits per 32-bit Long. | | 445 | /* When Pack_32 is not defined, we store 16 bits per 32-bit Long. |
446 | * This makes some inner loops simpler and sometimes saves work | | 446 | * This makes some inner loops simpler and sometimes saves work |
447 | * during multiplications, but it often seems to make things slightly | | 447 | * during multiplications, but it often seems to make things slightly |
448 | * slower. Hence the default is now to store 32 bits per Long. | | 448 | * slower. Hence the default is now to store 32 bits per Long. |
449 | */ | | 449 | */ |
450 | #endif | | 450 | #endif |
451 | #else /* long long available */ | | 451 | #else /* long long available */ |
452 | #ifndef Llong | | 452 | #ifndef Llong |
453 | #define Llong long long | | 453 | #define Llong long long |
454 | #endif | | 454 | #endif |
455 | #ifndef ULLong | | 455 | #ifndef ULLong |
456 | #define ULLong unsigned Llong | | 456 | #define ULLong unsigned Llong |
457 | #endif | | 457 | #endif |
458 | #endif /* NO_LONG_LONG */ | | 458 | #endif /* NO_LONG_LONG */ |
459 | | | 459 | |
460 | #ifdef Pack_32 | | 460 | #ifdef Pack_32 |
461 | #define ULbits 32 | | 461 | #define ULbits 32 |
462 | #define kshift 5 | | 462 | #define kshift 5 |
463 | #define kmask 31 | | 463 | #define kmask 31 |
464 | #define ALL_ON 0xffffffff | | 464 | #define ALL_ON 0xffffffff |
465 | #else | | 465 | #else |
466 | #define ULbits 16 | | 466 | #define ULbits 16 |
467 | #define kshift 4 | | 467 | #define kshift 4 |
468 | #define kmask 15 | | 468 | #define kmask 15 |
469 | #define ALL_ON 0xffff | | 469 | #define ALL_ON 0xffff |
470 | #endif | | 470 | #endif |
471 | | | 471 | |
472 | #ifndef MULTIPLE_THREADS | | 472 | #ifndef MULTIPLE_THREADS |
473 | #define ACQUIRE_DTOA_LOCK(n) /*nothing*/ | | 473 | #define ACQUIRE_DTOA_LOCK(n) /*nothing*/ |
474 | #define FREE_DTOA_LOCK(n) /*nothing*/ | | 474 | #define FREE_DTOA_LOCK(n) /*nothing*/ |
475 | #else | | 475 | #else |
476 | #include "reentrant.h" | | 476 | #include "reentrant.h" |
477 | | | 477 | |
478 | extern mutex_t __gdtoa_locks[2]; | | 478 | extern mutex_t __gdtoa_locks[2]; |
479 | | | 479 | |
480 | #define ACQUIRE_DTOA_LOCK(n) \ | | 480 | #define ACQUIRE_DTOA_LOCK(n) \ |
481 | do { \ | | 481 | do { \ |
482 | if (__isthreaded) \ | | 482 | if (__isthreaded) \ |
483 | mutex_lock(&__gdtoa_locks[n]); \ | | 483 | mutex_lock(&__gdtoa_locks[n]); \ |
484 | } while (/* CONSTCOND */ 0) | | 484 | } while (/* CONSTCOND */ 0) |
485 | #define FREE_DTOA_LOCK(n) \ | | 485 | #define FREE_DTOA_LOCK(n) \ |
486 | do { \ | | 486 | do { \ |
487 | if (__isthreaded) \ | | 487 | if (__isthreaded) \ |
488 | mutex_unlock(&__gdtoa_locks[n]); \ | | 488 | mutex_unlock(&__gdtoa_locks[n]); \ |
489 | } while (/* CONSTCOND */ 0) | | 489 | } while (/* CONSTCOND */ 0) |
490 | #endif | | 490 | #endif |
491 | | | 491 | |
492 | #define Kmax (sizeof(size_t) << 3) | | 492 | #define Kmax (sizeof(size_t) << 3) |
493 | | | 493 | |
494 | struct | | 494 | struct |
495 | Bigint { | | 495 | Bigint { |
496 | struct Bigint *next; | | 496 | struct Bigint *next; |
497 | int k, maxwds, sign, wds; | | 497 | int k, maxwds, sign, wds; |
498 | ULong x[1]; | | 498 | ULong x[1]; |
499 | }; | | 499 | }; |
500 | | | 500 | |
501 | typedef struct Bigint Bigint; | | 501 | typedef struct Bigint Bigint; |
502 | | | 502 | |
503 | #ifdef NO_STRING_H | | 503 | #ifdef NO_STRING_H |
504 | #ifdef DECLARE_SIZE_T | | 504 | #ifdef DECLARE_SIZE_T |
505 | typedef unsigned int size_t; | | 505 | typedef unsigned int size_t; |
506 | #endif | | 506 | #endif |
507 | extern void memcpy_D2A ANSI((void*, const void*, size_t)); | | 507 | extern void memcpy_D2A ANSI((void*, const void*, size_t)); |
508 | #define Bcopy(x,y) memcpy_D2A(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int)) | | 508 | #define Bcopy(x,y) memcpy_D2A(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int)) |
509 | #else /* !NO_STRING_H */ | | 509 | #else /* !NO_STRING_H */ |
510 | #define Bcopy(x,y) memcpy(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int)) | | 510 | #define Bcopy(x,y) memcpy(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int)) |
511 | #endif /* NO_STRING_H */ | | 511 | #endif /* NO_STRING_H */ |
512 | | | 512 | |
513 | #define Balloc __Balloc_D2A | | 513 | #define Balloc __Balloc_D2A |
514 | #define Bfree __Bfree_D2A | | 514 | #define Bfree __Bfree_D2A |
515 | #define ULtoQ __ULtoQ_D2A | | 515 | #define ULtoQ __ULtoQ_D2A |
516 | #define ULtof __ULtof_D2A | | 516 | #define ULtof __ULtof_D2A |
517 | #define ULtod __ULtod_D2A | | 517 | #define ULtod __ULtod_D2A |
518 | #define ULtodd __ULtodd_D2A | | 518 | #define ULtodd __ULtodd_D2A |
519 | #define ULtox __ULtox_D2A | | 519 | #define ULtox __ULtox_D2A |
520 | #define ULtoxL __ULtoxL_D2A | | 520 | #define ULtoxL __ULtoxL_D2A |
521 | #define any_on __any_on_D2A | | 521 | #define any_on __any_on_D2A |
522 | #define b2d __b2d_D2A | | 522 | #define b2d __b2d_D2A |
523 | #define bigtens __bigtens_D2A | | 523 | #define bigtens __bigtens_D2A |
524 | #define cmp __cmp_D2A | | 524 | #define cmp __cmp_D2A |
525 | #define copybits __copybits_D2A | | 525 | #define copybits __copybits_D2A |
526 | #define d2b __d2b_D2A | | 526 | #define d2b __d2b_D2A |
527 | #define decrement __decrement_D2A | | 527 | #define decrement __decrement_D2A |
528 | #define diff __diff_D2A | | 528 | #define diff __diff_D2A |
529 | #define dtoa_result __dtoa_result_D2A | | 529 | #define dtoa_result __dtoa_result_D2A |
530 | #define g__fmt __g__fmt_D2A | | 530 | #define g__fmt __g__fmt_D2A |
531 | #define gethex __gethex_D2A | | 531 | #define gethex __gethex_D2A |
532 | #define hexdig __hexdig_D2A | | 532 | #define hexdig __hexdig_D2A |
533 | #define hexdig_init_D2A __hexdig_init_D2A | | 533 | #define hexdig_init_D2A __hexdig_init_D2A |
534 | #define hexnan __hexnan_D2A | | 534 | #define hexnan __hexnan_D2A |
535 | #define hi0bits __hi0bits_D2A | | 535 | #define hi0bits __hi0bits_D2A |
536 | #define hi0bits_D2A __hi0bits_D2A | | 536 | #define hi0bits_D2A __hi0bits_D2A |
537 | #define i2b __i2b_D2A | | 537 | #define i2b __i2b_D2A |
538 | #define increment __increment_D2A | | 538 | #define increment __increment_D2A |
539 | #define lo0bits __lo0bits_D2A | | 539 | #define lo0bits __lo0bits_D2A |
540 | #define lshift __lshift_D2A | | 540 | #define lshift __lshift_D2A |
541 | #define match __match_D2A | | 541 | #define match __match_D2A |
542 | #define mult __mult_D2A | | 542 | #define mult __mult_D2A |
543 | #define multadd __multadd_D2A | | 543 | #define multadd __multadd_D2A |
544 | #define nrv_alloc __nrv_alloc_D2A | | 544 | #define nrv_alloc __nrv_alloc_D2A |
545 | #define pow5mult __pow5mult_D2A | | 545 | #define pow5mult __pow5mult_D2A |
546 | #define quorem __quorem_D2A | | 546 | #define quorem __quorem_D2A |
547 | #define ratio __ratio_D2A | | 547 | #define ratio __ratio_D2A |
548 | #define rshift __rshift_D2A | | 548 | #define rshift __rshift_D2A |
549 | #define rv_alloc __rv_alloc_D2A | | 549 | #define rv_alloc __rv_alloc_D2A |
550 | #define s2b __s2b_D2A | | 550 | #define s2b __s2b_D2A |
551 | #define set_ones __set_ones_D2A | | 551 | #define set_ones __set_ones_D2A |
552 | #define strcp __strcp_D2A | | 552 | #define strcp __strcp_D2A |
553 | #define strcp_D2A __strcp_D2A | | 553 | #define strcp_D2A __strcp_D2A |
554 | #define strtoIg __strtoIg_D2A | | 554 | #define strtoIg __strtoIg_D2A |
555 | #define sum __sum_D2A | | 555 | #define sum __sum_D2A |
556 | #define tens __tens_D2A | | 556 | #define tens __tens_D2A |
557 | #define tinytens __tinytens_D2A | | 557 | #define tinytens __tinytens_D2A |
558 | #define tinytens __tinytens_D2A | | 558 | #define tinytens __tinytens_D2A |
559 | #define trailz __trailz_D2A | | 559 | #define trailz __trailz_D2A |
560 | #define ulp __ulp_D2A | | 560 | #define ulp __ulp_D2A |
561 | | | 561 | |
562 | extern char *dtoa_result; | | 562 | extern char *dtoa_result; |
563 | extern CONST double bigtens[], tens[], tinytens[]; | | 563 | extern CONST double bigtens[], tens[], tinytens[]; |
564 | extern unsigned char hexdig[]; | | 564 | extern unsigned char hexdig[]; |
565 | | | 565 | |
566 | extern Bigint *Balloc ANSI((int)); | | 566 | extern Bigint *Balloc ANSI((int)); |
567 | extern void Bfree ANSI((Bigint*)); | | 567 | extern void Bfree ANSI((Bigint*)); |
568 | extern void ULtof ANSI((ULong*, ULong*, Long, int)); | | 568 | extern void ULtof ANSI((ULong*, ULong*, Long, int)); |
569 | extern void ULtod ANSI((ULong*, ULong*, Long, int)); | | 569 | extern void ULtod ANSI((ULong*, ULong*, Long, int)); |
570 | extern void ULtodd ANSI((ULong*, ULong*, Long, int)); | | 570 | extern void ULtodd ANSI((ULong*, ULong*, Long, int)); |
571 | extern void ULtoQ ANSI((ULong*, ULong*, Long, int)); | | 571 | extern void ULtoQ ANSI((ULong*, ULong*, Long, int)); |
572 | extern void ULtox ANSI((UShort*, ULong*, Long, int)); | | 572 | extern void ULtox ANSI((UShort*, ULong*, Long, int)); |
573 | extern void ULtoxL ANSI((ULong*, ULong*, Long, int)); | | 573 | extern void ULtoxL ANSI((ULong*, ULong*, Long, int)); |
574 | extern ULong any_on ANSI((Bigint*, int)); | | 574 | extern ULong any_on ANSI((Bigint*, int)); |
575 | extern double b2d ANSI((Bigint*, int*)); | | 575 | extern double b2d ANSI((Bigint*, int*)); |
576 | extern int cmp ANSI((Bigint*, Bigint*)); | | 576 | extern int cmp ANSI((Bigint*, Bigint*)); |
577 | extern void copybits ANSI((ULong*, int, Bigint*)); | | 577 | extern void copybits ANSI((ULong*, int, Bigint*)); |
578 | extern Bigint *d2b ANSI((double, int*, int*)); | | 578 | extern Bigint *d2b ANSI((double, int*, int*)); |
579 | extern int decrement ANSI((Bigint*)); | | 579 | extern int decrement ANSI((Bigint*)); |
580 | extern Bigint *diff ANSI((Bigint*, Bigint*)); | | 580 | extern Bigint *diff ANSI((Bigint*, Bigint*)); |
581 | extern char *dtoa ANSI((double d, int mode, int ndigits, | | 581 | extern char *dtoa ANSI((double d, int mode, int ndigits, |
582 | int *decpt, int *sign, char **rve)); | | 582 | int *decpt, int *sign, char **rve)); |
583 | extern char *g__fmt ANSI((char*, char*, char*, int, ULong)); | | 583 | extern char *g__fmt ANSI((char*, char*, char*, int, ULong)); |
584 | extern int gethex ANSI((CONST char**, CONST FPI*, Long*, Bigint**, int)); | | 584 | extern int gethex ANSI((CONST char**, CONST FPI*, Long*, Bigint**, int)); |
585 | extern void hexdig_init_D2A(Void); | | 585 | extern void hexdig_init_D2A(Void); |
586 | extern int hexnan ANSI((CONST char**, CONST FPI*, ULong*)); | | 586 | extern int hexnan ANSI((CONST char**, CONST FPI*, ULong*)); |
587 | extern int hi0bits_D2A ANSI((ULong)); | | 587 | extern int hi0bits_D2A ANSI((ULong)); |
588 | extern Bigint *i2b ANSI((int)); | | 588 | extern Bigint *i2b ANSI((int)); |
589 | extern Bigint *increment ANSI((Bigint*)); | | 589 | extern Bigint *increment ANSI((Bigint*)); |
590 | extern int lo0bits ANSI((ULong*)); | | 590 | extern int lo0bits ANSI((ULong*)); |
591 | extern Bigint *lshift ANSI((Bigint*, int)); | | 591 | extern Bigint *lshift ANSI((Bigint*, int)); |
592 | extern int match ANSI((CONST char**, CONST char*)); | | 592 | extern int match ANSI((CONST char**, CONST char*)); |
593 | extern Bigint *mult ANSI((Bigint*, Bigint*)); | | 593 | extern Bigint *mult ANSI((Bigint*, Bigint*)); |
594 | extern Bigint *multadd ANSI((Bigint*, int, int)); | | 594 | extern Bigint *multadd ANSI((Bigint*, int, int)); |
595 | extern char *nrv_alloc ANSI((CONST char*, char **, size_t)); | | 595 | extern char *nrv_alloc ANSI((CONST char*, char **, size_t)); |
596 | extern Bigint *pow5mult ANSI((Bigint*, int)); | | 596 | extern Bigint *pow5mult ANSI((Bigint*, int)); |
597 | extern int quorem ANSI((Bigint*, Bigint*)); | | 597 | extern int quorem ANSI((Bigint*, Bigint*)); |
598 | extern double ratio ANSI((Bigint*, Bigint*)); | | 598 | extern double ratio ANSI((Bigint*, Bigint*)); |
599 | extern void rshift ANSI((Bigint*, int)); | | 599 | extern void rshift ANSI((Bigint*, int)); |
600 | extern char *rv_alloc ANSI((size_t)); | | 600 | extern char *rv_alloc ANSI((size_t)); |
601 | extern Bigint *s2b ANSI((CONST char*, int, int, ULong)); | | 601 | extern Bigint *s2b ANSI((CONST char*, int, int, ULong)); |
602 | extern Bigint *set_ones ANSI((Bigint*, int)); | | 602 | extern Bigint *set_ones ANSI((Bigint*, int)); |
603 | extern char *strcp ANSI((char*, const char*)); | | 603 | extern char *strcp ANSI((char*, const char*)); |
604 | extern int strtoIg ANSI((CONST char*, char**, FPI*, Long*, Bigint**, int*)); | | 604 | extern int strtoIg ANSI((CONST char*, char**, FPI*, Long*, Bigint**, int*)); |
605 | extern double strtod ANSI((const char *s00, char **se)); | | 605 | extern double strtod ANSI((const char *s00, char **se)); |
606 | extern Bigint *sum ANSI((Bigint*, Bigint*)); | | 606 | extern Bigint *sum ANSI((Bigint*, Bigint*)); |
607 | extern int trailz ANSI((CONST Bigint*)); | | 607 | extern int trailz ANSI((CONST Bigint*)); |
608 | extern double ulp ANSI((double)); | | 608 | extern double ulp ANSI((double)); |
609 | | | 609 | |
610 | #ifdef __cplusplus | | 610 | #ifdef __cplusplus |
611 | } | | 611 | } |
612 | #endif | | 612 | #endif |
613 | /* | | 613 | /* |
614 | * NAN_WORD0 and NAN_WORD1 are only referenced in strtod.c. Prior to | | 614 | * NAN_WORD0 and NAN_WORD1 are only referenced in strtod.c. Prior to |
615 | * 20050115, they used to be hard-wired here (to 0x7ff80000 and 0, | | 615 | * 20050115, they used to be hard-wired here (to 0x7ff80000 and 0, |
616 | * respectively), but now are determined by compiling and running | | 616 | * respectively), but now are determined by compiling and running |
617 | * qnan.c to generate gd_qnan.h, which specifies d_QNAN0 and d_QNAN1. | | 617 | * qnan.c to generate gd_qnan.h, which specifies d_QNAN0 and d_QNAN1. |
618 | * Formerly gdtoaimp.h recommended supplying suitable -DNAN_WORD0=... | | 618 | * Formerly gdtoaimp.h recommended supplying suitable -DNAN_WORD0=... |
619 | * and -DNAN_WORD1=... values if necessary. This should still work. | | 619 | * and -DNAN_WORD1=... values if necessary. This should still work. |
620 | * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.) | | 620 | * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.) |
621 | */ | | 621 | */ |
622 | #ifdef IEEE_Arith | | 622 | #ifdef IEEE_Arith |
623 | #ifdef IEEE_BIG_ENDIAN | | 623 | #ifdef IEEE_BIG_ENDIAN |
624 | #define _0 0 | | 624 | #define _0 0 |
625 | #define _1 1 | | 625 | #define _1 1 |
626 | #ifndef NAN_WORD0 | | 626 | #ifndef NAN_WORD0 |
627 | #define NAN_WORD0 d_QNAN0 | | 627 | #define NAN_WORD0 d_QNAN0 |
628 | #endif | | 628 | #endif |
629 | #ifndef NAN_WORD1 | | 629 | #ifndef NAN_WORD1 |
630 | #define NAN_WORD1 d_QNAN1 | | 630 | #define NAN_WORD1 d_QNAN1 |
631 | #endif | | 631 | #endif |
632 | #else | | 632 | #else |
633 | #define _0 1 | | 633 | #define _0 1 |
634 | #define _1 0 | | 634 | #define _1 0 |
635 | #ifndef NAN_WORD0 | | 635 | #ifndef NAN_WORD0 |
636 | #define NAN_WORD0 d_QNAN1 | | 636 | #define NAN_WORD0 d_QNAN1 |
637 | #endif | | 637 | #endif |
638 | #ifndef NAN_WORD1 | | 638 | #ifndef NAN_WORD1 |
639 | #define NAN_WORD1 d_QNAN0 | | 639 | #define NAN_WORD1 d_QNAN0 |
640 | #endif | | 640 | #endif |
641 | #endif | | 641 | #endif |
642 | #else | | 642 | #else |
643 | #undef INFNAN_CHECK | | 643 | #undef INFNAN_CHECK |
644 | #endif | | 644 | #endif |
645 | | | 645 | |
646 | #undef SI | | 646 | #undef SI |
647 | #ifdef Sudden_Underflow | | 647 | #ifdef Sudden_Underflow |
648 | #define SI 1 | | 648 | #define SI 1 |
649 | #else | | 649 | #else |
650 | #define SI 0 | | 650 | #define SI 0 |
651 | #endif | | 651 | #endif |
652 | | | 652 | |
653 | #endif /* GDTOAIMP_H_INCLUDED */ | | 653 | #endif /* GDTOAIMP_H_INCLUDED */ |