Actual source code: mathinf.c

      1: #if !defined(PETSC_SKIP_COMPLEX)
      2:   #define PETSC_SKIP_COMPLEX
      3: #endif

      5: #include <petscsys.h>
      6: /*@C
      7:   PetscIsNormalReal - Returns `PETSC_TRUE` if the input value satisfies `isnormal()`

      9:   Input Parameter:
     10: . a - the `PetscReal` Value

     12:   Level: beginner

     14:   Developer Notes:
     15:   Uses the C99 standard `isnormal()` on systems where they exist.

     17:   Uses `isnormalq()` with `__float128`

     19:   Otherwise always returns true

     21: .seealso: `PetscIsInfReal()`, `PetscIsNanReal()`
     22: @*/
     23: #if defined(PETSC_USE_REAL___FLOAT128) || defined(PETSC_USE_REAL___FP16)
     24: PetscBool PetscIsNormalReal(PetscReal a)
     25: {
     26:   return PETSC_TRUE;
     27: }
     28: #elif defined(PETSC_HAVE_ISNORMAL)
     29: PetscBool PetscIsNormalReal(PetscReal a)
     30: {
     31:   return isnormal(a) ? PETSC_TRUE : PETSC_FALSE;
     32: }
     33: #else
     34: PetscBool PetscIsNormalReal(PetscReal a)
     35: {
     36:   return PETSC_TRUE;
     37: }
     38: #endif

     40: #if defined(PETSC_HAVE_NO_FINITE_MATH_ONLY)
     41:   #define PETSC_FORCE_NO_FINITE_MATH_ONLY __attribute__((optimize("no-finite-math-only")))
     42: #else
     43:   #define PETSC_FORCE_NO_FINITE_MATH_ONLY
     44: #endif

     46: /*@C
     47:   PetscIsInfReal - Returns whether the `PetscReal` input is an infinity value.

     49:   Input Parameter:
     50: . a - the floating point number

     52:   Level: beginner

     54:   Developer Notes:
     55:   Uses the C99 standard `isinf()` on systems where it exists.

     57:   Otherwise uses (a && a/2 == a), note that some optimizing compilers compile out this form, thus removing the check.

     59: .seealso: `PetscIsNormalReal()`, `PetscIsNanReal()`
     60: @*/
     61: #if defined(PETSC_USE_REAL___FLOAT128)
     62: PetscBool PetscIsInfReal(PetscReal a)
     63: {
     64:   return isinfq(a) ? PETSC_TRUE : PETSC_FALSE;
     65: }
     66: #elif defined(PETSC_HAVE_ISINF)
     67: PETSC_FORCE_NO_FINITE_MATH_ONLY PetscBool PetscIsInfReal(PetscReal a)
     68: {
     69:   return isinf(a) ? PETSC_TRUE : PETSC_FALSE;
     70: }
     71: #elif defined(PETSC_HAVE__FINITE)
     72:   #if defined(PETSC_HAVE_FLOAT_H)
     73:     #include <float.h> /* Microsoft Windows defines _finite() in float.h */
     74:   #endif
     75:   #if defined(PETSC_HAVE_IEEEFP_H)
     76:     #include <ieeefp.h> /* Solaris prototypes these here */
     77:   #endif
     78: PetscBool PetscIsInfReal(PetscReal a)
     79: {
     80:   return !_finite(a) ? PETSC_TRUE : PETSC_FALSE;
     81: }
     82: #else
     83: PetscBool PetscIsInfReal(PetscReal a)
     84: {
     85:   return (a && a / 2 == a) ? PETSC_TRUE : PETSC_FALSE;
     86: }
     87: #endif

     89: /*@C
     90:   PetscIsNanReal - Returns whether the `PetscReal` input is a Not-a-Number (NaN) value.

     92:   Input Parameter:
     93: . a - the floating point number

     95:   Level: beginner

     97:   Developer Notes:
     98:   Uses the C99 standard `isnan()` on systems where it exists.

    100:   Otherwise uses (a != a), note that some optimizing compilers compile
    101:   out this form, thus removing the check.

    103: .seealso: `PetscIsNormalReal()`, `PetscIsInfReal()`
    104: @*/
    105: #if defined(PETSC_USE_REAL___FLOAT128)
    106: PetscBool PetscIsNanReal(PetscReal a)
    107: {
    108:   return isnanq(a) ? PETSC_TRUE : PETSC_FALSE;
    109: }
    110: #elif defined(PETSC_HAVE_ISNAN)
    111: PETSC_FORCE_NO_FINITE_MATH_ONLY PetscBool PetscIsNanReal(PetscReal a)
    112: {
    113:   return isnan(a) ? PETSC_TRUE : PETSC_FALSE;
    114: }
    115: #elif defined(PETSC_HAVE__ISNAN)
    116:   #if defined(PETSC_HAVE_FLOAT_H)
    117:     #include <float.h> /* Microsoft Windows defines _isnan() in float.h */
    118:   #endif
    119:   #if defined(PETSC_HAVE_IEEEFP_H)
    120:     #include <ieeefp.h> /* Solaris prototypes these here */
    121:   #endif
    122: PetscBool PetscIsNanReal(PetscReal a)
    123: {
    124:   return _isnan(a) ? PETSC_TRUE : PETSC_FALSE;
    125: }
    126: #else
    127: PetscBool PetscIsNanReal(PetscReal a)
    128: {
    129:   return (a != a) ? PETSC_TRUE : PETSC_FALSE;
    130: }
    131: #endif