Actual source code: mathinf.c

petsc-3.8.4 2018-03-24
Report Typos and Errors
  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