annotate lib/ftoastr.h @ 112335:d3c691ea0839

Merge: Automate syncing from gnulib.
author Paul Eggert <eggert@cs.ucla.edu>
date Mon, 17 Jan 2011 12:17:27 -0800
parents f31011c088d9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
112305
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
1 /* floating point to accurate string
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
2
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
3 Copyright (C) 2010-2011 Free Software Foundation, Inc.
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
4
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
5 This program is free software: you can redistribute it and/or modify
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
7 the Free Software Foundation; either version 3 of the License, or
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
8 (at your option) any later version.
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
9
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
13 GNU General Public License for more details.
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
14
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
17
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
18 /* Written by Paul Eggert. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
19
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
20 #ifndef _GL_FTOASTR_H
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
21
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
22 #include "intprops.h"
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
23 #include <float.h>
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
24 #include <stddef.h>
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
25
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
26 /* Store into BUF (of size BUFSIZE) an accurate minimal-precision
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
27 string representation of a floating point number. FLAGS affect the
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
28 formatting of the number. Pad the output string with spaces as
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
29 necessary to width WIDTH bytes, in the style of printf. WIDTH must
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
30 be nonnegative. X is the floating-point number to be converted.
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
31
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
32 Return the number of bytes stored into BUF, not counting the
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
33 terminating null. However, do not overrun BUF: if BUF is too
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
34 small, return a fairly tight (but not necessarily exact) upper
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
35 bound on the value that would have been returned if BUF had been
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
36 big enough. If SIZE is zero, BUF may be a null pointer. On error
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
37 (e.g., returned value would exceed INT_MAX), return -1 and set
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
38 errno.
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
39
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
40 Example:
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
41
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
42 char buf[DBL_BUFSIZE_BOUND];
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
43 int r = dtoastr (buf, sizeof buf, 0, 0, 0.1);
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
44
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
45 In the C locale, this sets R to 3 and stores "0.1" into BUF. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
46
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
47 int ftoastr (char *buf, size_t bufsize, int flags, int width, float x);
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
48 int dtoastr (char *buf, size_t bufsize, int flags, int width, double x);
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
49 int ldtoastr (char *buf, size_t bufsize, int flags, int width, long double x);
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
50
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
51 /* Flag values for ftoastr etc. These can be ORed together. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
52 enum
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
53 {
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
54 /* Left justify within the width; the default is right justification. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
55 FTOASTR_LEFT_JUSTIFY = 1,
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
56
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
57 /* Output "+" before positive numbers; the default outputs nothing. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
58 FTOASTR_ALWAYS_SIGNED = 2,
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
59
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
60 /* Output " " before positive numbers; ignored if
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
61 FTOASTER_ALWAYS_SIGNED is also given. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
62 FTOASTR_SPACE_POSITIVE = 4,
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
63
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
64 /* Pad with zeros instead of spaces; ignored if FTOASTR_LEFT_JUSTIFY
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
65 is also given. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
66 FTOASTR_ZERO_PAD = 8,
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
67
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
68 /* Use 'E' instead of 'e' before the exponent. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
69 FTOASTR_UPPER_E = 16
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
70 };
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
71
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
72
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
73 /* _GL_FLT_PREC_BOUND is an upper bound on the precision needed to
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
74 represent a float value without losing information. Likewise for
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
75 _GL_DBL_PREC_BOUND and double, and _GL_LDBL_PREC_BOUND and long double. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
76
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
77 #if FLT_RADIX == 10 /* decimal floating point */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
78 enum { _GL_FLT_PREC_BOUND = FLT_MANT_DIG };
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
79 enum { _GL_DBL_PREC_BOUND = DBL_MANT_DIG };
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
80 enum { _GL_LDBL_PREC_BOUND = LDBL_MANT_DIG };
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
81 #else
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
82
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
83 /* An upper bound on the number of bits needed to represent a single
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
84 digit in a floating-point fraction. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
85 # if FLT_RADIX == 2 /* IEEE 754 floating point, VAX floating point, etc. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
86 # define _GL_FLOAT_DIG_BITS_BOUND 1
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
87 # elif FLT_RADIX <= 16 /* IBM hex floating point has FLT_RADIX == 16. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
88 # define _GL_FLOAT_DIG_BITS_BOUND 4
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
89 # else /* no machine is this bad, but let's be complete */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
90 # define _GL_FLOAT_DIG_BITS_BOUND (CHAR_BIT * (int) sizeof (int) - 1)
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
91 # endif
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
92
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
93 /* An upper bound on the number of decimal digits needed to represent
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
94 a floating point number accurately, assuming a fraction contains
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
95 DIG digits. For why the "+ 1" is needed, see "Binary to Decimal
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
96 Conversion" in David Goldberg's paper "What Every Computer
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
97 Scientist Should Know About Floating-Point Arithmetic"
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
98 <http://docs.sun.com/source/806-3568/ncg_goldberg.html>. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
99 # define _GL_FLOAT_PREC_BOUND(dig) \
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
100 (INT_BITS_STRLEN_BOUND ((dig) * _GL_FLOAT_DIG_BITS_BOUND) + 1)
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
101
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
102 enum { _GL_FLT_PREC_BOUND = _GL_FLOAT_PREC_BOUND ( FLT_MANT_DIG) };
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
103 enum { _GL_DBL_PREC_BOUND = _GL_FLOAT_PREC_BOUND ( DBL_MANT_DIG) };
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
104 enum { _GL_LDBL_PREC_BOUND = _GL_FLOAT_PREC_BOUND (LDBL_MANT_DIG) };
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
105 #endif
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
106
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
107
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
108 /* Bound on the number of bytes printed for an exponent in the range
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
109 MIN..MAX, where MIN < 0 < MAX; printf always prints a sign and at
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
110 least 2 digits. Although the maximum known exponent is 4932 for
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
111 IEEE 754 binary128, support tight bounds for exponents up to a
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
112 million, just in case. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
113 #define _GL_FLOAT_EXPONENT_STRLEN_BOUND(min, max) \
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
114 ( -100 < (min) && (max) < 100 ? 3 \
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
115 : -1000 < (min) && (max) < 1000 ? 4 \
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
116 : -10000 < (min) && (max) < 10000 ? 5 \
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
117 : -100000 < (min) && (max) < 100000 ? 6 \
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
118 : -1000000 < (min) && (max) < 1000000 ? 7 \
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
119 : INT_STRLEN_BOUND (int) /* not a tight bound */)
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
120
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
121 /* A reasonably tight bound on the length of a type-T floating value
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
122 formatted with ftoastr etc. Room is needed for sign, fraction
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
123 digits, decimal point, "e", and exponent. POINTLEN should be a
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
124 reasonably tight bound on the string length of the decimal
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
125 point. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
126 #define _GL_FLOAT_STRLEN_BOUND_L(t, pointlen) \
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
127 (1 + _GL_##t##_PREC_BOUND + pointlen + 1 \
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
128 + _GL_FLOAT_EXPONENT_STRLEN_BOUND (t##_MIN_10_EXP, t##_MAX_10_EXP))
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
129 #define FLT_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L ( FLT, pointlen)
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
130 #define DBL_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L ( DBL, pointlen)
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
131 #define LDBL_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L (LDBL, pointlen)
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
132
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
133 /* Looser bounds that are locale-independent and are integral constant
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
134 expressions. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
135 #define FLT_STRLEN_BOUND FLT_STRLEN_BOUND_L (MB_LEN_MAX)
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
136 #define DBL_STRLEN_BOUND DBL_STRLEN_BOUND_L (MB_LEN_MAX)
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
137 #define LDBL_STRLEN_BOUND LDBL_STRLEN_BOUND_L (MB_LEN_MAX)
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
138
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
139 /* Looser, locale-independent bounds that include the trailing null byte. */
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
140 #define FLT_BUFSIZE_BOUND ( FLT_STRLEN_BOUND + 1)
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
141 #define DBL_BUFSIZE_BOUND ( DBL_STRLEN_BOUND + 1)
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
142 #define LDBL_BUFSIZE_BOUND (LDBL_STRLEN_BOUND + 1)
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
143
f31011c088d9 Regenerate.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
144 #endif /* _GL_FTOASTR_H */