1: #include <petscsys.h> 2: /*@C 3: PetscIsNormal - Returns PETSC_TRUE if the input value satisfies isnormal() 5: Input Parameter: 6: . a - the PetscRealValue 8: Notes: uses the C99 standard isnormal() on systems where they exist. 9: Uses isnormalq() with __float128 10: Otherwises always returns true 12: Level: beginner 13: @*/ 14: #if defined(PETSC_USE_REAL___FLOAT128) 15: PetscBool PetscIsNormalScalar(PetscScalar a) 16: { 17: return PETSC_TRUE; 18: } 19: PetscBool PetscIsNormalReal(PetscReal a) 20: { 21: return PETSC_TRUE; 22: } 23: #elif defined(PETSC_HAVE_ISNORMAL) 24: PetscBool PetscIsNormalScalar(PetscScalar a) 25: { 26: return isnormal(PetscAbsScalar(a)) ? PETSC_TRUE : PETSC_FALSE; 27: } 28: PetscBool PetscIsNormalReal(PetscReal a) 29: { 30: return isnormal(a) ? PETSC_TRUE : PETSC_FALSE; 31: } 32: #else 33: PetscBool PetscIsNormalScalar(PetscScalar a) 34: { 35: return PETSC_TRUE; 36: } 37: PetscBool PetscIsNormalReal(PetscReal a) 38: { 39: return PETSC_TRUE; 40: } 41: #endif 43: /*@C 44: PetscIsInfOrNan - Returns an error code if the input double has an infinity for Not-a-number (Nan) value, otherwise 0. 46: Input Parameter: 47: . a - the floating point number 49: Notes: uses the C99 standard isinf() and isnan() on systems where they exist. 50: Otherwises uses ((a - a) != 0.0), note that some optimizing compiles compile 51: out this form, thus removing the check. 53: Level: beginner 54: @*/ 55: #if defined(PETSC_USE_REAL___FLOAT128) 56: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 57: { 58: return isinfq(PetscAbsScalar(a)) || isnanq(PetscAbsScalar(a)); 59: } 60: PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 61: { 62: return isinfq(a) || isnanq(a); 63: } 64: #elif defined(PETSC_HAVE_ISINF) && defined(PETSC_HAVE_ISNAN) 65: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 66: { 67: return isinf(PetscAbsScalar(a)) || isnan(PetscAbsScalar(a)); 68: } 69: PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 70: { 71: return isinf(a) || isnan(a); 72: } 73: #elif defined(PETSC_HAVE__FINITE) && defined(PETSC_HAVE__ISNAN) 74: #if defined(PETSC_HAVE_FLOAT_H) 75: #include <float.h> /* Microsoft Windows defines _finite() in float.h */ 76: #endif 77: #if defined(PETSC_HAVE_IEEEFP_H) 78: #include <ieeefp.h> /* Solaris prototypes these here */ 79: #endif 80: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 81: { 82: return !_finite(PetscAbsScalar(a)) || _isnan(PetscAbsScalar(a)); 83: } 84: PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 85: { 86: return !_finite(a) || _isnan(a); 87: } 88: #else 89: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 90: { 91: return ((a - a) != (PetscScalar)0); 92: } 93: PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 94: { 95: return ((a - a) != 0); 96: } 97: #endif