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