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: return isinfq(PetscAbsScalar(a)) || isnanq(PetscAbsScalar(a)); 18: } 19: PetscErrorCode PetscIsInfOrNanReal(PetscReal a) { 20: return isinfq(a) || isnanq(a); 21: } 22: #elif defined(PETSC_HAVE_ISINF) && defined(PETSC_HAVE_ISNAN) 23: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) { 24: return isinf(PetscAbsScalar(a)) || isnan(PetscAbsScalar(a)); 25: } 26: PetscErrorCode PetscIsInfOrNanReal(PetscReal a) { 27: return isinf(a) || isnan(a); 28: } 29: #elif defined(PETSC_HAVE__FINITE) && defined(PETSC_HAVE__ISNAN) 30: #if defined(PETSC_HAVE_FLOAT_H) 31: #include "float.h" /* Microsoft Windows defines _finite() in float.h */ 32: #endif 33: #if defined(PETSC_HAVE_IEEEFP_H) 34: #include "ieeefp.h" /* Solaris prototypes these here */ 35: #endif 36: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) { 37: return !_finite(PetscAbsScalar(a)) || _isnan(PetscAbsScalar(a)); 38: } 39: PetscErrorCode PetscIsInfOrNanReal(PetscReal a) { 40: return !_finite(a) || _isnan(a); 41: } 42: #else 43: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) { 44: return ((a - a) != (PetscScalar)0); 45: } 46: PetscErrorCode PetscIsInfOrNanReal(PetscReal a) { 47: return ((a - a) != 0); 48: } 49: #endif