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