1: #include <petscsys.h> 2: /*@C 3: PetscIsInfOrNan - Returns 1 if the input double has an infinity for Not-a-number (Nan) value, otherwise 0. 5: Input Parameter: 6: . a - the double 9: Notes: uses the C99 standard isinf() and isnan() on systems where they exist. 10: Otherwises uses ((a - a) != 0.0), note that some optimizing compiles compile 11: out this form, thus removing the check. 13: Level: beginner 14: @*/ 15: #if defined(PETSC_USE_REAL___FLOAT128) 16: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 17: { 18: return isinfq(PetscAbsScalar(a)) || isnanq(PetscAbsScalar(a)); 19: } 20: PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 21: { 22: return isinfq(a) || isnanq(a); 23: } 24: #elif defined(PETSC_HAVE_ISINF) && defined(PETSC_HAVE_ISNAN) 25: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 26: { 27: return isinf(PetscAbsScalar(a)) || isnan(PetscAbsScalar(a)); 28: } 29: PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 30: { 31: return isinf(a) || isnan(a); 32: } 33: #elif defined(PETSC_HAVE__FINITE) && defined(PETSC_HAVE__ISNAN) 34: #if defined(PETSC_HAVE_FLOAT_H) 35: #include "float.h" /* Microsoft Windows defines _finite() in float.h */ 36: #endif 37: #if defined(PETSC_HAVE_IEEEFP_H) 38: #include "ieeefp.h" /* Solaris prototypes these here */ 39: #endif 40: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 41: { 42: return !_finite(PetscAbsScalar(a)) || _isnan(PetscAbsScalar(a)); 43: } 44: PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 45: { 46: return !_finite(a) || _isnan(a); 47: } 48: #else 49: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 50: { 51: return ((a - a) != (PetscScalar)0); 52: } 53: PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 54: { 55: return ((a - a) != 0); 56: } 57: #endif