README revision 1.1 1 1.1 kleink $NetBSD: README,v 1.1 2006/01/25 15:18:40 kleink Exp $
2 1.1 kleink
3 1.1 kleink This directory contains source for a library of binary -> decimal
4 1.1 kleink and decimal -> binary conversion routines, for single-, double-,
5 1.1 kleink and extended-precision IEEE binary floating-point arithmetic, and
6 1.1 kleink other IEEE-like binary floating-point, including "double double",
7 1.1 kleink as in
8 1.1 kleink
9 1.1 kleink T. J. Dekker, "A Floating-Point Technique for Extending the
10 1.1 kleink Available Precision", Numer. Math. 18 (1971), pp. 224-242
11 1.1 kleink
12 1.1 kleink and
13 1.1 kleink
14 1.1 kleink "Inside Macintosh: PowerPC Numerics", Addison-Wesley, 1994
15 1.1 kleink
16 1.1 kleink The conversion routines use double-precision floating-point arithmetic
17 1.1 kleink and, where necessary, high precision integer arithmetic. The routines
18 1.1 kleink are generalizations of the strtod and dtoa routines described in
19 1.1 kleink
20 1.1 kleink David M. Gay, "Correctly Rounded Binary-Decimal and
21 1.1 kleink Decimal-Binary Conversions", Numerical Analysis Manuscript
22 1.1 kleink No. 90-10, Bell Labs, Murray Hill, 1990;
23 1.1 kleink http://cm.bell-labs.com/cm/cs/what/ampl/REFS/rounding.ps.gz
24 1.1 kleink
25 1.1 kleink (based in part on papers by Clinger and Steele & White: see the
26 1.1 kleink references in the above paper).
27 1.1 kleink
28 1.1 kleink The present conversion routines should be able to use any of IEEE binary,
29 1.1 kleink VAX, or IBM-mainframe double-precision arithmetic internally, but I (dmg)
30 1.1 kleink have so far only had a chance to test them with IEEE double precision
31 1.1 kleink arithmetic.
32 1.1 kleink
33 1.1 kleink The core conversion routines are strtodg for decimal -> binary conversions
34 1.1 kleink and gdtoa for binary -> decimal conversions. These routines operate
35 1.1 kleink on arrays of unsigned 32-bit integers of type ULong, a signed 32-bit
36 1.1 kleink exponent of type Long, and arithmetic characteristics described in
37 1.1 kleink struct FPI; FPI, Long, and ULong are defined in gdtoa.h. File arith.h
38 1.1 kleink is supposed to provide #defines that cause gdtoa.h to define its
39 1.1 kleink types correctly. File arithchk.c is source for a program that
40 1.1 kleink generates a suitable arith.h on all systems where I've been able to
41 1.1 kleink test it.
42 1.1 kleink
43 1.1 kleink The core conversion routines are meant to be called by helper routines
44 1.1 kleink that know details of the particular binary arithmetic of interest and
45 1.1 kleink convert. The present directory provides helper routines for 5 variants
46 1.1 kleink of IEEE binary floating-point arithmetic, each indicated by one or
47 1.1 kleink two letters:
48 1.1 kleink
49 1.1 kleink f IEEE single precision
50 1.1 kleink d IEEE double precision
51 1.1 kleink x IEEE extended precision, as on Intel 80x87
52 1.1 kleink and software emulations of Motorola 68xxx chips
53 1.1 kleink that do not pad the way the 68xxx does, but
54 1.1 kleink only store 80 bits
55 1.1 kleink xL IEEE extended precision, as on Motorola 68xxx chips
56 1.1 kleink Q quad precision, as on Sun Sparc chips
57 1.1 kleink dd double double, pairs of IEEE double numbers
58 1.1 kleink whose sum is the desired value
59 1.1 kleink
60 1.1 kleink For decimal -> binary conversions, there are three families of
61 1.1 kleink helper routines: one for round-nearest:
62 1.1 kleink
63 1.1 kleink strtof
64 1.1 kleink strtod
65 1.1 kleink strtodd
66 1.1 kleink strtopd
67 1.1 kleink strtopf
68 1.1 kleink strtopx
69 1.1 kleink strtopxL
70 1.1 kleink strtopQ
71 1.1 kleink
72 1.1 kleink one with rounding direction specified:
73 1.1 kleink
74 1.1 kleink strtorf
75 1.1 kleink strtord
76 1.1 kleink strtordd
77 1.1 kleink strtorx
78 1.1 kleink strtorxL
79 1.1 kleink strtorQ
80 1.1 kleink
81 1.1 kleink and one for computing an interval (at most one bit wide) that contains
82 1.1 kleink the decimal number:
83 1.1 kleink
84 1.1 kleink strtoIf
85 1.1 kleink strtoId
86 1.1 kleink strtoIdd
87 1.1 kleink strtoIx
88 1.1 kleink strtoIxL
89 1.1 kleink strtoIQ
90 1.1 kleink
91 1.1 kleink The latter call strtoIg, which makes one call on strtodg and adjusts
92 1.1 kleink the result to provide the desired interval. On systems where native
93 1.1 kleink arithmetic can easily make one-ulp adjustments on values in the
94 1.1 kleink desired floating-point format, it might be more efficient to use the
95 1.1 kleink native arithmetic. Routine strtodI is a variant of strtoId that
96 1.1 kleink illustrates one way to do this for IEEE binary double-precision
97 1.1 kleink arithmetic -- but whether this is more efficient remains to be seen.
98 1.1 kleink
99 1.1 kleink Functions strtod and strtof have "natural" return types, float and
100 1.1 kleink double -- strtod is specified by the C standard, and strtof appears
101 1.1 kleink in the stdlib.h of some systems, such as (at least some) Linux systems.
102 1.1 kleink The other functions write their results to their final argument(s):
103 1.1 kleink to the final two argument for the strtoI... (interval) functions,
104 1.1 kleink and to the final argument for the others (strtop... and strtor...).
105 1.1 kleink Where possible, these arguments have "natural" return types (double*
106 1.1 kleink or float*), to permit at least some type checking. In reality, they
107 1.1 kleink are viewed as arrays of ULong (or, for the "x" functions, UShort)
108 1.1 kleink values. On systems where long double is the appropriate type, one can
109 1.1 kleink pass long double* final argument(s) to these routines. The int value
110 1.1 kleink that these routines return is the return value from the call they make
111 1.1 kleink on strtodg; see the enum of possible return values in gdtoa.h.
112 1.1 kleink
113 1.1 kleink Source files g_ddfmt.c, misc.c, smisc.c, strtod.c, strtodg.c, and ulp.c
114 1.1 kleink should use true IEEE double arithmetic (not, e.g., double extended),
115 1.1 kleink at least for storing (and viewing the bits of) the variables declared
116 1.1 kleink "double" within them.
117 1.1 kleink
118 1.1 kleink One detail indicated in struct FPI is whether the target binary
119 1.1 kleink arithmetic departs from the IEEE standard by flushing denormalized
120 1.1 kleink numbers to 0. On systems that do this, the helper routines for
121 1.1 kleink conversion to double-double format (when compiled with
122 1.1 kleink Sudden_Underflow #defined) penalize the bottom of the exponent
123 1.1 kleink range so that they return a nonzero result only when the least
124 1.1 kleink significant bit of the less significant member of the pair of
125 1.1 kleink double values returned can be expressed as a normalized double
126 1.1 kleink value. An alternative would be to drop to 53-bit precision near
127 1.1 kleink the bottom of the exponent range. To get correct rounding, this
128 1.1 kleink would (in general) require two calls on strtodg (one specifying
129 1.1 kleink 126-bit arithmetic, then, if necessary, one specifying 53-bit
130 1.1 kleink arithmetic).
131 1.1 kleink
132 1.1 kleink By default, the core routine strtodg and strtod set errno to ERANGE
133 1.1 kleink if the result overflows to +Infinity or underflows to 0. Compile
134 1.1 kleink these routines with NO_ERRNO #defined to inhibit errno assignments.
135 1.1 kleink
136 1.1 kleink Routine strtod is based on netlib's "dtoa.c from fp", and
137 1.1 kleink (f = strtod(s,se)) is more efficient for some conversions than, say,
138 1.1 kleink strtord(s,se,1,&f). Parts of strtod require true IEEE double
139 1.1 kleink arithmetic with the default rounding mode (round-to-nearest) and, on
140 1.1 kleink systems with IEEE extended-precision registers, double-precision
141 1.1 kleink (53-bit) rounding precision. If the machine uses (the equivalent of)
142 1.1 kleink Intel 80x87 arithmetic, the call
143 1.1 kleink _control87(PC_53, MCW_PC);
144 1.1 kleink does this with many compilers. Whether this or another call is
145 1.1 kleink appropriate depends on the compiler; for this to work, it may be
146 1.1 kleink necessary to #include "float.h" or another system-dependent header
147 1.1 kleink file.
148 1.1 kleink
149 1.1 kleink Source file strtodnrp.c gives a strtod that does not require 53-bit
150 1.1 kleink rounding precision on systems (such as Intel IA32 systems) that may
151 1.1 kleink suffer double rounding due to use of extended-precision registers.
152 1.1 kleink For some conversions this variant of strtod is less efficient than the
153 1.1 kleink one in strtod.c when the latter is run with 53-bit rounding precision.
154 1.1 kleink
155 1.1 kleink The values that the strto* routines return for NaNs are determined by
156 1.1 kleink gd_qnan.h, which the makefile generates by running the program whose
157 1.1 kleink source is qnan.c. Note that the rules for distinguishing signaling
158 1.1 kleink from quiet NaNs are system-dependent. For cross-compilation, you need
159 1.1 kleink to determine arith.h and gd_qnan.h suitably, e.g., using the
160 1.1 kleink arithmetic of the target machine.
161 1.1 kleink
162 1.1 kleink C99's hexadecimal floating-point constants are recognized by the
163 1.1 kleink strto* routines (but this feature has not yet been heavily tested).
164 1.1 kleink Compiling with NO_HEX_FP #defined disables this feature.
165 1.1 kleink
166 1.1 kleink When compiled with -DINFNAN_CHECK, the strto* routines recognize C99's
167 1.1 kleink NaN and Infinity syntax. Moreover, unless No_Hex_NaN is #defined, the
168 1.1 kleink strto* routines also recognize C99's NaN(...) syntax: they accept
169 1.1 kleink (case insensitively) strings of the form NaN(x), where x is a string
170 1.1 kleink of hexadecimal digits and spaces; if there is only one string of
171 1.1 kleink hexadecimal digits, it is taken for the fraction bits of the resulting
172 1.1 kleink NaN; if there are two or more strings of hexadecimal digits, each
173 1.1 kleink string is assigned to the next available sequence of 32-bit words of
174 1.1 kleink fractions bits (starting with the most significant), right-aligned in
175 1.1 kleink each sequence.
176 1.1 kleink
177 1.1 kleink For binary -> decimal conversions, I've provided just one family
178 1.1 kleink of helper routines:
179 1.1 kleink
180 1.1 kleink g_ffmt
181 1.1 kleink g_dfmt
182 1.1 kleink g_ddfmt
183 1.1 kleink g_xfmt
184 1.1 kleink g_xLfmt
185 1.1 kleink g_Qfmt
186 1.1 kleink
187 1.1 kleink which do a "%g" style conversion either to a specified number of decimal
188 1.1 kleink places (if their ndig argument is positive), or to the shortest
189 1.1 kleink decimal string that rounds to the given binary floating-point value
190 1.1 kleink (if ndig <= 0). They write into a buffer supplied as an argument
191 1.1 kleink and return either a pointer to the end of the string (a null character)
192 1.1 kleink in the buffer, if the buffer was long enough, or 0. Other forms of
193 1.1 kleink conversion are easily done with the help of gdtoa(), such as %e or %f
194 1.1 kleink style and conversions with direction of rounding specified (so that, if
195 1.1 kleink desired, the decimal value is either >= or <= the binary value).
196 1.1 kleink
197 1.1 kleink For an example of more general conversions based on dtoa(), see
198 1.1 kleink netlib's "printf.c from ampl/solvers".
199 1.1 kleink
200 1.1 kleink For double-double -> decimal, g_ddfmt() assumes IEEE-like arithmetic
201 1.1 kleink of precision max(126, #bits(input)) bits, where #bits(input) is the
202 1.1 kleink number of mantissa bits needed to represent the sum of the two double
203 1.1 kleink values in the input.
204 1.1 kleink
205 1.1 kleink The makefile creates a library, gdtoa.a. To use the helper
206 1.1 kleink routines, a program only needs to include gdtoa.h. All the
207 1.1 kleink source files for gdtoa.a include a more extensive gdtoaimp.h;
208 1.1 kleink among other things, gdtoaimp.h has #defines that make "internal"
209 1.1 kleink names end in _D2A. To make a "system" library, one could modify
210 1.1 kleink these #defines to make the names start with __.
211 1.1 kleink
212 1.1 kleink Various comments about possible #defines appear in gdtoaimp.h,
213 1.1 kleink but for most purposes, arith.h should set suitable #defines.
214 1.1 kleink
215 1.1 kleink Systems with preemptive scheduling of multiple threads require some
216 1.1 kleink manual intervention. On such systems, it's necessary to compile
217 1.1 kleink dmisc.c, dtoa.c gdota.c, and misc.c with MULTIPLE_THREADS #defined,
218 1.1 kleink and to provide (or suitably #define) two locks, acquired by
219 1.1 kleink ACQUIRE_DTOA_LOCK(n) and freed by FREE_DTOA_LOCK(n) for n = 0 or 1.
220 1.1 kleink (The second lock, accessed in pow5mult, ensures lazy evaluation of
221 1.1 kleink only one copy of high powers of 5; omitting this lock would introduce
222 1.1 kleink a small probability of wasting memory, but would otherwise be harmless.)
223 1.1 kleink Routines that call dtoa or gdtoa directly must also invoke freedtoa(s)
224 1.1 kleink to free the value s returned by dtoa or gdtoa. It's OK to do so whether
225 1.1 kleink or not MULTIPLE_THREADS is #defined, and the helper g_*fmt routines
226 1.1 kleink listed above all do this indirectly (in gfmt_D2A(), which they all call).
227 1.1 kleink
228 1.1 kleink By default, there is a private pool of memory of length 2000 bytes
229 1.1 kleink for intermediate quantities, and MALLOC (see gdtoaimp.h) is called only
230 1.1 kleink if the private pool does not suffice. 2000 is large enough that MALLOC
231 1.1 kleink is called only under very unusual circumstances (decimal -> binary
232 1.1 kleink conversion of very long strings) for conversions to and from double
233 1.1 kleink precision. For systems with preemptively scheduled multiple threads
234 1.1 kleink or for conversions to extended or quad, it may be appropriate to
235 1.1 kleink #define PRIVATE_MEM nnnn, where nnnn is a suitable value > 2000.
236 1.1 kleink For extended and quad precisions, -DPRIVATE_MEM=20000 is probably
237 1.1 kleink plenty even for many digits at the ends of the exponent range.
238 1.1 kleink Use of the private pool avoids some overhead.
239 1.1 kleink
240 1.1 kleink Directory test provides some test routines. See its README.
241 1.1 kleink I've also tested this stuff (except double double conversions)
242 1.1 kleink with Vern Paxson's testbase program: see
243 1.1 kleink
244 1.1 kleink V. Paxson and W. Kahan, "A Program for Testing IEEE Binary-Decimal
245 1.1 kleink Conversion", manuscript, May 1991,
246 1.1 kleink ftp://ftp.ee.lbl.gov/testbase-report.ps.Z .
247 1.1 kleink
248 1.1 kleink (The same ftp directory has source for testbase.)
249 1.1 kleink
250 1.1 kleink Some system-dependent additions to CFLAGS in the makefile:
251 1.1 kleink
252 1.1 kleink HU-UX: -Aa -Ae
253 1.1 kleink OSF (DEC Unix): -ieee_with_no_inexact
254 1.1 kleink SunOS 4.1x: -DKR_headers -DBad_float_h
255 1.1 kleink
256 1.1 kleink If you want to put this stuff into a shared library and your
257 1.1 kleink operating system requires export lists for shared libraries,
258 1.1 kleink the following would be an appropriate export list:
259 1.1 kleink
260 1.1 kleink dtoa
261 1.1 kleink freedtoa
262 1.1 kleink g_Qfmt
263 1.1 kleink g_ddfmt
264 1.1 kleink g_dfmt
265 1.1 kleink g_ffmt
266 1.1 kleink g_xLfmt
267 1.1 kleink g_xfmt
268 1.1 kleink gdtoa
269 1.1 kleink strtoIQ
270 1.1 kleink strtoId
271 1.1 kleink strtoIdd
272 1.1 kleink strtoIf
273 1.1 kleink strtoIx
274 1.1 kleink strtoIxL
275 1.1 kleink strtod
276 1.1 kleink strtodI
277 1.1 kleink strtodg
278 1.1 kleink strtof
279 1.1 kleink strtopQ
280 1.1 kleink strtopd
281 1.1 kleink strtopdd
282 1.1 kleink strtopf
283 1.1 kleink strtopx
284 1.1 kleink strtopxL
285 1.1 kleink strtorQ
286 1.1 kleink strtord
287 1.1 kleink strtordd
288 1.1 kleink strtorf
289 1.1 kleink strtorx
290 1.1 kleink strtorxL
291 1.1 kleink
292 1.1 kleink When time permits, I (dmg) hope to write in more detail about the
293 1.1 kleink present conversion routines; for now, this README file must suffice.
294 1.1 kleink Meanwhile, if you wish to write helper functions for other kinds of
295 1.1 kleink IEEE-like arithmetic, some explanation of struct FPI and the bits
296 1.1 kleink array may be helpful. Both gdtoa and strtodg operate on a bits array
297 1.1 kleink described by FPI *fpi. The bits array is of type ULong, a 32-bit
298 1.1 kleink unsigned integer type. Floating-point numbers have fpi->nbits bits,
299 1.1 kleink with the least significant 32 bits in bits[0], the next 32 bits in
300 1.1 kleink bits[1], etc. These numbers are regarded as integers multiplied by
301 1.1 kleink 2^e (i.e., 2 to the power of the exponent e), where e is the second
302 1.1 kleink argument (be) to gdtoa and is stored in *exp by strtodg. The minimum
303 1.1 kleink and maximum exponent values fpi->emin and fpi->emax for normalized
304 1.1 kleink floating-point numbers reflect this arrangement. For example, the
305 1.1 kleink P754 standard for binary IEEE arithmetic specifies doubles as having
306 1.1 kleink 53 bits, with normalized values of the form 1.xxxxx... times 2^(b-1023),
307 1.1 kleink with 52 bits (the x's) and the biased exponent b represented explicitly;
308 1.1 kleink b is an unsigned integer in the range 1 <= b <= 2046 for normalized
309 1.1 kleink finite doubles, b = 0 for denormals, and b = 2047 for Infinities and NaNs.
310 1.1 kleink To turn an IEEE double into the representation used by strtodg and gdtoa,
311 1.1 kleink we multiply 1.xxxx... by 2^52 (to make it an integer) and reduce the
312 1.1 kleink exponent e = (b-1023) by 52:
313 1.1 kleink
314 1.1 kleink fpi->emin = 1 - 1023 - 52
315 1.1 kleink fpi->emax = 1046 - 1023 - 52
316 1.1 kleink
317 1.1 kleink In various wrappers for IEEE double, we actually write -53 + 1 rather
318 1.1 kleink than -52, to emphasize that there are 53 bits including one implicit bit.
319 1.1 kleink Field fpi->rounding indicates the desired rounding direction, with
320 1.1 kleink possible values
321 1.1 kleink FPI_Round_zero = toward 0,
322 1.1 kleink FPI_Round_near = unbiased rounding -- the IEEE default,
323 1.1 kleink FPI_Round_up = toward +Infinity, and
324 1.1 kleink FPI_Round_down = toward -Infinity
325 1.1 kleink given in gdtoa.h.
326 1.1 kleink
327 1.1 kleink Field fpi->sudden_underflow indicates whether strtodg should return
328 1.1 kleink denormals or flush them to zero. Normal floating-point numbers have
329 1.1 kleink bit fpi->nbits in the bits array on. Denormals have it off, with
330 1.1 kleink exponent = fpi->emin. Strtodg provides distinct return values for normals
331 1.1 kleink and denormals; see gdtoa.h.
332 1.1 kleink
333 1.1 kleink Compiling g__fmt.c, strtod.c, and strtodg.c with -DUSE_LOCALE causes
334 1.1 kleink the decimal-point character to be taken from the current locale; otherwise
335 1.1 kleink it is '.'.
336 1.1 kleink
337 1.1 kleink Please send comments to David M. Gay (dmg at acm dot org, with " at "
338 1.1 kleink changed at "@" and " dot " changed to ".").
339