1532fbc7fSSatish Balay #include <petscsys.h> 2532fbc7fSSatish Balay /*@C 3532fbc7fSSatish Balay PetscIsInfOrNan - Returns 1 if the input double has an infinity for Not-a-number (Nan) value, otherwise 0. 4532fbc7fSSatish Balay 5532fbc7fSSatish Balay Input Parameter: 6532fbc7fSSatish Balay . a - the double 7532fbc7fSSatish Balay 8532fbc7fSSatish Balay 9532fbc7fSSatish Balay Notes: uses the C99 standard isinf() and isnan() on systems where they exist. 10532fbc7fSSatish Balay Otherwises uses ((a - a) != 0.0), note that some optimizing compiles compile 11532fbc7fSSatish Balay out this form, thus removing the check. 12532fbc7fSSatish Balay 13532fbc7fSSatish Balay Level: beginner 14532fbc7fSSatish Balay @*/ 15532fbc7fSSatish Balay #if defined(PETSC_USE_REAL___FLOAT128) 16*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 17*f48dab2eSKarl Rupp { 18532fbc7fSSatish Balay return isinfq(PetscAbsScalar(a)) || isnanq(PetscAbsScalar(a)); 19532fbc7fSSatish Balay } 20*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 21*f48dab2eSKarl Rupp { 22532fbc7fSSatish Balay return isinfq(a) || isnanq(a); 23532fbc7fSSatish Balay } 24532fbc7fSSatish Balay #elif defined(PETSC_HAVE_ISINF) && defined(PETSC_HAVE_ISNAN) 25*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 26*f48dab2eSKarl Rupp { 27532fbc7fSSatish Balay return isinf(PetscAbsScalar(a)) || isnan(PetscAbsScalar(a)); 28532fbc7fSSatish Balay } 29*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 30*f48dab2eSKarl Rupp { 31532fbc7fSSatish Balay return isinf(a) || isnan(a); 32532fbc7fSSatish Balay } 33532fbc7fSSatish Balay #elif defined(PETSC_HAVE__FINITE) && defined(PETSC_HAVE__ISNAN) 34532fbc7fSSatish Balay #if defined(PETSC_HAVE_FLOAT_H) 35532fbc7fSSatish Balay #include "float.h" /* Microsoft Windows defines _finite() in float.h */ 36532fbc7fSSatish Balay #endif 37532fbc7fSSatish Balay #if defined(PETSC_HAVE_IEEEFP_H) 38532fbc7fSSatish Balay #include "ieeefp.h" /* Solaris prototypes these here */ 39532fbc7fSSatish Balay #endif 40*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 41*f48dab2eSKarl Rupp { 42532fbc7fSSatish Balay return !_finite(PetscAbsScalar(a)) || _isnan(PetscAbsScalar(a)); 43532fbc7fSSatish Balay } 44*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 45*f48dab2eSKarl Rupp { 46532fbc7fSSatish Balay return !_finite(a) || _isnan(a); 47532fbc7fSSatish Balay } 48532fbc7fSSatish Balay #else 49*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 50*f48dab2eSKarl Rupp { 51532fbc7fSSatish Balay return ((a - a) != (PetscScalar)0); 52532fbc7fSSatish Balay } 53*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 54*f48dab2eSKarl Rupp { 55532fbc7fSSatish Balay return ((a - a) != 0); 56532fbc7fSSatish Balay } 57532fbc7fSSatish Balay #endif 58532fbc7fSSatish Balay 59