1532fbc7fSSatish Balay #include <petscsys.h> 2532fbc7fSSatish Balay /*@C 38b49ba18SBarry Smith PetscIsNormal - Returns PETSC_TRUE if the input value satisfies isnormal() 4532fbc7fSSatish Balay 5532fbc7fSSatish Balay Input Parameter: 68b49ba18SBarry Smith . a - the PetscRealValue 7532fbc7fSSatish Balay 88b49ba18SBarry Smith Notes: uses the C99 standard isnormal() on systems where they exist. 98b49ba18SBarry Smith Uses isnormalq() with __float128 108b49ba18SBarry Smith Otherwises always returns true 118b49ba18SBarry Smith 128b49ba18SBarry Smith Level: beginner 138b49ba18SBarry Smith @*/ 148b49ba18SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) 158b49ba18SBarry Smith PetscBool PetscIsNormalScalar(PetscScalar a) 168b49ba18SBarry Smith { 178fa295daSBarry Smith return PETSC_TRUE; 188b49ba18SBarry Smith } 198b49ba18SBarry Smith PetscBool PetscIsNormalReal(PetscReal a) 208b49ba18SBarry Smith { 218fa295daSBarry Smith return PETSC_TRUE; 228b49ba18SBarry Smith } 238b49ba18SBarry Smith #elif defined(PETSC_HAVE_ISNORMAL) 248b49ba18SBarry Smith PetscBool PetscIsNormalScalar(PetscScalar a) 258b49ba18SBarry Smith { 26*bb88209dSBarry Smith return isnormal(PetscAbsScalar(a)) ? PETSC_TRUE : PETSC_FALSE; 278b49ba18SBarry Smith } 288b49ba18SBarry Smith PetscBool PetscIsNormalReal(PetscReal a) 298b49ba18SBarry Smith { 30*bb88209dSBarry Smith return isnormal(a) ? PETSC_TRUE : PETSC_FALSE; 318b49ba18SBarry Smith } 328b49ba18SBarry Smith #else 338b49ba18SBarry Smith PetscBool PetscIsNormalScalar(PetscScalar a) 348b49ba18SBarry Smith { 358b49ba18SBarry Smith return PETSC_TRUE; 368b49ba18SBarry Smith } 378b49ba18SBarry Smith PetscBool PetscIsNormalReal(PetscReal a) 388b49ba18SBarry Smith { 398b49ba18SBarry Smith return PETSC_TRUE; 408b49ba18SBarry Smith } 418b49ba18SBarry Smith #endif 428b49ba18SBarry Smith 438b49ba18SBarry Smith /*@C 448b49ba18SBarry Smith PetscIsInfOrNan - Returns an error code if the input double has an infinity for Not-a-number (Nan) value, otherwise 0. 458b49ba18SBarry Smith 468b49ba18SBarry Smith Input Parameter: 478b49ba18SBarry Smith . a - the floating point number 48532fbc7fSSatish Balay 49532fbc7fSSatish Balay Notes: uses the C99 standard isinf() and isnan() on systems where they exist. 50532fbc7fSSatish Balay Otherwises uses ((a - a) != 0.0), note that some optimizing compiles compile 51532fbc7fSSatish Balay out this form, thus removing the check. 52532fbc7fSSatish Balay 53532fbc7fSSatish Balay Level: beginner 54532fbc7fSSatish Balay @*/ 55532fbc7fSSatish Balay #if defined(PETSC_USE_REAL___FLOAT128) 56f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 57f48dab2eSKarl Rupp { 58532fbc7fSSatish Balay return isinfq(PetscAbsScalar(a)) || isnanq(PetscAbsScalar(a)); 59532fbc7fSSatish Balay } 60f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 61f48dab2eSKarl Rupp { 62532fbc7fSSatish Balay return isinfq(a) || isnanq(a); 63532fbc7fSSatish Balay } 64532fbc7fSSatish Balay #elif defined(PETSC_HAVE_ISINF) && defined(PETSC_HAVE_ISNAN) 65f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 66f48dab2eSKarl Rupp { 67532fbc7fSSatish Balay return isinf(PetscAbsScalar(a)) || isnan(PetscAbsScalar(a)); 68532fbc7fSSatish Balay } 69f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 70f48dab2eSKarl Rupp { 71532fbc7fSSatish Balay return isinf(a) || isnan(a); 72532fbc7fSSatish Balay } 73532fbc7fSSatish Balay #elif defined(PETSC_HAVE__FINITE) && defined(PETSC_HAVE__ISNAN) 74532fbc7fSSatish Balay #if defined(PETSC_HAVE_FLOAT_H) 75532fbc7fSSatish Balay #include "float.h" /* Microsoft Windows defines _finite() in float.h */ 76532fbc7fSSatish Balay #endif 77532fbc7fSSatish Balay #if defined(PETSC_HAVE_IEEEFP_H) 78532fbc7fSSatish Balay #include "ieeefp.h" /* Solaris prototypes these here */ 79532fbc7fSSatish Balay #endif 80f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 81f48dab2eSKarl Rupp { 82532fbc7fSSatish Balay return !_finite(PetscAbsScalar(a)) || _isnan(PetscAbsScalar(a)); 83532fbc7fSSatish Balay } 84f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 85f48dab2eSKarl Rupp { 86532fbc7fSSatish Balay return !_finite(a) || _isnan(a); 87532fbc7fSSatish Balay } 88532fbc7fSSatish Balay #else 89f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) 90f48dab2eSKarl Rupp { 91532fbc7fSSatish Balay return ((a - a) != (PetscScalar)0); 92532fbc7fSSatish Balay } 93f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanReal(PetscReal a) 94f48dab2eSKarl Rupp { 95532fbc7fSSatish Balay return ((a - a) != 0); 96532fbc7fSSatish Balay } 97532fbc7fSSatish Balay #endif 98532fbc7fSSatish Balay 99