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