1: #include <petscsys.h>
2: /*@C
3: PetscIsNormal - Returns PETSC_TRUE if the input value satisfies isnormal()
5: Input Parameter:
6: . a - the PetscRealValue
8: Notes: uses the C99 standard isnormal() on systems where they exist.
9: Uses isnormalq() with __float128
10: Otherwises always returns true
12: Level: beginner
13: @*/
14: #if defined(PETSC_USE_REAL___FLOAT128)
15: PetscBool PetscIsNormalScalar(PetscScalar a)
16: {
17: return PETSC_TRUE;
18: }
19: PetscBool PetscIsNormalReal(PetscReal a)
20: {
21: return PETSC_TRUE;
22: }
23: #elif defined(PETSC_HAVE_ISNORMAL)
24: PetscBool PetscIsNormalScalar(PetscScalar a)
25: {
26: return isnormal(PetscAbsScalar(a)) ? PETSC_TRUE : PETSC_FALSE;
27: }
28: PetscBool PetscIsNormalReal(PetscReal a)
29: {
30: return isnormal(a) ? PETSC_TRUE : PETSC_FALSE;
31: }
32: #else
33: PetscBool PetscIsNormalScalar(PetscScalar a)
34: {
35: return PETSC_TRUE;
36: }
37: PetscBool PetscIsNormalReal(PetscReal a)
38: {
39: return PETSC_TRUE;
40: }
41: #endif
43: /*@C
44: PetscIsInfOrNan - Returns an error code if the input double has an infinity for Not-a-number (Nan) value, otherwise 0.
46: Input Parameter:
47: . a - the floating point number
49: Notes: uses the C99 standard isinf() and isnan() on systems where they exist.
50: Otherwises uses ((a - a) != 0.0), note that some optimizing compiles compile
51: out this form, thus removing the check.
53: Level: beginner
54: @*/
55: #if defined(PETSC_USE_REAL___FLOAT128)
56: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a)
57: {
58: return isinfq(PetscAbsScalar(a)) || isnanq(PetscAbsScalar(a));
59: }
60: PetscErrorCode PetscIsInfOrNanReal(PetscReal a)
61: {
62: return isinfq(a) || isnanq(a);
63: }
64: #elif defined(PETSC_HAVE_ISINF) && defined(PETSC_HAVE_ISNAN)
65: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a)
66: {
67: return isinf(PetscAbsScalar(a)) || isnan(PetscAbsScalar(a));
68: }
69: PetscErrorCode PetscIsInfOrNanReal(PetscReal a)
70: {
71: return isinf(a) || isnan(a);
72: }
73: #elif defined(PETSC_HAVE__FINITE) && defined(PETSC_HAVE__ISNAN)
74: #if defined(PETSC_HAVE_FLOAT_H)
75: #include <float.h> /* Microsoft Windows defines _finite() in float.h */
76: #endif
77: #if defined(PETSC_HAVE_IEEEFP_H)
78: #include <ieeefp.h> /* Solaris prototypes these here */
79: #endif
80: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a)
81: {
82: return !_finite(PetscAbsScalar(a)) || _isnan(PetscAbsScalar(a));
83: }
84: PetscErrorCode PetscIsInfOrNanReal(PetscReal a)
85: {
86: return !_finite(a) || _isnan(a);
87: }
88: #else
89: PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a)
90: {
91: return ((a - a) != (PetscScalar)0);
92: }
93: PetscErrorCode PetscIsInfOrNanReal(PetscReal a)
94: {
95: return ((a - a) != 0);
96: }
97: #endif