xref: /petsc/src/sys/utils/mathinf.c (revision 532fbc7f81950c82f2e916c208f3999e84541f25)
1*532fbc7fSSatish Balay #include <petscsys.h>
2*532fbc7fSSatish Balay /*@C
3*532fbc7fSSatish Balay       PetscIsInfOrNan - Returns 1 if the input double has an infinity for Not-a-number (Nan) value, otherwise 0.
4*532fbc7fSSatish Balay 
5*532fbc7fSSatish Balay     Input Parameter:
6*532fbc7fSSatish Balay .     a - the double
7*532fbc7fSSatish Balay 
8*532fbc7fSSatish Balay 
9*532fbc7fSSatish Balay      Notes: uses the C99 standard isinf() and isnan() on systems where they exist.
10*532fbc7fSSatish Balay       Otherwises uses ( (a - a) != 0.0), note that some optimizing compiles compile
11*532fbc7fSSatish Balay       out this form, thus removing the check.
12*532fbc7fSSatish Balay 
13*532fbc7fSSatish Balay      Level: beginner
14*532fbc7fSSatish Balay @*/
15*532fbc7fSSatish Balay #if defined(PETSC_USE_REAL___FLOAT128)
16*532fbc7fSSatish Balay PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) {
17*532fbc7fSSatish Balay   return isinfq(PetscAbsScalar(a)) || isnanq(PetscAbsScalar(a));
18*532fbc7fSSatish Balay }
19*532fbc7fSSatish Balay  PetscErrorCode PetscIsInfOrNanReal(PetscReal a) {
20*532fbc7fSSatish Balay   return isinfq(a) || isnanq(a);
21*532fbc7fSSatish Balay }
22*532fbc7fSSatish Balay #elif defined(PETSC_HAVE_ISINF) && defined(PETSC_HAVE_ISNAN)
23*532fbc7fSSatish Balay  PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) {
24*532fbc7fSSatish Balay   return isinf(PetscAbsScalar(a)) || isnan(PetscAbsScalar(a));
25*532fbc7fSSatish Balay }
26*532fbc7fSSatish Balay  PetscErrorCode PetscIsInfOrNanReal(PetscReal a) {
27*532fbc7fSSatish Balay   return isinf(a) || isnan(a);
28*532fbc7fSSatish Balay }
29*532fbc7fSSatish Balay #elif defined(PETSC_HAVE__FINITE) && defined(PETSC_HAVE__ISNAN)
30*532fbc7fSSatish Balay #if defined(PETSC_HAVE_FLOAT_H)
31*532fbc7fSSatish Balay #include "float.h"  /* Microsoft Windows defines _finite() in float.h */
32*532fbc7fSSatish Balay #endif
33*532fbc7fSSatish Balay #if defined(PETSC_HAVE_IEEEFP_H)
34*532fbc7fSSatish Balay #include "ieeefp.h"  /* Solaris prototypes these here */
35*532fbc7fSSatish Balay #endif
36*532fbc7fSSatish Balay  PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) {
37*532fbc7fSSatish Balay   return !_finite(PetscAbsScalar(a)) || _isnan(PetscAbsScalar(a));
38*532fbc7fSSatish Balay }
39*532fbc7fSSatish Balay  PetscErrorCode PetscIsInfOrNanReal(PetscReal a) {
40*532fbc7fSSatish Balay   return !_finite(a) || _isnan(a);
41*532fbc7fSSatish Balay }
42*532fbc7fSSatish Balay #else
43*532fbc7fSSatish Balay  PetscErrorCode PetscIsInfOrNanScalar(PetscScalar a) {
44*532fbc7fSSatish Balay   return  ((a - a) != (PetscScalar)0);
45*532fbc7fSSatish Balay }
46*532fbc7fSSatish Balay  PetscErrorCode PetscIsInfOrNanReal(PetscReal a) {
47*532fbc7fSSatish Balay   return ((a - a) != 0);
48*532fbc7fSSatish Balay }
49*532fbc7fSSatish Balay #endif
50*532fbc7fSSatish Balay 
51