xref: /petsc/src/sys/utils/mathinf.c (revision f48dab2ec814ab1d27d599a81e9cf4238ce99ab3)
1532fbc7fSSatish Balay #include <petscsys.h>
2532fbc7fSSatish Balay /*@C
3532fbc7fSSatish Balay       PetscIsInfOrNan - Returns 1 if the input double has an infinity for Not-a-number (Nan) value, otherwise 0.
4532fbc7fSSatish Balay 
5532fbc7fSSatish Balay     Input Parameter:
6532fbc7fSSatish Balay .     a - the double
7532fbc7fSSatish Balay 
8532fbc7fSSatish Balay 
9532fbc7fSSatish Balay      Notes: uses the C99 standard isinf() and isnan() on systems where they exist.
10532fbc7fSSatish Balay       Otherwises uses ((a - a) != 0.0), note that some optimizing compiles compile
11532fbc7fSSatish Balay       out this form, thus removing the check.
12532fbc7fSSatish Balay 
13532fbc7fSSatish Balay      Level: beginner
14532fbc7fSSatish Balay @*/
15532fbc7fSSatish Balay #if defined(PETSC_USE_REAL___FLOAT128)
16*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a)
17*f48dab2eSKarl Rupp {
18532fbc7fSSatish Balay   return isinfq(PetscAbsScalar(a)) || isnanq(PetscAbsScalar(a));
19532fbc7fSSatish Balay }
20*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanReal(PetscReal a)
21*f48dab2eSKarl Rupp {
22532fbc7fSSatish Balay   return isinfq(a) || isnanq(a);
23532fbc7fSSatish Balay }
24532fbc7fSSatish Balay #elif defined(PETSC_HAVE_ISINF) && defined(PETSC_HAVE_ISNAN)
25*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a)
26*f48dab2eSKarl Rupp {
27532fbc7fSSatish Balay   return isinf(PetscAbsScalar(a)) || isnan(PetscAbsScalar(a));
28532fbc7fSSatish Balay }
29*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanReal(PetscReal a)
30*f48dab2eSKarl Rupp {
31532fbc7fSSatish Balay   return isinf(a) || isnan(a);
32532fbc7fSSatish Balay }
33532fbc7fSSatish Balay #elif defined(PETSC_HAVE__FINITE) && defined(PETSC_HAVE__ISNAN)
34532fbc7fSSatish Balay #if defined(PETSC_HAVE_FLOAT_H)
35532fbc7fSSatish Balay #include "float.h"  /* Microsoft Windows defines _finite() in float.h */
36532fbc7fSSatish Balay #endif
37532fbc7fSSatish Balay #if defined(PETSC_HAVE_IEEEFP_H)
38532fbc7fSSatish Balay #include "ieeefp.h"  /* Solaris prototypes these here */
39532fbc7fSSatish Balay #endif
40*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a)
41*f48dab2eSKarl Rupp {
42532fbc7fSSatish Balay   return !_finite(PetscAbsScalar(a)) || _isnan(PetscAbsScalar(a));
43532fbc7fSSatish Balay }
44*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanReal(PetscReal a)
45*f48dab2eSKarl Rupp {
46532fbc7fSSatish Balay   return !_finite(a) || _isnan(a);
47532fbc7fSSatish Balay }
48532fbc7fSSatish Balay #else
49*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a)
50*f48dab2eSKarl Rupp {
51532fbc7fSSatish Balay   return  ((a - a) != (PetscScalar)0);
52532fbc7fSSatish Balay }
53*f48dab2eSKarl Rupp PetscErrorCode PetscIsInfOrNanReal(PetscReal a)
54*f48dab2eSKarl Rupp {
55532fbc7fSSatish Balay   return ((a - a) != 0);
56532fbc7fSSatish Balay }
57532fbc7fSSatish Balay #endif
58532fbc7fSSatish Balay 
59