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. 4 5 Input Parameter: 6 . a - the double 7 8 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. 12 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 50 51