70e7988b6847f54ac463e380c135a6df0d43e070
[gnulib.git] / lib / math.in.h
1 /* A GNU-like <math.h>.
2
3    Copyright (C) 2002-2003, 2007-2010 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 _GL_MATH_H
19
20 #if __GNUC__ >= 3
21 @PRAGMA_SYSTEM_HEADER@
22 #endif
23
24 /* The include_next requires a split double-inclusion guard.  */
25 #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
26
27 #ifndef _GL_MATH_H
28 #define _GL_MATH_H
29
30
31 /* The definition of _GL_ARG_NONNULL is copied here.  */
32
33 /* The definition of _GL_WARN_ON_USE is copied here.  */
34
35 /* Helper macros to define a portability warning for the
36    classification macro FUNC called with VALUE.  POSIX declares the
37    classification macros with an argument of real-floating (that is,
38    one of float, double, or long double).  */
39 #define _GL_WARN_REAL_FLOATING_DECL(func) \
40 static inline int                                                   \
41 rpl_ ## func ## f (float f)                                         \
42 {                                                                   \
43   return func (f);                                                  \
44 }                                                                   \
45 static inline int                                                   \
46 rpl_ ## func ## d (double d)                                        \
47 {                                                                   \
48   return func (d);                                                  \
49 }                                                                   \
50 static inline int                                                   \
51 rpl_ ## func ## l (long double l)                                   \
52 {                                                                   \
53   return func (l);                                                  \
54 }                                                                   \
55 _GL_WARN_ON_USE (rpl_ ## func ## f, #func " is unportable - "       \
56                  "use gnulib module " #func " for portability");    \
57 _GL_WARN_ON_USE (rpl_ ## func ## d, #func " is unportable - "       \
58                  "use gnulib module " #func " for portability");    \
59 _GL_WARN_ON_USE (rpl_ ## func ## l, #func " is unportable - "       \
60                  "use gnulib module " #func " for portability")
61 #define _GL_WARN_REAL_FLOATING_IMPL(func, value) \
62   (sizeof (value) == sizeof (float) ? rpl_ ## func ## f (value)     \
63    : sizeof (value) == sizeof (double) ? rpl_ ## func ## d (value)  \
64    : rpl_ ## func ## l (value))
65
66
67 #ifdef __cplusplus
68 extern "C" {
69 #endif
70
71
72 /* POSIX allows platforms that don't support NAN.  But all major
73    machines in the past 15 years have supported something close to
74    IEEE NaN, so we define this unconditionally.  We also must define
75    it on platforms like Solaris 10, where NAN is present but defined
76    as a function pointer rather than a floating point constant.  */
77 #if !defined NAN || @REPLACE_NAN@
78 # undef NAN
79   /* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0.  */
80 # ifdef __DECC
81 static float
82 _NaN ()
83 {
84   static float zero = 0.0f;
85   return zero / zero;
86 }
87 #  define NAN (_NaN())
88 # else
89 #  define NAN (0.0f / 0.0f)
90 # endif
91 #endif
92
93 /* Solaris 10 defines HUGE_VAL, but as a function pointer rather
94    than a floating point constant.  */
95 #if @REPLACE_HUGE_VAL@
96 # undef HUGE_VAL
97 # define HUGE_VAL (1.0 / 0.0)
98 #endif
99
100 /* Write x as
101      x = mantissa * 2^exp
102    where
103      If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
104      If x is zero: mantissa = x, exp = 0.
105      If x is infinite or NaN: mantissa = x, exp unspecified.
106    Store exp in *EXPPTR and return mantissa.  */
107 #if @GNULIB_FREXP@
108 # if @REPLACE_FREXP@
109 #  define frexp rpl_frexp
110 extern double frexp (double x, int *expptr) _GL_ARG_NONNULL ((2));
111 # endif
112 #elif defined GNULIB_POSIXCHECK
113 # undef frexp
114 /* Assume frexp is always declared.  */
115 _GL_WARN_ON_USE (frexp, "frexp is unportable - "
116                  "use gnulib module frexp for portability");
117 #endif
118
119
120 #if @GNULIB_ACOSL@
121 # if !@HAVE_ACOSL@ || !@HAVE_DECL_ACOSL@
122 extern long double acosl (long double x);
123 # endif
124 #elif defined GNULIB_POSIXCHECK
125 # undef acosl
126 # if HAVE_RAW_DECL_ACOSL
127 _GL_WARN_ON_USE (acosl, "acosl is unportable - "
128                  "use gnulib module mathl for portability");
129 # endif
130 #endif
131
132
133 #if @GNULIB_ASINL@
134 # if !@HAVE_ASINL@ || !@HAVE_DECL_ASINL@
135 extern long double asinl (long double x);
136 # endif
137 #elif defined GNULIB_POSIXCHECK
138 # undef asinl
139 # if HAVE_RAW_DECL_ASINL
140 _GL_WARN_ON_USE (asinl, "asinl is unportable - "
141                  "use gnulib module mathl for portability");
142 # endif
143 #endif
144
145
146 #if @GNULIB_ATANL@
147 # if !@HAVE_ATANL@ || !@HAVE_DECL_ATANL@
148 extern long double atanl (long double x);
149 # endif
150 #elif defined GNULIB_POSIXCHECK
151 # undef atanl
152 # if HAVE_RAW_DECL_ATANL
153 _GL_WARN_ON_USE (atanl, "atanl is unportable - "
154                  "use gnulib module mathl for portability");
155 # endif
156 #endif
157
158
159 #if @GNULIB_CEILF@
160 # if @REPLACE_CEILF@
161 #  define ceilf rpl_ceilf
162 extern float ceilf (float x);
163 # endif
164 #elif defined GNULIB_POSIXCHECK
165 # undef ceilf
166 # if HAVE_RAW_DECL_CEILF
167 _GL_WARN_ON_USE (ceilf, "ceilf is unportable - "
168                  "use gnulib module ceilf for portability");
169 # endif
170 #endif
171
172 #if @GNULIB_CEILL@
173 # if @REPLACE_CEILL@
174 #  define ceill rpl_ceill
175 extern long double ceill (long double x);
176 # endif
177 #elif defined GNULIB_POSIXCHECK
178 # undef ceill
179 # if HAVE_RAW_DECL_CEILL
180 _GL_WARN_ON_USE (ceill, "ceill is unportable - "
181                  "use gnulib module ceill for portability");
182 # endif
183 #endif
184
185
186 #if @GNULIB_COSL@
187 # if !@HAVE_COSL@
188 #  undef cosl
189 #  define cosl rpl_cosl
190 # endif
191 # if !@HAVE_COSL@ || !@HAVE_DECL_COSL@
192 extern long double cosl (long double x);
193 # endif
194 #elif defined GNULIB_POSIXCHECK
195 # undef cosl
196 # if HAVE_RAW_DECL_COSL
197 _GL_WARN_ON_USE (cosl, "cosl is unportable - "
198                  "use gnulib module mathl for portability");
199 # endif
200 #endif
201
202
203 #if @GNULIB_EXPL@
204 # if !@HAVE_EXPL@ || !@HAVE_DECL_EXPL@
205 extern long double expl (long double x);
206 # endif
207 #elif defined GNULIB_POSIXCHECK
208 # undef expl
209 # if HAVE_RAW_DECL_EXPL
210 _GL_WARN_ON_USE (expl, "expl is unportable - "
211                  "use gnulib module mathl for portability");
212 # endif
213 #endif
214
215
216 #if @GNULIB_FLOORF@
217 # if @REPLACE_FLOORF@
218 #  define floorf rpl_floorf
219 extern float floorf (float x);
220 # endif
221 #elif defined GNULIB_POSIXCHECK
222 # undef floorf
223 # if HAVE_RAW_DECL_FLOORF
224 _GL_WARN_ON_USE (floorf, "floorf is unportable - "
225                  "use gnulib module floorf for portability");
226 # endif
227 #endif
228
229 #if @GNULIB_FLOORL@
230 # if @REPLACE_FLOORL@
231 #  define floorl rpl_floorl
232 extern long double floorl (long double x);
233 # endif
234 #elif defined GNULIB_POSIXCHECK
235 # undef floorl
236 # if HAVE_RAW_DECL_FLOORL
237 _GL_WARN_ON_USE (floorl, "floorl is unportable - "
238                  "use gnulib module floorl for portability");
239 # endif
240 #endif
241
242
243 /* Write x as
244      x = mantissa * 2^exp
245    where
246      If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
247      If x is zero: mantissa = x, exp = 0.
248      If x is infinite or NaN: mantissa = x, exp unspecified.
249    Store exp in *EXPPTR and return mantissa.  */
250 #if @GNULIB_FREXPL@ && @REPLACE_FREXPL@
251 # define frexpl rpl_frexpl
252 #endif
253 #if (@GNULIB_FREXPL@ && @REPLACE_FREXPL@) || !@HAVE_DECL_FREXPL@
254 extern long double frexpl (long double x, int *expptr) _GL_ARG_NONNULL ((2));
255 #endif
256 #if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK
257 # undef frexpl
258 # if HAVE_RAW_DECL_FREXPL
259 _GL_WARN_ON_USE (frexpl, "frexpl is unportable - "
260                  "use gnulib module frexpl for portability");
261 # endif
262 #endif
263
264
265 /* Return x * 2^exp.  */
266 #if @GNULIB_LDEXPL@ && @REPLACE_LDEXPL@
267 # define ldexpl rpl_ldexpl
268 #endif
269 #if (@GNULIB_LDEXPL@ && @REPLACE_LDEXPL@) || !@HAVE_DECL_LDEXPL@
270 extern long double ldexpl (long double x, int exp);
271 #endif
272 #if !@GNULIB_LDEXPL@ && defined GNULIB_POSIXCHECK
273 # undef ldexpl
274 # if HAVE_RAW_DECL_LDEXPL
275 _GL_WARN_ON_USE (ldexpl, "ldexpl is unportable - "
276                  "use gnulib module ldexpl for portability");
277 # endif
278 #endif
279
280
281 #if @GNULIB_LOGL@
282 # if !@HAVE_LOGL@
283 #  undef logl
284 #  define logl rpl_logl
285 # endif
286 # if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@
287 extern long double logl (long double x);
288 # endif
289 #elif defined GNULIB_POSIXCHECK
290 # undef logl
291 # if HAVE_RAW_DECL_LOGL
292 _GL_WARN_ON_USE (logl, "logl is unportable - "
293                  "use gnulib module mathl for portability");
294 # endif
295 #endif
296
297
298 #if @GNULIB_ROUNDF@
299 # if @REPLACE_ROUNDF@
300 #  undef roundf
301 #  define roundf rpl_roundf
302 extern float roundf (float x);
303 # endif
304 #elif defined GNULIB_POSIXCHECK
305 # undef roundf
306 # if HAVE_RAW_DECL_ROUNDF
307 _GL_WARN_ON_USE (roundf, "roundf is unportable - "
308                  "use gnulib module roundf for portability");
309 # endif
310 #endif
311
312 #if @GNULIB_ROUND@
313 # if @REPLACE_ROUND@
314 #  undef round
315 #  define round rpl_round
316 extern double round (double x);
317 # endif
318 #elif defined GNULIB_POSIXCHECK
319 # undef round
320 # if HAVE_RAW_DECL_ROUND
321 _GL_WARN_ON_USE (round, "round is unportable - "
322                  "use gnulib module round for portability");
323 # endif
324 #endif
325
326 #if @GNULIB_ROUNDL@
327 # if @REPLACE_ROUNDL@
328 #  undef roundl
329 #  define roundl rpl_roundl
330 extern long double roundl (long double x);
331 # endif
332 #elif defined GNULIB_POSIXCHECK
333 # undef roundl
334 # if HAVE_RAW_DECL_ROUNDL
335 _GL_WARN_ON_USE (roundl, "roundl is unportable - "
336                  "use gnulib module roundl for portability");
337 # endif
338 #endif
339
340
341 #if @GNULIB_SINL@
342 # if !@HAVE_SINL@
343 #  undef sinl
344 #  define sinl rpl_sinl
345 # endif
346 # if !@HAVE_SINL@ || !@HAVE_DECL_SINL@
347 extern long double sinl (long double x);
348 # endif
349 #elif defined GNULIB_POSIXCHECK
350 # undef sinl
351 # if HAVE_RAW_DECL_SINL
352 _GL_WARN_ON_USE (sinl, "sinl is unportable - "
353                  "use gnulib module mathl for portability");
354 # endif
355 #endif
356
357
358 #if @GNULIB_SQRTL@
359 # if !@HAVE_SQRTL@ || !@HAVE_DECL_SQRTL@
360 extern long double sqrtl (long double x);
361 # endif
362 #elif defined GNULIB_POSIXCHECK
363 # undef sqrtl
364 # if HAVE_RAW_DECL_SQRTL
365 _GL_WARN_ON_USE (sqrtl, "sqrtl is unportable - "
366                  "use gnulib module mathl for portability");
367 # endif
368 #endif
369
370
371 #if @GNULIB_TANL@
372 # if !@HAVE_TANL@ || !@HAVE_DECL_TANL@
373 extern long double tanl (long double x);
374 # endif
375 #elif defined GNULIB_POSIXCHECK
376 # undef tanl
377 # if HAVE_RAW_DECL_TANL
378 _GL_WARN_ON_USE (tanl, "tanl is unportable - "
379                  "use gnulib module mathl for portability");
380 # endif
381 #endif
382
383
384 #if @GNULIB_TRUNCF@
385 # if !@HAVE_DECL_TRUNCF@
386 #  define truncf rpl_truncf
387 extern float truncf (float x);
388 # endif
389 #elif defined GNULIB_POSIXCHECK
390 # undef truncf
391 # if HAVE_RAW_DECL_TRUNCF
392 _GL_WARN_ON_USE (truncf, "truncf is unportable - "
393                  "use gnulib module truncf for portability");
394 # endif
395 #endif
396
397 #if @GNULIB_TRUNC@
398 # if !@HAVE_DECL_TRUNC@
399 #  define trunc rpl_trunc
400 extern double trunc (double x);
401 # endif
402 #elif defined GNULIB_POSIXCHECK
403 # undef trunc
404 # if HAVE_RAW_DECL_TRUNC
405 _GL_WARN_ON_USE (trunc, "trunc is unportable - "
406                  "use gnulib module trunc for portability");
407 # endif
408 #endif
409
410 #if @GNULIB_TRUNCL@
411 # if @REPLACE_TRUNCL@
412 #  undef truncl
413 #  define truncl rpl_truncl
414 extern long double truncl (long double x);
415 # endif
416 #elif defined GNULIB_POSIXCHECK
417 # undef truncl
418 # if HAVE_RAW_DECL_TRUNCL
419 _GL_WARN_ON_USE (truncl, "truncl is unportable - "
420                  "use gnulib module truncl for portability");
421 # endif
422 #endif
423
424
425 #if @GNULIB_ISFINITE@
426 # if @REPLACE_ISFINITE@
427 extern int gl_isfinitef (float x);
428 extern int gl_isfinited (double x);
429 extern int gl_isfinitel (long double x);
430 #  undef isfinite
431 #  define isfinite(x) \
432    (sizeof (x) == sizeof (long double) ? gl_isfinitel (x) : \
433     sizeof (x) == sizeof (double) ? gl_isfinited (x) : \
434     gl_isfinitef (x))
435 # endif
436 #elif defined GNULIB_POSIXCHECK
437 # if defined isfinite
438 _GL_WARN_REAL_FLOATING_DECL (isfinite);
439 #  undef isfinite
440 #  define isfinite(x) _GL_WARN_REAL_FLOATING_IMPL (isfinite, x)
441 # endif
442 #endif
443
444
445 #if @GNULIB_ISINF@
446 # if @REPLACE_ISINF@
447 extern int gl_isinff (float x);
448 extern int gl_isinfd (double x);
449 extern int gl_isinfl (long double x);
450 #  undef isinf
451 #  define isinf(x) \
452    (sizeof (x) == sizeof (long double) ? gl_isinfl (x) : \
453     sizeof (x) == sizeof (double) ? gl_isinfd (x) : \
454     gl_isinff (x))
455 # endif
456 #elif defined GNULIB_POSIXCHECK
457 # if defined isinf
458 _GL_WARN_REAL_FLOATING_DECL (isinf);
459 #  undef isinf
460 #  define isinf(x) _GL_WARN_REAL_FLOATING_IMPL (isinf, x)
461 # endif
462 #endif
463
464
465 #if @GNULIB_ISNANF@
466 /* Test for NaN for 'float' numbers.  */
467 # if @HAVE_ISNANF@
468 /* The original <math.h> included above provides a declaration of isnan macro
469    or (older) isnanf function.  */
470 #  if __GNUC__ >= 4
471     /* GCC 4.0 and newer provides three built-ins for isnan.  */
472 #   undef isnanf
473 #   define isnanf(x) __builtin_isnanf ((float)(x))
474 #  elif defined isnan
475 #   undef isnanf
476 #   define isnanf(x) isnan ((float)(x))
477 #  endif
478 # else
479 /* Test whether X is a NaN.  */
480 #  undef isnanf
481 #  define isnanf rpl_isnanf
482 extern int isnanf (float x);
483 # endif
484 #endif
485
486 #if @GNULIB_ISNAND@
487 /* Test for NaN for 'double' numbers.
488    This function is a gnulib extension, unlike isnan() which applied only
489    to 'double' numbers earlier but now is a type-generic macro.  */
490 # if @HAVE_ISNAND@
491 /* The original <math.h> included above provides a declaration of isnan macro.  */
492 #  if __GNUC__ >= 4
493     /* GCC 4.0 and newer provides three built-ins for isnan.  */
494 #   undef isnand
495 #   define isnand(x) __builtin_isnan ((double)(x))
496 #  else
497 #   undef isnand
498 #   define isnand(x) isnan ((double)(x))
499 #  endif
500 # else
501 /* Test whether X is a NaN.  */
502 #  undef isnand
503 #  define isnand rpl_isnand
504 extern int isnand (double x);
505 # endif
506 #endif
507
508 #if @GNULIB_ISNANL@
509 /* Test for NaN for 'long double' numbers.  */
510 # if @HAVE_ISNANL@
511 /* The original <math.h> included above provides a declaration of isnan macro or (older) isnanl function.  */
512 #  if __GNUC__ >= 4
513     /* GCC 4.0 and newer provides three built-ins for isnan.  */
514 #   undef isnanl
515 #   define isnanl(x) __builtin_isnanl ((long double)(x))
516 #  elif defined isnan
517 #   undef isnanl
518 #   define isnanl(x) isnan ((long double)(x))
519 #  endif
520 # else
521 /* Test whether X is a NaN.  */
522 #  undef isnanl
523 #  define isnanl rpl_isnanl
524 extern int isnanl (long double x);
525 # endif
526 #endif
527
528 /* This must come *after* the snippets for GNULIB_ISNANF and GNULIB_ISNANL!  */
529 #if @GNULIB_ISNAN@
530 # if @REPLACE_ISNAN@
531 /* We can't just use the isnanf macro (e.g.) as exposed by
532    isnanf.h (e.g.) here, because those may end up being macros
533    that recursively expand back to isnan.  So use the gnulib
534    replacements for them directly. */
535 #  if @HAVE_ISNANF@ && __GNUC__ >= 4
536 #   define gl_isnan_f(x) __builtin_isnan ((float)(x))
537 #  else
538 extern int rpl_isnanf (float x);
539 #   define gl_isnan_f(x) rpl_isnanf (x)
540 #  endif
541 #  if @HAVE_ISNAND@ && __GNUC__ >= 4
542 #   define gl_isnan_d(x) __builtin_isnan ((double)(x))
543 #  else
544 extern int rpl_isnand (double x);
545 #   define gl_isnan_d(x) rpl_isnand (x)
546 #  endif
547 #  if @HAVE_ISNANL@ && __GNUC__ >= 4
548 #   define gl_isnan_l(x) __builtin_isnan ((long double)(x))
549 #  else
550 extern int rpl_isnanl (long double x);
551 #   define gl_isnan_l(x) rpl_isnanl (x)
552 #  endif
553 #  undef isnan
554 #  define isnan(x) \
555    (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \
556     sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \
557     gl_isnan_f (x))
558 # endif
559 #elif defined GNULIB_POSIXCHECK
560 # if defined isnan
561 _GL_WARN_REAL_FLOATING_DECL (isnan);
562 #  undef isnan
563 #  define isnan(x) _GL_WARN_REAL_FLOATING_IMPL (isnan, x)
564 # endif
565 #endif
566
567
568 #if @GNULIB_SIGNBIT@
569 # if @REPLACE_SIGNBIT_USING_GCC@
570 #  undef signbit
571    /* GCC 4.0 and newer provides three built-ins for signbit.  */
572 #  define signbit(x) \
573    (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
574     sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
575     __builtin_signbitf (x))
576 # endif
577 # if @REPLACE_SIGNBIT@
578 #  undef signbit
579 extern int gl_signbitf (float arg);
580 extern int gl_signbitd (double arg);
581 extern int gl_signbitl (long double arg);
582 #  if __GNUC__ >= 2 && !__STRICT_ANSI__
583 #   if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf
584 #    define gl_signbitf_OPTIMIZED_MACRO
585 #    define gl_signbitf(arg) \
586        ({ union { float _value;                                         \
587                   unsigned int _word[(sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \
588                 } _m;                                                   \
589           _m._value = (arg);                                            \
590           (_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1;          \
591         })
592 #   endif
593 #   if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT && !defined gl_signbitd
594 #    define gl_signbitd_OPTIMIZED_MACRO
595 #    define gl_signbitd(arg) \
596        ({ union { double _value;                                                \
597                   unsigned int _word[(sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \
598                 } _m;                                                   \
599           _m._value = (arg);                                            \
600           (_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1;          \
601         })
602 #   endif
603 #   if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT && !defined gl_signbitl
604 #    define gl_signbitl_OPTIMIZED_MACRO
605 #    define gl_signbitl(arg) \
606        ({ union { long double _value;                                   \
607                   unsigned int _word[(sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \
608                 } _m;                                                   \
609           _m._value = (arg);                                            \
610           (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1;                \
611         })
612 #   endif
613 #  endif
614 #  define signbit(x) \
615    (sizeof (x) == sizeof (long double) ? gl_signbitl (x) : \
616     sizeof (x) == sizeof (double) ? gl_signbitd (x) : \
617     gl_signbitf (x))
618 # endif
619 #elif defined GNULIB_POSIXCHECK
620 # if defined signbit
621 _GL_WARN_REAL_FLOATING_DECL (signbit);
622 #  undef signbit
623 #  define signbit(x) _GL_WARN_REAL_FLOATING_IMPL (signbit, x)
624 # endif
625 #endif
626
627
628 #ifdef __cplusplus
629 }
630 #endif
631
632 #endif /* _GL_MATH_H */
633 #endif /* _GL_MATH_H */