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: Notes: 10: uses the C99 standard isnormal() on systems where they exist. 11: Uses isnormalq() with __float128 12: Otherwises always returns true 14: Level: beginner 15: @*/ 16: #if defined(PETSC_USE_REAL___FLOAT128) || defined(PETSC_USE_REAL___FP16) 17: PetscBool PetscIsNormalReal(PetscReal a) 18: { 19: return PETSC_TRUE; 20: } 21: #elif defined(PETSC_HAVE_ISNORMAL) 22: PetscBool PetscIsNormalReal(PetscReal a) 23: { 24: return isnormal(a) ? PETSC_TRUE : PETSC_FALSE; 25: } 26: #else 27: PetscBool PetscIsNormalReal(PetscReal a) 28: { 29: return PETSC_TRUE; 30: } 31: #endif 33: /*@C 34: PetscIsInfReal - Returns whether the input is an infinity value. 36: Input Parameter: 37: . a - the floating point number 39: Notes: 40: uses the C99 standard isinf() on systems where it exists. 41: Otherwises uses (a && a/2 == a), note that some optimizing compiles compile 42: out this form, thus removing the check. 44: Level: beginner 45: @*/ 46: #if defined(PETSC_USE_REAL___FLOAT128) 47: PetscBool PetscIsInfReal(PetscReal a) 48: { 49: return isinfq(a) ? PETSC_TRUE : PETSC_FALSE; 50: } 51: #elif defined(PETSC_HAVE_ISINF) 52: PetscBool PetscIsInfReal(PetscReal a) 53: { 54: return isinf(a) ? PETSC_TRUE : PETSC_FALSE; 55: } 56: #elif defined(PETSC_HAVE__FINITE) 57: #if defined(PETSC_HAVE_FLOAT_H) 58: #include <float.h> /* Microsoft Windows defines _finite() in float.h */ 59: #endif 60: #if defined(PETSC_HAVE_IEEEFP_H) 61: #include <ieeefp.h> /* Solaris prototypes these here */ 62: #endif 63: PetscBool PetscIsInfReal(PetscReal a) 64: { 65: return !_finite(a) ? PETSC_TRUE : PETSC_FALSE; 66: } 67: #else 68: PetscBool PetscIsInfReal(PetscReal a) 69: { 70: return (a && a/2 == a) ? PETSC_TRUE : PETSC_FALSE; 71: } 72: #endif 74: /*@C 75: PetscIsNanReal - Returns whether the input is a Not-a-Number (NaN) value. 77: Input Parameter: 78: . a - the floating point number 80: Notes: 81: uses the C99 standard isnan() on systems where it exists. 82: Otherwises uses (a != a), note that some optimizing compiles compile 83: out this form, thus removing the check. 85: Level: beginner 86: @*/ 87: #if defined(PETSC_USE_REAL___FLOAT128) 88: PetscBool PetscIsNanReal(PetscReal a) 89: { 90: return isnanq(a) ? PETSC_TRUE : PETSC_FALSE; 91: } 92: #elif defined(PETSC_HAVE_ISNAN) 93: PetscBool PetscIsNanReal(PetscReal a) 94: { 95: return isnan(a) ? PETSC_TRUE : PETSC_FALSE; 96: } 97: #elif defined(PETSC_HAVE__ISNAN) 98: #if defined(PETSC_HAVE_FLOAT_H) 99: #include <float.h> /* Microsoft Windows defines _isnan() in float.h */ 100: #endif 101: #if defined(PETSC_HAVE_IEEEFP_H) 102: #include <ieeefp.h> /* Solaris prototypes these here */ 103: #endif 104: PetscBool PetscIsNanReal(PetscReal a) 105: { 106: return _isnan(a) ? PETSC_TRUE : PETSC_FALSE; 107: } 108: #else 109: PetscBool PetscIsNanReal(PetscReal a) 110: { 111: return (a != a) ? PETSC_TRUE : PETSC_FALSE; 112: } 113: #endif