New module 'frexpf'.
[gnulib.git] / lib / math.in.h
1 /* A GNU-like <math.h>.
2
3    Copyright (C) 2002-2003, 2007-2011 Free Software Foundation, Inc.
4
5    This program is free software: you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17
18 #ifndef _@GUARD_PREFIX@_MATH_H
19
20 #if __GNUC__ >= 3
21 @PRAGMA_SYSTEM_HEADER@
22 #endif
23 @PRAGMA_COLUMNS@
24
25 /* The include_next requires a split double-inclusion guard.  */
26 #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
27
28 #ifndef _@GUARD_PREFIX@_MATH_H
29 #define _@GUARD_PREFIX@_MATH_H
30
31
32 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
33
34 /* The definition of _GL_ARG_NONNULL is copied here.  */
35
36 /* The definition of _GL_WARN_ON_USE is copied here.  */
37
38 /* Helper macros to define a portability warning for the
39    classification macro FUNC called with VALUE.  POSIX declares the
40    classification macros with an argument of real-floating (that is,
41    one of float, double, or long double).  */
42 #define _GL_WARN_REAL_FLOATING_DECL(func) \
43 static inline int                                                   \
44 rpl_ ## func ## f (float f)                                         \
45 {                                                                   \
46   return func (f);                                                  \
47 }                                                                   \
48 static inline int                                                   \
49 rpl_ ## func ## d (double d)                                        \
50 {                                                                   \
51   return func (d);                                                  \
52 }                                                                   \
53 static inline int                                                   \
54 rpl_ ## func ## l (long double l)                                   \
55 {                                                                   \
56   return func (l);                                                  \
57 }                                                                   \
58 _GL_WARN_ON_USE (rpl_ ## func ## f, #func " is unportable - "       \
59                  "use gnulib module " #func " for portability");    \
60 _GL_WARN_ON_USE (rpl_ ## func ## d, #func " is unportable - "       \
61                  "use gnulib module " #func " for portability");    \
62 _GL_WARN_ON_USE (rpl_ ## func ## l, #func " is unportable - "       \
63                  "use gnulib module " #func " for portability")
64 #define _GL_WARN_REAL_FLOATING_IMPL(func, value) \
65   (sizeof (value) == sizeof (float) ? rpl_ ## func ## f (value)     \
66    : sizeof (value) == sizeof (double) ? rpl_ ## func ## d (value)  \
67    : rpl_ ## func ## l (value))
68
69
70 #if @REPLACE_ITOLD@
71 /* Pull in a function that fixes the 'int' to 'long double' conversion
72    of glibc 2.7.  */
73 _GL_EXTERN_C void _Qp_itoq (long double *, int);
74 static void (*_gl_math_fix_itold) (long double *, int) = _Qp_itoq;
75 #endif
76
77
78 /* POSIX allows platforms that don't support NAN.  But all major
79    machines in the past 15 years have supported something close to
80    IEEE NaN, so we define this unconditionally.  We also must define
81    it on platforms like Solaris 10, where NAN is present but defined
82    as a function pointer rather than a floating point constant.  */
83 #if !defined NAN || @REPLACE_NAN@
84 # if !GNULIB_defined_NAN
85 #  undef NAN
86   /* The Compaq (ex-DEC) C 6.4 compiler and the Microsoft MSVC 9 compiler
87      choke on the expression 0.0 / 0.0.  */
88 #  if defined __DECC || defined _MSC_VER
89 static float
90 _NaN ()
91 {
92   static float zero = 0.0f;
93   return zero / zero;
94 }
95 #   define NAN (_NaN())
96 #  else
97 #   define NAN (0.0f / 0.0f)
98 #  endif
99 #  define GNULIB_defined_NAN 1
100 # endif
101 #endif
102
103 /* Solaris 10 defines HUGE_VAL, but as a function pointer rather
104    than a floating point constant.  */
105 #if @REPLACE_HUGE_VAL@
106 # undef HUGE_VAL
107 # define HUGE_VAL (1.0 / 0.0)
108 #endif
109
110
111 #if @GNULIB_ACOSL@
112 # if !@HAVE_ACOSL@ || !@HAVE_DECL_ACOSL@
113 _GL_FUNCDECL_SYS (acosl, long double, (long double x));
114 # endif
115 _GL_CXXALIAS_SYS (acosl, long double, (long double x));
116 _GL_CXXALIASWARN (acosl);
117 #elif defined GNULIB_POSIXCHECK
118 # undef acosl
119 # if HAVE_RAW_DECL_ACOSL
120 _GL_WARN_ON_USE (acosl, "acosl is unportable - "
121                  "use gnulib module mathl for portability");
122 # endif
123 #endif
124
125
126 #if @GNULIB_ASINL@
127 # if !@HAVE_ASINL@ || !@HAVE_DECL_ASINL@
128 _GL_FUNCDECL_SYS (asinl, long double, (long double x));
129 # endif
130 _GL_CXXALIAS_SYS (asinl, long double, (long double x));
131 _GL_CXXALIASWARN (asinl);
132 #elif defined GNULIB_POSIXCHECK
133 # undef asinl
134 # if HAVE_RAW_DECL_ASINL
135 _GL_WARN_ON_USE (asinl, "asinl is unportable - "
136                  "use gnulib module mathl for portability");
137 # endif
138 #endif
139
140
141 #if @GNULIB_ATANL@
142 # if !@HAVE_ATANL@ || !@HAVE_DECL_ATANL@
143 _GL_FUNCDECL_SYS (atanl, long double, (long double x));
144 # endif
145 _GL_CXXALIAS_SYS (atanl, long double, (long double x));
146 _GL_CXXALIASWARN (atanl);
147 #elif defined GNULIB_POSIXCHECK
148 # undef atanl
149 # if HAVE_RAW_DECL_ATANL
150 _GL_WARN_ON_USE (atanl, "atanl is unportable - "
151                  "use gnulib module mathl for portability");
152 # endif
153 #endif
154
155
156 #if @GNULIB_CEILF@
157 # if @REPLACE_CEILF@
158 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
159 #   undef ceilf
160 #   define ceilf rpl_ceilf
161 #  endif
162 _GL_FUNCDECL_RPL (ceilf, float, (float x));
163 _GL_CXXALIAS_RPL (ceilf, float, (float x));
164 # else
165 #  if !@HAVE_DECL_CEILF@
166 _GL_FUNCDECL_SYS (ceilf, float, (float x));
167 #  endif
168 _GL_CXXALIAS_SYS (ceilf, float, (float x));
169 # endif
170 _GL_CXXALIASWARN (ceilf);
171 #elif defined GNULIB_POSIXCHECK
172 # undef ceilf
173 # if HAVE_RAW_DECL_CEILF
174 _GL_WARN_ON_USE (ceilf, "ceilf is unportable - "
175                  "use gnulib module ceilf for portability");
176 # endif
177 #endif
178
179 #if @GNULIB_CEIL@
180 # if @REPLACE_CEIL@
181 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
182 #   define ceil rpl_ceil
183 #  endif
184 _GL_FUNCDECL_RPL (ceil, double, (double x));
185 _GL_CXXALIAS_RPL (ceil, double, (double x));
186 # else
187 _GL_CXXALIAS_SYS (ceil, double, (double x));
188 # endif
189 _GL_CXXALIASWARN (ceil);
190 #endif
191
192 #if @GNULIB_CEILL@
193 # if @REPLACE_CEILL@
194 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
195 #   undef ceill
196 #   define ceill rpl_ceill
197 #  endif
198 _GL_FUNCDECL_RPL (ceill, long double, (long double x));
199 _GL_CXXALIAS_RPL (ceill, long double, (long double x));
200 # else
201 #  if !@HAVE_DECL_CEILL@
202 _GL_FUNCDECL_SYS (ceill, long double, (long double x));
203 #  endif
204 _GL_CXXALIAS_SYS (ceill, long double, (long double x));
205 # endif
206 _GL_CXXALIASWARN (ceill);
207 #elif defined GNULIB_POSIXCHECK
208 # undef ceill
209 # if HAVE_RAW_DECL_CEILL
210 _GL_WARN_ON_USE (ceill, "ceill is unportable - "
211                  "use gnulib module ceill for portability");
212 # endif
213 #endif
214
215
216 #if @GNULIB_COSL@
217 # if !@HAVE_COSL@ || !@HAVE_DECL_COSL@
218 _GL_FUNCDECL_SYS (cosl, long double, (long double x));
219 # endif
220 _GL_CXXALIAS_SYS (cosl, long double, (long double x));
221 _GL_CXXALIASWARN (cosl);
222 #elif defined GNULIB_POSIXCHECK
223 # undef cosl
224 # if HAVE_RAW_DECL_COSL
225 _GL_WARN_ON_USE (cosl, "cosl is unportable - "
226                  "use gnulib module mathl for portability");
227 # endif
228 #endif
229
230
231 #if @GNULIB_EXPL@
232 # if !@HAVE_EXPL@ || !@HAVE_DECL_EXPL@
233 _GL_FUNCDECL_SYS (expl, long double, (long double x));
234 # endif
235 _GL_CXXALIAS_SYS (expl, long double, (long double x));
236 _GL_CXXALIASWARN (expl);
237 #elif defined GNULIB_POSIXCHECK
238 # undef expl
239 # if HAVE_RAW_DECL_EXPL
240 _GL_WARN_ON_USE (expl, "expl is unportable - "
241                  "use gnulib module mathl for portability");
242 # endif
243 #endif
244
245
246 #if @GNULIB_FABSF@
247 # if !@HAVE_FABSF@
248 #  undef fabsf
249 _GL_FUNCDECL_SYS (fabsf, float, (float x));
250 # endif
251 _GL_CXXALIAS_SYS (fabsf, float, (float x));
252 _GL_CXXALIASWARN (fabsf);
253 #elif defined GNULIB_POSIXCHECK
254 # undef fabsf
255 # if HAVE_RAW_DECL_FABSF
256 _GL_WARN_ON_USE (fabsf, "fabsf is unportable - "
257                  "use gnulib module fabsf for portability");
258 # endif
259 #endif
260
261
262 #if @GNULIB_FLOORF@
263 # if @REPLACE_FLOORF@
264 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
265 #   undef floorf
266 #   define floorf rpl_floorf
267 #  endif
268 _GL_FUNCDECL_RPL (floorf, float, (float x));
269 _GL_CXXALIAS_RPL (floorf, float, (float x));
270 # else
271 #  if !@HAVE_DECL_FLOORF@
272 _GL_FUNCDECL_SYS (floorf, float, (float x));
273 #  endif
274 _GL_CXXALIAS_SYS (floorf, float, (float x));
275 # endif
276 _GL_CXXALIASWARN (floorf);
277 #elif defined GNULIB_POSIXCHECK
278 # undef floorf
279 # if HAVE_RAW_DECL_FLOORF
280 _GL_WARN_ON_USE (floorf, "floorf is unportable - "
281                  "use gnulib module floorf for portability");
282 # endif
283 #endif
284
285 #if @GNULIB_FLOOR@
286 # if @REPLACE_FLOOR@
287 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
288 #   define floor rpl_floor
289 #  endif
290 _GL_FUNCDECL_RPL (floor, double, (double x));
291 _GL_CXXALIAS_RPL (floor, double, (double x));
292 # else
293 _GL_CXXALIAS_SYS (floor, double, (double x));
294 # endif
295 _GL_CXXALIASWARN (floor);
296 #endif
297
298 #if @GNULIB_FLOORL@
299 # if @REPLACE_FLOORL@
300 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
301 #   undef floorl
302 #   define floorl rpl_floorl
303 #  endif
304 _GL_FUNCDECL_RPL (floorl, long double, (long double x));
305 _GL_CXXALIAS_RPL (floorl, long double, (long double x));
306 # else
307 #  if !@HAVE_DECL_FLOORL@
308 _GL_FUNCDECL_SYS (floorl, long double, (long double x));
309 #  endif
310 _GL_CXXALIAS_SYS (floorl, long double, (long double x));
311 # endif
312 _GL_CXXALIASWARN (floorl);
313 #elif defined GNULIB_POSIXCHECK
314 # undef floorl
315 # if HAVE_RAW_DECL_FLOORL
316 _GL_WARN_ON_USE (floorl, "floorl is unportable - "
317                  "use gnulib module floorl for portability");
318 # endif
319 #endif
320
321
322 #if @GNULIB_FMODF@
323 # if !@HAVE_FMODF@
324 #  undef fmodf
325 _GL_FUNCDECL_SYS (fmodf, float, (float x, float y));
326 # endif
327 _GL_CXXALIAS_SYS (fmodf, float, (float x, float y));
328 _GL_CXXALIASWARN (fmodf);
329 #elif defined GNULIB_POSIXCHECK
330 # undef fmodf
331 # if HAVE_RAW_DECL_FMODF
332 _GL_WARN_ON_USE (fmodf, "fmodf is unportable - "
333                  "use gnulib module fmodf for portability");
334 # endif
335 #endif
336
337
338 /* Write x as
339      x = mantissa * 2^exp
340    where
341      If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
342      If x is zero: mantissa = x, exp = 0.
343      If x is infinite or NaN: mantissa = x, exp unspecified.
344    Store exp in *EXPPTR and return mantissa.  */
345 #if @GNULIB_FREXPF@
346 # if !@HAVE_FREXPF@
347 #  undef frexpf
348 _GL_FUNCDECL_SYS (frexpf, float, (float x, int *expptr) _GL_ARG_NONNULL ((2)));
349 # endif
350 _GL_CXXALIAS_SYS (frexpf, float, (float x, int *expptr));
351 _GL_CXXALIASWARN (frexpf);
352 #elif defined GNULIB_POSIXCHECK
353 # undef frexpf
354 # if HAVE_RAW_DECL_FREXPF
355 _GL_WARN_ON_USE (frexpf, "frexpf is unportable - "
356                  "use gnulib module frexpf for portability");
357 # endif
358 #endif
359
360 /* Write x as
361      x = mantissa * 2^exp
362    where
363      If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
364      If x is zero: mantissa = x, exp = 0.
365      If x is infinite or NaN: mantissa = x, exp unspecified.
366    Store exp in *EXPPTR and return mantissa.  */
367 #if @GNULIB_FREXP@
368 # if @REPLACE_FREXP@
369 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
370 #   define frexp rpl_frexp
371 #  endif
372 _GL_FUNCDECL_RPL (frexp, double, (double x, int *expptr) _GL_ARG_NONNULL ((2)));
373 _GL_CXXALIAS_RPL (frexp, double, (double x, int *expptr));
374 # else
375 _GL_CXXALIAS_SYS (frexp, double, (double x, int *expptr));
376 # endif
377 _GL_CXXALIASWARN (frexp);
378 #elif defined GNULIB_POSIXCHECK
379 # undef frexp
380 /* Assume frexp is always declared.  */
381 _GL_WARN_ON_USE (frexp, "frexp is unportable - "
382                  "use gnulib module frexp for portability");
383 #endif
384
385 /* Write x as
386      x = mantissa * 2^exp
387    where
388      If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
389      If x is zero: mantissa = x, exp = 0.
390      If x is infinite or NaN: mantissa = x, exp unspecified.
391    Store exp in *EXPPTR and return mantissa.  */
392 #if @GNULIB_FREXPL@ && @REPLACE_FREXPL@
393 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
394 #  undef frexpl
395 #  define frexpl rpl_frexpl
396 # endif
397 _GL_FUNCDECL_RPL (frexpl, long double,
398                   (long double x, int *expptr) _GL_ARG_NONNULL ((2)));
399 _GL_CXXALIAS_RPL (frexpl, long double, (long double x, int *expptr));
400 #else
401 # if !@HAVE_DECL_FREXPL@
402 _GL_FUNCDECL_SYS (frexpl, long double,
403                   (long double x, int *expptr) _GL_ARG_NONNULL ((2)));
404 # endif
405 # if @GNULIB_FREXPL@
406 _GL_CXXALIAS_SYS (frexpl, long double, (long double x, int *expptr));
407 # endif
408 #endif
409 #if @GNULIB_FREXPL@ && !(@REPLACE_FREXPL@ && !@HAVE_DECL_FREXPL@)
410 _GL_CXXALIASWARN (frexpl);
411 #endif
412 #if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK
413 # undef frexpl
414 # if HAVE_RAW_DECL_FREXPL
415 _GL_WARN_ON_USE (frexpl, "frexpl is unportable - "
416                  "use gnulib module frexpl for portability");
417 # endif
418 #endif
419
420
421 /* Return x * 2^exp.  */
422 #if @GNULIB_LDEXPL@ && @REPLACE_LDEXPL@
423 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
424 #  undef ldexpl
425 #  define ldexpl rpl_ldexpl
426 # endif
427 _GL_FUNCDECL_RPL (ldexpl, long double, (long double x, int exp));
428 _GL_CXXALIAS_RPL (ldexpl, long double, (long double x, int exp));
429 #else
430 # if !@HAVE_DECL_LDEXPL@
431 _GL_FUNCDECL_SYS (ldexpl, long double, (long double x, int exp));
432 # endif
433 # if @GNULIB_LDEXPL@
434 _GL_CXXALIAS_SYS (ldexpl, long double, (long double x, int exp));
435 # endif
436 #endif
437 #if @GNULIB_LDEXPL@
438 _GL_CXXALIASWARN (ldexpl);
439 #endif
440 #if !@GNULIB_LDEXPL@ && defined GNULIB_POSIXCHECK
441 # undef ldexpl
442 # if HAVE_RAW_DECL_LDEXPL
443 _GL_WARN_ON_USE (ldexpl, "ldexpl is unportable - "
444                  "use gnulib module ldexpl for portability");
445 # endif
446 #endif
447
448
449 #if @GNULIB_LOGB@
450 # if !@HAVE_DECL_LOGB@
451 _GL_EXTERN_C double logb (double x);
452 # endif
453 #elif defined GNULIB_POSIXCHECK
454 # undef logb
455 # if HAVE_RAW_DECL_LOGB
456 _GL_WARN_ON_USE (logb, "logb is unportable - "
457                  "use gnulib module logb for portability");
458 # endif
459 #endif
460
461
462 #if @GNULIB_LOGL@
463 # if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@
464 _GL_FUNCDECL_SYS (logl, long double, (long double x));
465 # endif
466 _GL_CXXALIAS_SYS (logl, long double, (long double x));
467 _GL_CXXALIASWARN (logl);
468 #elif defined GNULIB_POSIXCHECK
469 # undef logl
470 # if HAVE_RAW_DECL_LOGL
471 _GL_WARN_ON_USE (logl, "logl is unportable - "
472                  "use gnulib module mathl for portability");
473 # endif
474 #endif
475
476
477 #if @GNULIB_MODFF@
478 # if !@HAVE_MODFF@
479 #  undef modff
480 _GL_FUNCDECL_SYS (modff, float, (float x, float *iptr) _GL_ARG_NONNULL ((2)));
481 # endif
482 _GL_CXXALIAS_SYS (modff, float, (float x, float *iptr));
483 _GL_CXXALIASWARN (modff);
484 #elif defined GNULIB_POSIXCHECK
485 # undef modff
486 # if HAVE_RAW_DECL_MODFF
487 _GL_WARN_ON_USE (modff, "modff is unportable - "
488                  "use gnulib module modff for portability");
489 # endif
490 #endif
491
492
493 #if @GNULIB_ROUNDF@
494 # if @REPLACE_ROUNDF@
495 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
496 #   undef roundf
497 #   define roundf rpl_roundf
498 #  endif
499 _GL_FUNCDECL_RPL (roundf, float, (float x));
500 _GL_CXXALIAS_RPL (roundf, float, (float x));
501 # else
502 #  if !@HAVE_DECL_ROUNDF@
503 _GL_FUNCDECL_SYS (roundf, float, (float x));
504 #  endif
505 _GL_CXXALIAS_SYS (roundf, float, (float x));
506 # endif
507 _GL_CXXALIASWARN (roundf);
508 #elif defined GNULIB_POSIXCHECK
509 # undef roundf
510 # if HAVE_RAW_DECL_ROUNDF
511 _GL_WARN_ON_USE (roundf, "roundf is unportable - "
512                  "use gnulib module roundf for portability");
513 # endif
514 #endif
515
516 #if @GNULIB_ROUND@
517 # if @REPLACE_ROUND@
518 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
519 #   undef round
520 #   define round rpl_round
521 #  endif
522 _GL_FUNCDECL_RPL (round, double, (double x));
523 _GL_CXXALIAS_RPL (round, double, (double x));
524 # else
525 #  if !@HAVE_DECL_ROUND@
526 _GL_FUNCDECL_SYS (round, double, (double x));
527 #  endif
528 _GL_CXXALIAS_SYS (round, double, (double x));
529 # endif
530 _GL_CXXALIASWARN (round);
531 #elif defined GNULIB_POSIXCHECK
532 # undef round
533 # if HAVE_RAW_DECL_ROUND
534 _GL_WARN_ON_USE (round, "round is unportable - "
535                  "use gnulib module round for portability");
536 # endif
537 #endif
538
539 #if @GNULIB_ROUNDL@
540 # if @REPLACE_ROUNDL@
541 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
542 #   undef roundl
543 #   define roundl rpl_roundl
544 #  endif
545 _GL_FUNCDECL_RPL (roundl, long double, (long double x));
546 _GL_CXXALIAS_RPL (roundl, long double, (long double x));
547 # else
548 #  if !@HAVE_DECL_ROUNDL@
549 _GL_FUNCDECL_SYS (roundl, long double, (long double x));
550 #  endif
551 _GL_CXXALIAS_SYS (roundl, long double, (long double x));
552 # endif
553 _GL_CXXALIASWARN (roundl);
554 #elif defined GNULIB_POSIXCHECK
555 # undef roundl
556 # if HAVE_RAW_DECL_ROUNDL
557 _GL_WARN_ON_USE (roundl, "roundl is unportable - "
558                  "use gnulib module roundl for portability");
559 # endif
560 #endif
561
562
563 #if @GNULIB_SINL@
564 # if !@HAVE_SINL@ || !@HAVE_DECL_SINL@
565 _GL_FUNCDECL_SYS (sinl, long double, (long double x));
566 # endif
567 _GL_CXXALIAS_SYS (sinl, long double, (long double x));
568 _GL_CXXALIASWARN (sinl);
569 #elif defined GNULIB_POSIXCHECK
570 # undef sinl
571 # if HAVE_RAW_DECL_SINL
572 _GL_WARN_ON_USE (sinl, "sinl is unportable - "
573                  "use gnulib module mathl for portability");
574 # endif
575 #endif
576
577
578 #if @GNULIB_SQRTL@
579 # if !@HAVE_SQRTL@ || !@HAVE_DECL_SQRTL@
580 _GL_FUNCDECL_SYS (sqrtl, long double, (long double x));
581 # endif
582 _GL_CXXALIAS_SYS (sqrtl, long double, (long double x));
583 _GL_CXXALIASWARN (sqrtl);
584 #elif defined GNULIB_POSIXCHECK
585 # undef sqrtl
586 # if HAVE_RAW_DECL_SQRTL
587 _GL_WARN_ON_USE (sqrtl, "sqrtl is unportable - "
588                  "use gnulib module mathl for portability");
589 # endif
590 #endif
591
592
593 #if @GNULIB_TANL@
594 # if !@HAVE_TANL@ || !@HAVE_DECL_TANL@
595 _GL_FUNCDECL_SYS (tanl, long double, (long double x));
596 # endif
597 _GL_CXXALIAS_SYS (tanl, long double, (long double x));
598 _GL_CXXALIASWARN (tanl);
599 #elif defined GNULIB_POSIXCHECK
600 # undef tanl
601 # if HAVE_RAW_DECL_TANL
602 _GL_WARN_ON_USE (tanl, "tanl is unportable - "
603                  "use gnulib module mathl for portability");
604 # endif
605 #endif
606
607
608 #if @GNULIB_TRUNCF@
609 # if @REPLACE_TRUNCF@
610 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
611 #   define truncf rpl_truncf
612 #  endif
613 _GL_FUNCDECL_RPL (truncf, float, (float x));
614 _GL_CXXALIAS_RPL (truncf, float, (float x));
615 # else
616 #  if !@HAVE_DECL_TRUNCF@
617 _GL_FUNCDECL_SYS (truncf, float, (float x));
618 #  endif
619 _GL_CXXALIAS_SYS (truncf, float, (float x));
620 # endif
621 _GL_CXXALIASWARN (truncf);
622 #elif defined GNULIB_POSIXCHECK
623 # undef truncf
624 # if HAVE_RAW_DECL_TRUNCF
625 _GL_WARN_ON_USE (truncf, "truncf is unportable - "
626                  "use gnulib module truncf for portability");
627 # endif
628 #endif
629
630 #if @GNULIB_TRUNC@
631 # if @REPLACE_TRUNC@
632 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
633 #   define trunc rpl_trunc
634 #  endif
635 _GL_FUNCDECL_RPL (trunc, double, (double x));
636 _GL_CXXALIAS_RPL (trunc, double, (double x));
637 # else
638 #  if !@HAVE_DECL_TRUNC@
639 _GL_FUNCDECL_SYS (trunc, double, (double x));
640 #  endif
641 _GL_CXXALIAS_SYS (trunc, double, (double x));
642 # endif
643 _GL_CXXALIASWARN (trunc);
644 #elif defined GNULIB_POSIXCHECK
645 # undef trunc
646 # if HAVE_RAW_DECL_TRUNC
647 _GL_WARN_ON_USE (trunc, "trunc is unportable - "
648                  "use gnulib module trunc for portability");
649 # endif
650 #endif
651
652 #if @GNULIB_TRUNCL@
653 # if @REPLACE_TRUNCL@
654 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
655 #   undef truncl
656 #   define truncl rpl_truncl
657 #  endif
658 _GL_FUNCDECL_RPL (truncl, long double, (long double x));
659 _GL_CXXALIAS_RPL (truncl, long double, (long double x));
660 # else
661 #  if !@HAVE_DECL_TRUNCL@
662 _GL_FUNCDECL_SYS (truncl, long double, (long double x));
663 #  endif
664 _GL_CXXALIAS_SYS (truncl, long double, (long double x));
665 # endif
666 _GL_CXXALIASWARN (truncl);
667 #elif defined GNULIB_POSIXCHECK
668 # undef truncl
669 # if HAVE_RAW_DECL_TRUNCL
670 _GL_WARN_ON_USE (truncl, "truncl is unportable - "
671                  "use gnulib module truncl for portability");
672 # endif
673 #endif
674
675
676 /* Definitions of function-like macros come here, after the function
677    declarations.  */
678
679
680 #if @GNULIB_ISFINITE@
681 # if @REPLACE_ISFINITE@
682 _GL_EXTERN_C int gl_isfinitef (float x);
683 _GL_EXTERN_C int gl_isfinited (double x);
684 _GL_EXTERN_C int gl_isfinitel (long double x);
685 #  undef isfinite
686 #  define isfinite(x) \
687    (sizeof (x) == sizeof (long double) ? gl_isfinitel (x) : \
688     sizeof (x) == sizeof (double) ? gl_isfinited (x) : \
689     gl_isfinitef (x))
690 # endif
691 #elif defined GNULIB_POSIXCHECK
692 # if defined isfinite
693 _GL_WARN_REAL_FLOATING_DECL (isfinite);
694 #  undef isfinite
695 #  define isfinite(x) _GL_WARN_REAL_FLOATING_IMPL (isfinite, x)
696 # endif
697 #endif
698
699
700 #if @GNULIB_ISINF@
701 # if @REPLACE_ISINF@
702 _GL_EXTERN_C int gl_isinff (float x);
703 _GL_EXTERN_C int gl_isinfd (double x);
704 _GL_EXTERN_C int gl_isinfl (long double x);
705 #  undef isinf
706 #  define isinf(x) \
707    (sizeof (x) == sizeof (long double) ? gl_isinfl (x) : \
708     sizeof (x) == sizeof (double) ? gl_isinfd (x) : \
709     gl_isinff (x))
710 # endif
711 #elif defined GNULIB_POSIXCHECK
712 # if defined isinf
713 _GL_WARN_REAL_FLOATING_DECL (isinf);
714 #  undef isinf
715 #  define isinf(x) _GL_WARN_REAL_FLOATING_IMPL (isinf, x)
716 # endif
717 #endif
718
719
720 #if @GNULIB_ISNANF@
721 /* Test for NaN for 'float' numbers.  */
722 # if @HAVE_ISNANF@
723 /* The original <math.h> included above provides a declaration of isnan macro
724    or (older) isnanf function.  */
725 #  if __GNUC__ >= 4
726     /* GCC 4.0 and newer provides three built-ins for isnan.  */
727 #   undef isnanf
728 #   define isnanf(x) __builtin_isnanf ((float)(x))
729 #  elif defined isnan
730 #   undef isnanf
731 #   define isnanf(x) isnan ((float)(x))
732 #  endif
733 # else
734 /* Test whether X is a NaN.  */
735 #  undef isnanf
736 #  define isnanf rpl_isnanf
737 _GL_EXTERN_C int isnanf (float x);
738 # endif
739 #endif
740
741 #if @GNULIB_ISNAND@
742 /* Test for NaN for 'double' numbers.
743    This function is a gnulib extension, unlike isnan() which applied only
744    to 'double' numbers earlier but now is a type-generic macro.  */
745 # if @HAVE_ISNAND@
746 /* The original <math.h> included above provides a declaration of isnan
747    macro.  */
748 #  if __GNUC__ >= 4
749     /* GCC 4.0 and newer provides three built-ins for isnan.  */
750 #   undef isnand
751 #   define isnand(x) __builtin_isnan ((double)(x))
752 #  else
753 #   undef isnand
754 #   define isnand(x) isnan ((double)(x))
755 #  endif
756 # else
757 /* Test whether X is a NaN.  */
758 #  undef isnand
759 #  define isnand rpl_isnand
760 _GL_EXTERN_C int isnand (double x);
761 # endif
762 #endif
763
764 #if @GNULIB_ISNANL@
765 /* Test for NaN for 'long double' numbers.  */
766 # if @HAVE_ISNANL@
767 /* The original <math.h> included above provides a declaration of isnan
768    macro or (older) isnanl function.  */
769 #  if __GNUC__ >= 4
770     /* GCC 4.0 and newer provides three built-ins for isnan.  */
771 #   undef isnanl
772 #   define isnanl(x) __builtin_isnanl ((long double)(x))
773 #  elif defined isnan
774 #   undef isnanl
775 #   define isnanl(x) isnan ((long double)(x))
776 #  endif
777 # else
778 /* Test whether X is a NaN.  */
779 #  undef isnanl
780 #  define isnanl rpl_isnanl
781 _GL_EXTERN_C int isnanl (long double x);
782 # endif
783 #endif
784
785 /* This must come *after* the snippets for GNULIB_ISNANF and GNULIB_ISNANL!  */
786 #if @GNULIB_ISNAN@
787 # if @REPLACE_ISNAN@
788 /* We can't just use the isnanf macro (e.g.) as exposed by
789    isnanf.h (e.g.) here, because those may end up being macros
790    that recursively expand back to isnan.  So use the gnulib
791    replacements for them directly. */
792 #  if @HAVE_ISNANF@ && __GNUC__ >= 4
793 #   define gl_isnan_f(x) __builtin_isnanf ((float)(x))
794 #  else
795 _GL_EXTERN_C int rpl_isnanf (float x);
796 #   define gl_isnan_f(x) rpl_isnanf (x)
797 #  endif
798 #  if @HAVE_ISNAND@ && __GNUC__ >= 4
799 #   define gl_isnan_d(x) __builtin_isnan ((double)(x))
800 #  else
801 _GL_EXTERN_C int rpl_isnand (double x);
802 #   define gl_isnan_d(x) rpl_isnand (x)
803 #  endif
804 #  if @HAVE_ISNANL@ && __GNUC__ >= 4
805 #   define gl_isnan_l(x) __builtin_isnanl ((long double)(x))
806 #  else
807 _GL_EXTERN_C int rpl_isnanl (long double x);
808 #   define gl_isnan_l(x) rpl_isnanl (x)
809 #  endif
810 #  undef isnan
811 #  define isnan(x) \
812    (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \
813     sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \
814     gl_isnan_f (x))
815 # elif __GNUC__ >= 4
816 #  undef isnan
817 #  define isnan(x) \
818    (sizeof (x) == sizeof (long double) ? __builtin_isnanl ((long double)(x)) : \
819     sizeof (x) == sizeof (double) ? __builtin_isnan ((double)(x)) : \
820     __builtin_isnanf ((float)(x)))
821 # endif
822 /* Ensure isnan is a macro.  */
823 # ifndef isnan
824 #  define isnan isnan
825 # endif
826 #elif defined GNULIB_POSIXCHECK
827 # if defined isnan
828 _GL_WARN_REAL_FLOATING_DECL (isnan);
829 #  undef isnan
830 #  define isnan(x) _GL_WARN_REAL_FLOATING_IMPL (isnan, x)
831 # endif
832 #endif
833
834
835 #if @GNULIB_SIGNBIT@
836 # if @REPLACE_SIGNBIT_USING_GCC@
837 #  undef signbit
838    /* GCC 4.0 and newer provides three built-ins for signbit.  */
839 #  define signbit(x) \
840    (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
841     sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
842     __builtin_signbitf (x))
843 # endif
844 # if @REPLACE_SIGNBIT@
845 #  undef signbit
846 _GL_EXTERN_C int gl_signbitf (float arg);
847 _GL_EXTERN_C int gl_signbitd (double arg);
848 _GL_EXTERN_C int gl_signbitl (long double arg);
849 #  if __GNUC__ >= 2 && !__STRICT_ANSI__
850 #   define _GL_NUM_UINT_WORDS(type) \
851       ((sizeof (type) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
852 #   if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf
853 #    define gl_signbitf_OPTIMIZED_MACRO
854 #    define gl_signbitf(arg) \
855        ({ union { float _value;                                         \
856                   unsigned int _word[_GL_NUM_UINT_WORDS (float)];       \
857                 } _m;                                                   \
858           _m._value = (arg);                                            \
859           (_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1;          \
860         })
861 #   endif
862 #   if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT && !defined gl_signbitd
863 #    define gl_signbitd_OPTIMIZED_MACRO
864 #    define gl_signbitd(arg) \
865        ({ union { double _value;                                        \
866                   unsigned int _word[_GL_NUM_UINT_WORDS (double)];      \
867                 } _m;                                                   \
868           _m._value = (arg);                                            \
869           (_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1;          \
870         })
871 #   endif
872 #   if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT && !defined gl_signbitl
873 #    define gl_signbitl_OPTIMIZED_MACRO
874 #    define gl_signbitl(arg) \
875        ({ union { long double _value;                                   \
876                   unsigned int _word[_GL_NUM_UINT_WORDS (long double)]; \
877                 } _m;                                                   \
878           _m._value = (arg);                                            \
879           (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1;        \
880         })
881 #   endif
882 #  endif
883 #  define signbit(x) \
884    (sizeof (x) == sizeof (long double) ? gl_signbitl (x) : \
885     sizeof (x) == sizeof (double) ? gl_signbitd (x) : \
886     gl_signbitf (x))
887 # endif
888 #elif defined GNULIB_POSIXCHECK
889 # if defined signbit
890 _GL_WARN_REAL_FLOATING_DECL (signbit);
891 #  undef signbit
892 #  define signbit(x) _GL_WARN_REAL_FLOATING_IMPL (signbit, x)
893 # endif
894 #endif
895
896
897 #endif /* _@GUARD_PREFIX@_MATH_H */
898 #endif /* _@GUARD_PREFIX@_MATH_H */