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