1: #define PETSC_SKIP_COMPLEX
2: #include <petscsys.h>
3: /*@C
4: PetscIsNormalReal - Returns PETSC_TRUE if the input value satisfies isnormal()
6: Input Parameter:
7: . a - the PetscReal Value
9: Notes: uses the C99 standard isnormal() on systems where they exist.
10: Uses isnormalq() with __float128
11: Otherwises always returns true
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
32: /*@C
33: PetscIsInfReal - Returns whether the input is an infinity value.
35: Input Parameter:
36: . a - the floating point number
38: Notes: uses the C99 standard isinf() on systems where it exists.
39: Otherwises uses (a && a/2 == a), note that some optimizing compiles compile
40: out this form, thus removing the check.
42: Level: beginner
43: @*/
44: #if defined(PETSC_USE_REAL___FLOAT128)
45: PetscBool PetscIsInfReal(PetscReal a)
46: {
47: return isinfq(a) ? PETSC_TRUE : PETSC_FALSE;
48: }
49: #elif defined(PETSC_HAVE_ISINF)
50: PetscBool PetscIsInfReal(PetscReal a)
51: {
52: return isinf(a) ? PETSC_TRUE : PETSC_FALSE;
53: }
54: #elif defined(PETSC_HAVE__FINITE)
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: PetscBool PetscIsInfReal(PetscReal a)
62: {
63: return !_finite(a) ? PETSC_TRUE : PETSC_FALSE;
64: }
65: #else
66: PetscBool PetscIsInfReal(PetscReal a)
67: {
68: return (a && a/2 == a) ? PETSC_TRUE : PETSC_FALSE;
69: }
70: #endif
72: /*@C
73: PetscIsNanReal - Returns whether the input is a Not-a-Number (NaN) value.
75: Input Parameter:
76: . a - the floating point number
78: Notes: uses the C99 standard isnan() on systems where it exists.
79: Otherwises uses (a != a), note that some optimizing compiles compile
80: out this form, thus removing the check.
82: Level: beginner
83: @*/
84: #if defined(PETSC_USE_REAL___FLOAT128)
85: PetscBool PetscIsNanReal(PetscReal a)
86: {
87: return isnanq(a) ? PETSC_TRUE : PETSC_FALSE;
88: }
89: #elif defined(PETSC_HAVE_ISNAN)
90: PetscBool PetscIsNanReal(PetscReal a)
91: {
92: return isnan(a) ? PETSC_TRUE : PETSC_FALSE;
93: }
94: #elif defined(PETSC_HAVE__ISNAN)
95: #if defined(PETSC_HAVE_FLOAT_H)
96: #include <float.h> /* Microsoft Windows defines _isnan() in float.h */
97: #endif
98: #if defined(PETSC_HAVE_IEEEFP_H)
99: #include <ieeefp.h> /* Solaris prototypes these here */
100: #endif
101: PetscBool PetscIsNanReal(PetscReal a)
102: {
103: return _isnan(a) ? PETSC_TRUE : PETSC_FALSE;
104: }
105: #else
106: PetscBool PetscIsNanReal(PetscReal a)
107: {
108: return (a != a) ? PETSC_TRUE : PETSC_FALSE;
109: }
110: #endif