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 |
