Actual source code: mathinf.c

  1: #define PETSC_SKIP_COMPLEX
  2: #include <petscsys.h>
  3: /*@C
  4:       PetscIsNormalReal - Returns `PETSC_TRUE` if the input value satisfies `isnormal()`

  6:     Input Parameter:
  7: .     a - the PetscReal Value

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

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

 14:     Otherwise always returns true

 16:      Level: beginner

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

 37: /*@C
 38:       PetscIsInfReal - Returns whether the input is an infinity value.

 40:     Input Parameter:
 41: .     a - the floating point number

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

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

 48:      Level: beginner

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

 80: /*@C
 81:       PetscIsNanReal - Returns whether the input is a Not-a-Number (NaN) value.

 83:     Input Parameter:
 84: .     a - the floating point number

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

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

 92:      Level: beginner

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