xref: /petsc/src/sys/utils/mathinf.c (revision ee12ae39415b2e672d944cdca066227dadbf8b14)
1 #define PETSC_SKIP_COMPLEX
2 #include <petscsys.h>
3 /*@C
4       PetscIsNormalReal - Returns PETSC_TRUE if the input value satisfies isnormal()
5 
6     Input Parameter:
7 .     a - the PetscReal Value
8 
9      Notes:
10     uses the C99 standard isnormal() on systems where they exist.
11       Uses isnormalq() with __float128
12       Otherwises always returns true
13 
14      Level: beginner
15 @*/
16 #if defined(PETSC_USE_REAL___FLOAT128) || defined(PETSC_USE_REAL___FP16)
17 PetscBool PetscIsNormalReal(PetscReal a)
18 {
19   return PETSC_TRUE;
20 }
21 #elif defined(PETSC_HAVE_ISNORMAL)
22 PetscBool PetscIsNormalReal(PetscReal a)
23 {
24   return isnormal(a) ? PETSC_TRUE : PETSC_FALSE;
25 }
26 #else
27 PetscBool PetscIsNormalReal(PetscReal a)
28 {
29   return PETSC_TRUE;
30 }
31 #endif
32 
33 /*@C
34       PetscIsInfReal - Returns whether the input is an infinity value.
35 
36     Input Parameter:
37 .     a - the floating point number
38 
39      Notes:
40     uses the C99 standard isinf() on systems where it exists.
41       Otherwises uses (a && a/2 == a), note that some optimizing compiles compile
42       out this form, thus removing the check.
43 
44      Level: beginner
45 @*/
46 #if defined(PETSC_USE_REAL___FLOAT128)
47 PetscBool PetscIsInfReal(PetscReal a)
48 {
49   return isinfq(a) ? PETSC_TRUE : PETSC_FALSE;
50 }
51 #elif defined(PETSC_HAVE_ISINF)
52 PetscBool PetscIsInfReal(PetscReal a)
53 {
54   return isinf(a) ? PETSC_TRUE : PETSC_FALSE;
55 }
56 #elif defined(PETSC_HAVE__FINITE)
57 #if defined(PETSC_HAVE_FLOAT_H)
58 #include <float.h>  /* Microsoft Windows defines _finite() in float.h */
59 #endif
60 #if defined(PETSC_HAVE_IEEEFP_H)
61 #include <ieeefp.h>  /* Solaris prototypes these here */
62 #endif
63 PetscBool PetscIsInfReal(PetscReal a)
64 {
65   return !_finite(a) ? PETSC_TRUE : PETSC_FALSE;
66 }
67 #else
68 PetscBool PetscIsInfReal(PetscReal a)
69 {
70   return (a && a/2 == a) ? PETSC_TRUE : PETSC_FALSE;
71 }
72 #endif
73 
74 /*@C
75       PetscIsNanReal - Returns whether the input is a Not-a-Number (NaN) value.
76 
77     Input Parameter:
78 .     a - the floating point number
79 
80      Notes:
81     uses the C99 standard isnan() on systems where it exists.
82       Otherwises uses (a != a), note that some optimizing compiles compile
83       out this form, thus removing the check.
84 
85      Level: beginner
86 @*/
87 #if defined(PETSC_USE_REAL___FLOAT128)
88 PetscBool PetscIsNanReal(PetscReal a)
89 {
90   return isnanq(a) ? PETSC_TRUE : PETSC_FALSE;
91 }
92 #elif defined(PETSC_HAVE_ISNAN)
93 PetscBool PetscIsNanReal(PetscReal a)
94 {
95   return isnan(a) ? PETSC_TRUE : PETSC_FALSE;
96 }
97 #elif defined(PETSC_HAVE__ISNAN)
98 #if defined(PETSC_HAVE_FLOAT_H)
99 #include <float.h>  /* Microsoft Windows defines _isnan() in float.h */
100 #endif
101 #if defined(PETSC_HAVE_IEEEFP_H)
102 #include <ieeefp.h>  /* Solaris prototypes these here */
103 #endif
104 PetscBool PetscIsNanReal(PetscReal a)
105 {
106   return _isnan(a) ? PETSC_TRUE : PETSC_FALSE;
107 }
108 #else
109 PetscBool PetscIsNanReal(PetscReal a)
110 {
111   return (a != a) ? PETSC_TRUE : PETSC_FALSE;
112 }
113 #endif
114