xref: /petsc/src/sys/utils/mathinf.c (revision fe998a80077c9ee0917a39496df43fc256e1b478)
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)
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