Actual source code: mathinf.c

petsc-3.5.1 2014-07-24
Report Typos and Errors
  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