xref: /petsc/src/sys/utils/mathinf.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
10c567f5aSSatish Balay #define PETSC_SKIP_COMPLEX
2532fbc7fSSatish Balay #include <petscsys.h>
3532fbc7fSSatish Balay /*@C
4811af0c4SBarry Smith       PetscIsNormalReal - Returns `PETSC_TRUE` if the input value satisfies `isnormal()`
5532fbc7fSSatish Balay 
6532fbc7fSSatish Balay     Input Parameter:
78b49ba18SBarry Smith .     a - the PetscReal Value
8532fbc7fSSatish Balay 
9811af0c4SBarry Smith     Developer Notes:
10811af0c4SBarry Smith     Uses the C99 standard `isnormal()` on systems where they exist.
11811af0c4SBarry Smith 
12811af0c4SBarry Smith     Uses `isnormalq()` with `__float128`
13811af0c4SBarry Smith 
14811af0c4SBarry Smith     Otherwise always returns true
158b49ba18SBarry Smith 
168b49ba18SBarry Smith      Level: beginner
17811af0c4SBarry Smith 
18811af0c4SBarry Smith .seealso: `PetscIsInfReal()`, `PetscIsNanReal()`
198b49ba18SBarry Smith @*/
20570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) || defined(PETSC_USE_REAL___FP16)
21*d71ae5a4SJacob Faibussowitsch PetscBool PetscIsNormalReal(PetscReal a)
22*d71ae5a4SJacob Faibussowitsch {
238fa295daSBarry Smith   return PETSC_TRUE;
248b49ba18SBarry Smith }
258b49ba18SBarry Smith #elif defined(PETSC_HAVE_ISNORMAL)
26*d71ae5a4SJacob Faibussowitsch PetscBool PetscIsNormalReal(PetscReal a)
27*d71ae5a4SJacob Faibussowitsch {
28bb88209dSBarry Smith   return isnormal(a) ? PETSC_TRUE : PETSC_FALSE;
298b49ba18SBarry Smith }
308b49ba18SBarry Smith #else
31*d71ae5a4SJacob Faibussowitsch PetscBool PetscIsNormalReal(PetscReal a)
32*d71ae5a4SJacob Faibussowitsch {
338b49ba18SBarry Smith   return PETSC_TRUE;
348b49ba18SBarry Smith }
358b49ba18SBarry Smith #endif
368b49ba18SBarry Smith 
378b49ba18SBarry Smith /*@C
389f4f8022SLisandro Dalcin       PetscIsInfReal - Returns whether the input is an infinity value.
398b49ba18SBarry Smith 
408b49ba18SBarry Smith     Input Parameter:
418b49ba18SBarry Smith .     a - the floating point number
42532fbc7fSSatish Balay 
43811af0c4SBarry Smith     Developer Notes:
44811af0c4SBarry Smith     Uses the C99 standard `isinf()` on systems where it exists.
45811af0c4SBarry Smith 
46811af0c4SBarry Smith     Otherwise uses (a && a/2 == a), note that some optimizing compilers compile out this form, thus removing the check.
47532fbc7fSSatish Balay 
48532fbc7fSSatish Balay      Level: beginner
49811af0c4SBarry Smith 
50811af0c4SBarry Smith .seealso: `PetscIsNormalReal()`, `PetscIsNanReal()`
51532fbc7fSSatish Balay @*/
52532fbc7fSSatish Balay #if defined(PETSC_USE_REAL___FLOAT128)
53*d71ae5a4SJacob Faibussowitsch PetscBool PetscIsInfReal(PetscReal a)
54*d71ae5a4SJacob Faibussowitsch {
559f4f8022SLisandro Dalcin   return isinfq(a) ? PETSC_TRUE : PETSC_FALSE;
56532fbc7fSSatish Balay }
579f4f8022SLisandro Dalcin #elif defined(PETSC_HAVE_ISINF)
58*d71ae5a4SJacob Faibussowitsch PetscBool PetscIsInfReal(PetscReal a)
59*d71ae5a4SJacob Faibussowitsch {
609f4f8022SLisandro Dalcin   return isinf(a) ? PETSC_TRUE : PETSC_FALSE;
61532fbc7fSSatish Balay }
629f4f8022SLisandro Dalcin #elif defined(PETSC_HAVE__FINITE)
63532fbc7fSSatish Balay   #if defined(PETSC_HAVE_FLOAT_H)
64aaa7dc30SBarry Smith     #include <float.h> /* Microsoft Windows defines _finite() in float.h */
65532fbc7fSSatish Balay   #endif
66532fbc7fSSatish Balay   #if defined(PETSC_HAVE_IEEEFP_H)
67aaa7dc30SBarry Smith     #include <ieeefp.h> /* Solaris prototypes these here */
68532fbc7fSSatish Balay   #endif
69*d71ae5a4SJacob Faibussowitsch PetscBool PetscIsInfReal(PetscReal a)
70*d71ae5a4SJacob Faibussowitsch {
719f4f8022SLisandro Dalcin   return !_finite(a) ? PETSC_TRUE : PETSC_FALSE;
72532fbc7fSSatish Balay }
73532fbc7fSSatish Balay #else
74*d71ae5a4SJacob Faibussowitsch PetscBool PetscIsInfReal(PetscReal a)
75*d71ae5a4SJacob Faibussowitsch {
769f4f8022SLisandro Dalcin   return (a && a / 2 == a) ? PETSC_TRUE : PETSC_FALSE;
77532fbc7fSSatish Balay }
78532fbc7fSSatish Balay #endif
79532fbc7fSSatish Balay 
80bae46576SBarry Smith /*@C
813948c36eSLisandro Dalcin       PetscIsNanReal - Returns whether the input is a Not-a-Number (NaN) value.
82bae46576SBarry Smith 
83bae46576SBarry Smith     Input Parameter:
84bae46576SBarry Smith .     a - the floating point number
85bae46576SBarry Smith 
86811af0c4SBarry Smith     Developer Notes:
87811af0c4SBarry Smith     Uses the C99 standard `isnan()` on systems where it exists.
88811af0c4SBarry Smith 
89811af0c4SBarry Smith     Otherwise uses (a != a), note that some optimizing compilers compile
90bae46576SBarry Smith     out this form, thus removing the check.
91bae46576SBarry Smith 
92bae46576SBarry Smith      Level: beginner
93811af0c4SBarry Smith 
94811af0c4SBarry Smith .seealso: `PetscIsNormalReal()`, `PetscIsInfReal()`
95bae46576SBarry Smith @*/
96bae46576SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128)
97*d71ae5a4SJacob Faibussowitsch PetscBool PetscIsNanReal(PetscReal a)
98*d71ae5a4SJacob Faibussowitsch {
993948c36eSLisandro Dalcin   return isnanq(a) ? PETSC_TRUE : PETSC_FALSE;
100bae46576SBarry Smith }
1013948c36eSLisandro Dalcin #elif defined(PETSC_HAVE_ISNAN)
102*d71ae5a4SJacob Faibussowitsch PetscBool PetscIsNanReal(PetscReal a)
103*d71ae5a4SJacob Faibussowitsch {
1043948c36eSLisandro Dalcin   return isnan(a) ? PETSC_TRUE : PETSC_FALSE;
105bae46576SBarry Smith }
1063948c36eSLisandro Dalcin #elif defined(PETSC_HAVE__ISNAN)
107bae46576SBarry Smith   #if defined(PETSC_HAVE_FLOAT_H)
1083948c36eSLisandro Dalcin     #include <float.h> /* Microsoft Windows defines _isnan() in float.h */
109bae46576SBarry Smith   #endif
110bae46576SBarry Smith   #if defined(PETSC_HAVE_IEEEFP_H)
111bae46576SBarry Smith     #include <ieeefp.h> /* Solaris prototypes these here */
112bae46576SBarry Smith   #endif
113*d71ae5a4SJacob Faibussowitsch PetscBool PetscIsNanReal(PetscReal a)
114*d71ae5a4SJacob Faibussowitsch {
1153948c36eSLisandro Dalcin   return _isnan(a) ? PETSC_TRUE : PETSC_FALSE;
116bae46576SBarry Smith }
117bae46576SBarry Smith #else
118*d71ae5a4SJacob Faibussowitsch PetscBool PetscIsNanReal(PetscReal a)
119*d71ae5a4SJacob Faibussowitsch {
1203948c36eSLisandro Dalcin   return (a != a) ? PETSC_TRUE : PETSC_FALSE;
121bae46576SBarry Smith }
122bae46576SBarry Smith #endif
123