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