xref: /petsc/src/sys/utils/mathinf.c (revision 55cda6f51c86a483abe5781578f3bbdf986e1625)
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 Faibussowitsch PetscBool PetscIsNormalReal(PetscReal a)
25d71ae5a4SJacob Faibussowitsch {
268fa295daSBarry Smith   return PETSC_TRUE;
278b49ba18SBarry Smith }
288b49ba18SBarry Smith #elif defined(PETSC_HAVE_ISNORMAL)
PetscIsNormalReal(PetscReal a)29d71ae5a4SJacob Faibussowitsch PetscBool PetscIsNormalReal(PetscReal a)
30d71ae5a4SJacob Faibussowitsch {
31bb88209dSBarry Smith   return isnormal(a) ? PETSC_TRUE : PETSC_FALSE;
328b49ba18SBarry Smith }
338b49ba18SBarry Smith #else
PetscIsNormalReal(PetscReal a)34d71ae5a4SJacob Faibussowitsch PetscBool 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 Faibussowitsch PetscBool 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 Wright PETSC_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 Faibussowitsch PetscBool PetscIsInfReal(PetscReal a)
79d71ae5a4SJacob Faibussowitsch {
809f4f8022SLisandro Dalcin   return !_finite(a) ? PETSC_TRUE : PETSC_FALSE;
81532fbc7fSSatish Balay }
82532fbc7fSSatish Balay #else
PetscIsInfReal(PetscReal a)83d71ae5a4SJacob Faibussowitsch PetscBool 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 Faibussowitsch PetscBool 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 Wright PETSC_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 Faibussowitsch PetscBool PetscIsNanReal(PetscReal a)
123d71ae5a4SJacob Faibussowitsch {
1243948c36eSLisandro Dalcin   return _isnan(a) ? PETSC_TRUE : PETSC_FALSE;
125bae46576SBarry Smith }
126bae46576SBarry Smith #else
PetscIsNanReal(PetscReal a)127d71ae5a4SJacob Faibussowitsch PetscBool PetscIsNanReal(PetscReal a)
128d71ae5a4SJacob Faibussowitsch {
1293948c36eSLisandro Dalcin   return (a != a) ? PETSC_TRUE : PETSC_FALSE;
130bae46576SBarry Smith }
131bae46576SBarry Smith #endif
132