174c01ffaSSatish Balay #if !defined(PETSC_SKIP_COMPLEX) 20c567f5aSSatish Balay #define PETSC_SKIP_COMPLEX 374c01ffaSSatish Balay #endif 474c01ffaSSatish Balay 5532fbc7fSSatish Balay #include <petscsys.h> 6532fbc7fSSatish Balay /*@C 7811af0c4SBarry Smith PetscIsNormalReal - Returns `PETSC_TRUE` if the input value satisfies `isnormal()` 8532fbc7fSSatish Balay 9532fbc7fSSatish Balay Input Parameter: 10667f096bSBarry Smith . a - the `PetscReal` Value 11667f096bSBarry Smith 12667f096bSBarry Smith Level: beginner 13532fbc7fSSatish Balay 14811af0c4SBarry Smith Developer Notes: 15811af0c4SBarry Smith Uses the C99 standard `isnormal()` on systems where they exist. 16811af0c4SBarry Smith 17811af0c4SBarry Smith Uses `isnormalq()` with `__float128` 18811af0c4SBarry Smith 19811af0c4SBarry Smith Otherwise always returns true 208b49ba18SBarry Smith 21811af0c4SBarry Smith .seealso: `PetscIsInfReal()`, `PetscIsNanReal()` 228b49ba18SBarry Smith @*/ 23570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) || defined(PETSC_USE_REAL___FP16) PetscIsNormalReal(PetscReal a)24d71ae5a4SJacob FaibussowitschPetscBool PetscIsNormalReal(PetscReal a) 25d71ae5a4SJacob Faibussowitsch { 268fa295daSBarry Smith return PETSC_TRUE; 278b49ba18SBarry Smith } 288b49ba18SBarry Smith #elif defined(PETSC_HAVE_ISNORMAL) PetscIsNormalReal(PetscReal a)29d71ae5a4SJacob FaibussowitschPetscBool PetscIsNormalReal(PetscReal a) 30d71ae5a4SJacob Faibussowitsch { 31bb88209dSBarry Smith return isnormal(a) ? PETSC_TRUE : PETSC_FALSE; 328b49ba18SBarry Smith } 338b49ba18SBarry Smith #else PetscIsNormalReal(PetscReal a)34d71ae5a4SJacob FaibussowitschPetscBool PetscIsNormalReal(PetscReal a) 35d71ae5a4SJacob Faibussowitsch { 368b49ba18SBarry Smith return PETSC_TRUE; 378b49ba18SBarry Smith } 388b49ba18SBarry Smith #endif 398b49ba18SBarry Smith 40*60634426SJames Wright #if defined(PETSC_HAVE_NO_FINITE_MATH_ONLY) 41*60634426SJames Wright #define PETSC_FORCE_NO_FINITE_MATH_ONLY __attribute__((optimize("no-finite-math-only"))) 42*60634426SJames Wright #else 43*60634426SJames Wright #define PETSC_FORCE_NO_FINITE_MATH_ONLY 44*60634426SJames Wright #endif 45*60634426SJames Wright 468b49ba18SBarry Smith /*@C 47667f096bSBarry Smith PetscIsInfReal - Returns whether the `PetscReal` input is an infinity value. 488b49ba18SBarry Smith 498b49ba18SBarry Smith Input Parameter: 508b49ba18SBarry Smith . a - the floating point number 51532fbc7fSSatish Balay 52667f096bSBarry Smith Level: beginner 53667f096bSBarry Smith 54811af0c4SBarry Smith Developer Notes: 55811af0c4SBarry Smith Uses the C99 standard `isinf()` on systems where it exists. 56811af0c4SBarry Smith 57811af0c4SBarry Smith Otherwise uses (a && a/2 == a), note that some optimizing compilers compile out this form, thus removing the check. 58532fbc7fSSatish Balay 59811af0c4SBarry Smith .seealso: `PetscIsNormalReal()`, `PetscIsNanReal()` 60532fbc7fSSatish Balay @*/ 61532fbc7fSSatish Balay #if defined(PETSC_USE_REAL___FLOAT128) PetscIsInfReal(PetscReal a)62d71ae5a4SJacob FaibussowitschPetscBool PetscIsInfReal(PetscReal a) 63d71ae5a4SJacob Faibussowitsch { 649f4f8022SLisandro Dalcin return isinfq(a) ? PETSC_TRUE : PETSC_FALSE; 65532fbc7fSSatish Balay } 669f4f8022SLisandro Dalcin #elif defined(PETSC_HAVE_ISINF) PetscIsInfReal(PetscReal a)67*60634426SJames WrightPETSC_FORCE_NO_FINITE_MATH_ONLY PetscBool PetscIsInfReal(PetscReal a) 68d71ae5a4SJacob Faibussowitsch { 699f4f8022SLisandro Dalcin return isinf(a) ? PETSC_TRUE : PETSC_FALSE; 70532fbc7fSSatish Balay } 719f4f8022SLisandro Dalcin #elif defined(PETSC_HAVE__FINITE) 72532fbc7fSSatish Balay #if defined(PETSC_HAVE_FLOAT_H) 73aaa7dc30SBarry Smith #include <float.h> /* Microsoft Windows defines _finite() in float.h */ 74532fbc7fSSatish Balay #endif 75532fbc7fSSatish Balay #if defined(PETSC_HAVE_IEEEFP_H) 76aaa7dc30SBarry Smith #include <ieeefp.h> /* Solaris prototypes these here */ 77532fbc7fSSatish Balay #endif PetscIsInfReal(PetscReal a)78d71ae5a4SJacob FaibussowitschPetscBool PetscIsInfReal(PetscReal a) 79d71ae5a4SJacob Faibussowitsch { 809f4f8022SLisandro Dalcin return !_finite(a) ? PETSC_TRUE : PETSC_FALSE; 81532fbc7fSSatish Balay } 82532fbc7fSSatish Balay #else PetscIsInfReal(PetscReal a)83d71ae5a4SJacob FaibussowitschPetscBool PetscIsInfReal(PetscReal a) 84d71ae5a4SJacob Faibussowitsch { 859f4f8022SLisandro Dalcin return (a && a / 2 == a) ? PETSC_TRUE : PETSC_FALSE; 86532fbc7fSSatish Balay } 87532fbc7fSSatish Balay #endif 88532fbc7fSSatish Balay 89bae46576SBarry Smith /*@C 90667f096bSBarry Smith PetscIsNanReal - Returns whether the `PetscReal` input is a Not-a-Number (NaN) value. 91bae46576SBarry Smith 92bae46576SBarry Smith Input Parameter: 93bae46576SBarry Smith . a - the floating point number 94bae46576SBarry Smith 95667f096bSBarry Smith Level: beginner 96667f096bSBarry Smith 97811af0c4SBarry Smith Developer Notes: 98811af0c4SBarry Smith Uses the C99 standard `isnan()` on systems where it exists. 99811af0c4SBarry Smith 100811af0c4SBarry Smith Otherwise uses (a != a), note that some optimizing compilers compile 101bae46576SBarry Smith out this form, thus removing the check. 102bae46576SBarry Smith 103811af0c4SBarry Smith .seealso: `PetscIsNormalReal()`, `PetscIsInfReal()` 104bae46576SBarry Smith @*/ 105bae46576SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) PetscIsNanReal(PetscReal a)106d71ae5a4SJacob FaibussowitschPetscBool PetscIsNanReal(PetscReal a) 107d71ae5a4SJacob Faibussowitsch { 1083948c36eSLisandro Dalcin return isnanq(a) ? PETSC_TRUE : PETSC_FALSE; 109bae46576SBarry Smith } 1103948c36eSLisandro Dalcin #elif defined(PETSC_HAVE_ISNAN) PetscIsNanReal(PetscReal a)111*60634426SJames WrightPETSC_FORCE_NO_FINITE_MATH_ONLY PetscBool PetscIsNanReal(PetscReal a) 112d71ae5a4SJacob Faibussowitsch { 1133948c36eSLisandro Dalcin return isnan(a) ? PETSC_TRUE : PETSC_FALSE; 114bae46576SBarry Smith } 1153948c36eSLisandro Dalcin #elif defined(PETSC_HAVE__ISNAN) 116bae46576SBarry Smith #if defined(PETSC_HAVE_FLOAT_H) 1173948c36eSLisandro Dalcin #include <float.h> /* Microsoft Windows defines _isnan() in float.h */ 118bae46576SBarry Smith #endif 119bae46576SBarry Smith #if defined(PETSC_HAVE_IEEEFP_H) 120bae46576SBarry Smith #include <ieeefp.h> /* Solaris prototypes these here */ 121bae46576SBarry Smith #endif PetscIsNanReal(PetscReal a)122d71ae5a4SJacob FaibussowitschPetscBool PetscIsNanReal(PetscReal a) 123d71ae5a4SJacob Faibussowitsch { 1243948c36eSLisandro Dalcin return _isnan(a) ? PETSC_TRUE : PETSC_FALSE; 125bae46576SBarry Smith } 126bae46576SBarry Smith #else PetscIsNanReal(PetscReal a)127d71ae5a4SJacob FaibussowitschPetscBool PetscIsNanReal(PetscReal a) 128d71ae5a4SJacob Faibussowitsch { 1293948c36eSLisandro Dalcin return (a != a) ? PETSC_TRUE : PETSC_FALSE; 130bae46576SBarry Smith } 131bae46576SBarry Smith #endif 132