diff options
Diffstat (limited to 'gl/math.in.h')
-rw-r--r-- | gl/math.in.h | 157 |
1 files changed, 154 insertions, 3 deletions
diff --git a/gl/math.in.h b/gl/math.in.h index c3515d73..6e1b9a2b 100644 --- a/gl/math.in.h +++ b/gl/math.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* A GNU-like <math.h>. | 1 | /* A GNU-like <math.h>. |
2 | 2 | ||
3 | Copyright (C) 2002-2003, 2007 Free Software Foundation, Inc. | 3 | Copyright (C) 2002-2003, 2007-2008 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 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 | 6 | it under the terms of the GNU General Public License as published by |
@@ -17,8 +17,12 @@ | |||
17 | 17 | ||
18 | #ifndef _GL_MATH_H | 18 | #ifndef _GL_MATH_H |
19 | 19 | ||
20 | #if __GNUC__ >= 3 | ||
21 | @PRAGMA_SYSTEM_HEADER@ | ||
22 | #endif | ||
23 | |||
20 | /* The include_next requires a split double-inclusion guard. */ | 24 | /* The include_next requires a split double-inclusion guard. */ |
21 | #@INCLUDE_NEXT@ @NEXT_MATH_H@ | 25 | #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_MATH_H@ |
22 | 26 | ||
23 | #ifndef _GL_MATH_H | 27 | #ifndef _GL_MATH_H |
24 | #define _GL_MATH_H | 28 | #define _GL_MATH_H |
@@ -32,6 +36,34 @@ extern "C" { | |||
32 | #endif | 36 | #endif |
33 | 37 | ||
34 | 38 | ||
39 | /* POSIX allows platforms that don't support NAN. But all major | ||
40 | machines in the past 15 years have supported something close to | ||
41 | IEEE NaN, so we define this unconditionally. We also must define | ||
42 | it on platforms like Solaris 10, where NAN is present but defined | ||
43 | as a function pointer rather than a floating point constant. */ | ||
44 | #if !defined NAN || @REPLACE_NAN@ | ||
45 | # undef NAN | ||
46 | /* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */ | ||
47 | # ifdef __DECC | ||
48 | static float | ||
49 | _NaN () | ||
50 | { | ||
51 | static float zero = 0.0f; | ||
52 | return zero / zero; | ||
53 | } | ||
54 | # define NAN (_NaN()) | ||
55 | # else | ||
56 | # define NAN (0.0f / 0.0f) | ||
57 | # endif | ||
58 | #endif | ||
59 | |||
60 | /* Solaris 10 defines HUGE_VAL, but as a function pointer rather | ||
61 | than a floating point constant. */ | ||
62 | #if @REPLACE_HUGE_VAL@ | ||
63 | # undef HUGE_VAL | ||
64 | # define HUGE_VAL (1.0 / 0.0) | ||
65 | #endif | ||
66 | |||
35 | /* Write x as | 67 | /* Write x as |
36 | x = mantissa * 2^exp | 68 | x = mantissa * 2^exp |
37 | where | 69 | where |
@@ -323,7 +355,8 @@ extern double trunc (double x); | |||
323 | #endif | 355 | #endif |
324 | 356 | ||
325 | #if @GNULIB_TRUNCL@ | 357 | #if @GNULIB_TRUNCL@ |
326 | # if !@HAVE_DECL_TRUNCL@ | 358 | # if @REPLACE_TRUNCL@ |
359 | # undef truncl | ||
327 | # define truncl rpl_truncl | 360 | # define truncl rpl_truncl |
328 | extern long double truncl (long double x); | 361 | extern long double truncl (long double x); |
329 | # endif | 362 | # endif |
@@ -352,6 +385,124 @@ extern int gl_isfinitel (long double x); | |||
352 | #endif | 385 | #endif |
353 | 386 | ||
354 | 387 | ||
388 | #if @GNULIB_ISINF@ | ||
389 | # if @REPLACE_ISINF@ | ||
390 | extern int gl_isinff (float x); | ||
391 | extern int gl_isinfd (double x); | ||
392 | extern int gl_isinfl (long double x); | ||
393 | # undef isinf | ||
394 | # define isinf(x) \ | ||
395 | (sizeof (x) == sizeof (long double) ? gl_isinfl (x) : \ | ||
396 | sizeof (x) == sizeof (double) ? gl_isinfd (x) : \ | ||
397 | gl_isinff (x)) | ||
398 | # endif | ||
399 | #elif defined GNULIB_POSIXCHECK | ||
400 | /* How to override a macro? */ | ||
401 | #endif | ||
402 | |||
403 | |||
404 | #if @GNULIB_ISNANF@ | ||
405 | /* Test for NaN for 'float' numbers. */ | ||
406 | # if @HAVE_ISNANF@ | ||
407 | /* The original <math.h> included above provides a declaration of isnan macro | ||
408 | or (older) isnanf function. */ | ||
409 | # include <math.h> | ||
410 | # if __GNUC__ >= 4 | ||
411 | /* GCC 4.0 and newer provides three built-ins for isnan. */ | ||
412 | # undef isnanf | ||
413 | # define isnanf(x) __builtin_isnanf ((float)(x)) | ||
414 | # elif defined isnan | ||
415 | # undef isnanf | ||
416 | # define isnanf(x) isnan ((float)(x)) | ||
417 | # endif | ||
418 | # else | ||
419 | /* Test whether X is a NaN. */ | ||
420 | # undef isnanf | ||
421 | # define isnanf rpl_isnanf | ||
422 | extern int isnanf (float x); | ||
423 | # endif | ||
424 | #endif | ||
425 | |||
426 | #if @GNULIB_ISNAND@ | ||
427 | /* Test for NaN for 'double' numbers. | ||
428 | This function is a gnulib extension, unlike isnan() which applied only | ||
429 | to 'double' numbers earlier but now is a type-generic macro. */ | ||
430 | # if @HAVE_ISNAND@ | ||
431 | /* The original <math.h> included above provides a declaration of isnan macro. */ | ||
432 | # include <math.h> | ||
433 | # if __GNUC__ >= 4 | ||
434 | /* GCC 4.0 and newer provides three built-ins for isnan. */ | ||
435 | # undef isnand | ||
436 | # define isnand(x) __builtin_isnan ((double)(x)) | ||
437 | # else | ||
438 | # undef isnand | ||
439 | # define isnand(x) isnan ((double)(x)) | ||
440 | # endif | ||
441 | # else | ||
442 | /* Test whether X is a NaN. */ | ||
443 | # undef isnand | ||
444 | # define isnand rpl_isnand | ||
445 | extern int isnand (double x); | ||
446 | # endif | ||
447 | #endif | ||
448 | |||
449 | #if @GNULIB_ISNANL@ | ||
450 | /* Test for NaN for 'long double' numbers. */ | ||
451 | # if @HAVE_ISNANL@ | ||
452 | /* The original <math.h> included above provides a declaration of isnan macro or (older) isnanl function. */ | ||
453 | # include <math.h> | ||
454 | # if __GNUC__ >= 4 | ||
455 | /* GCC 4.0 and newer provides three built-ins for isnan. */ | ||
456 | # undef isnanl | ||
457 | # define isnanl(x) __builtin_isnanl ((long double)(x)) | ||
458 | # elif defined isnan | ||
459 | # undef isnanl | ||
460 | # define isnanl(x) isnan ((long double)(x)) | ||
461 | # endif | ||
462 | # else | ||
463 | /* Test whether X is a NaN. */ | ||
464 | # undef isnanl | ||
465 | # define isnanl rpl_isnanl | ||
466 | extern int isnanl (long double x); | ||
467 | # endif | ||
468 | #endif | ||
469 | |||
470 | /* This must come *after* the snippets for GNULIB_ISNANF and GNULIB_ISNANL! */ | ||
471 | #if @GNULIB_ISNAN@ | ||
472 | # if @REPLACE_ISNAN@ | ||
473 | /* We can't just use the isnanf macro (e.g.) as exposed by | ||
474 | isnanf.h (e.g.) here, because those may end up being macros | ||
475 | that recursively expand back to isnan. So use the gnulib | ||
476 | replacements for them directly. */ | ||
477 | # if @HAVE_ISNANF@ && __GNUC__ >= 4 | ||
478 | # define gl_isnan_f(x) __builtin_isnan ((float)(x)) | ||
479 | # else | ||
480 | extern int rpl_isnanf (float x); | ||
481 | # define gl_isnan_f(x) rpl_isnanf (x) | ||
482 | # endif | ||
483 | # if @HAVE_ISNAND@ && __GNUC__ >= 4 | ||
484 | # define gl_isnan_d(x) __builtin_isnan ((double)(x)) | ||
485 | # else | ||
486 | extern int rpl_isnand (double x); | ||
487 | # define gl_isnan_d(x) rpl_isnand (x) | ||
488 | # endif | ||
489 | # if @HAVE_ISNANL@ && __GNUC__ >= 4 | ||
490 | # define gl_isnan_l(x) __builtin_isnan ((long double)(x)) | ||
491 | # else | ||
492 | extern int rpl_isnanl (long double x); | ||
493 | # define gl_isnan_l(x) rpl_isnanl (x) | ||
494 | # endif | ||
495 | # undef isnan | ||
496 | # define isnan(x) \ | ||
497 | (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \ | ||
498 | sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \ | ||
499 | gl_isnan_f (x)) | ||
500 | # endif | ||
501 | #elif defined GNULIB_POSIXCHECK | ||
502 | /* How to override a macro? */ | ||
503 | #endif | ||
504 | |||
505 | |||
355 | #if @GNULIB_SIGNBIT@ | 506 | #if @GNULIB_SIGNBIT@ |
356 | # if @REPLACE_SIGNBIT_USING_GCC@ | 507 | # if @REPLACE_SIGNBIT_USING_GCC@ |
357 | # undef signbit | 508 | # undef signbit |