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: /*@C
 41:   PetscIsInfReal - Returns whether the `PetscReal` input is an infinity value.

 43:   Input Parameter:
 44: . a - the floating point number

 46:   Level: beginner

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

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

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

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

 86:   Input Parameter:
 87: . a - the floating point number

 89:   Level: beginner

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

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

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