Actual source code: mathinf.c

      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:
     10:     uses the C99 standard isnormal() on systems where they exist.
     11:       Uses isnormalq() with __float128
     12:       Otherwises always returns true

     14:      Level: beginner
     15: @*/
     16: #if defined(PETSC_USE_REAL___FLOAT128) || defined(PETSC_USE_REAL___FP16)
     17: PetscBool PetscIsNormalReal(PetscReal a)
     18: {
     19:   return PETSC_TRUE;
     20: }
     21: #elif defined(PETSC_HAVE_ISNORMAL)
     22: PetscBool PetscIsNormalReal(PetscReal a)
     23: {
     24:   return isnormal(a) ? PETSC_TRUE : PETSC_FALSE;
     25: }
     26: #else
     27: PetscBool PetscIsNormalReal(PetscReal a)
     28: {
     29:   return PETSC_TRUE;
     30: }
     31: #endif

     33: /*@C
     34:       PetscIsInfReal - Returns whether the input is an infinity value.

     36:     Input Parameter:
     37: .     a - the floating point number

     39:      Notes:
     40:     uses the C99 standard isinf() on systems where it exists.
     41:       Otherwises uses (a && a/2 == a), note that some optimizing compiles compile
     42:       out this form, thus removing the check.

     44:      Level: beginner
     45: @*/
     46: #if defined(PETSC_USE_REAL___FLOAT128)
     47: PetscBool PetscIsInfReal(PetscReal a)
     48: {
     49:   return isinfq(a) ? PETSC_TRUE : PETSC_FALSE;
     50: }
     51: #elif defined(PETSC_HAVE_ISINF)
     52: PetscBool PetscIsInfReal(PetscReal a)
     53: {
     54:   return isinf(a) ? PETSC_TRUE : PETSC_FALSE;
     55: }
     56: #elif defined(PETSC_HAVE__FINITE)
     57: #if defined(PETSC_HAVE_FLOAT_H)
     58: #include <float.h>  /* Microsoft Windows defines _finite() in float.h */
     59: #endif
     60: #if defined(PETSC_HAVE_IEEEFP_H)
     61: #include <ieeefp.h>  /* Solaris prototypes these here */
     62: #endif
     63: PetscBool PetscIsInfReal(PetscReal a)
     64: {
     65:   return !_finite(a) ? PETSC_TRUE : PETSC_FALSE;
     66: }
     67: #else
     68: PetscBool PetscIsInfReal(PetscReal a)
     69: {
     70:   return (a && a/2 == a) ? PETSC_TRUE : PETSC_FALSE;
     71: }
     72: #endif

     74: /*@C
     75:       PetscIsNanReal - Returns whether the input is a Not-a-Number (NaN) value.

     77:     Input Parameter:
     78: .     a - the floating point number

     80:      Notes:
     81:     uses the C99 standard isnan() on systems where it exists.
     82:       Otherwises uses (a != a), note that some optimizing compiles compile
     83:       out this form, thus removing the check.

     85:      Level: beginner
     86: @*/
     87: #if defined(PETSC_USE_REAL___FLOAT128)
     88: PetscBool PetscIsNanReal(PetscReal a)
     89: {
     90:   return isnanq(a) ? PETSC_TRUE : PETSC_FALSE;
     91: }
     92: #elif defined(PETSC_HAVE_ISNAN)
     93: PetscBool PetscIsNanReal(PetscReal a)
     94: {
     95:   return isnan(a) ? PETSC_TRUE : PETSC_FALSE;
     96: }
     97: #elif defined(PETSC_HAVE__ISNAN)
     98: #if defined(PETSC_HAVE_FLOAT_H)
     99: #include <float.h>  /* Microsoft Windows defines _isnan() in float.h */
    100: #endif
    101: #if defined(PETSC_HAVE_IEEEFP_H)
    102: #include <ieeefp.h>  /* Solaris prototypes these here */
    103: #endif
    104: PetscBool PetscIsNanReal(PetscReal a)
    105: {
    106:   return _isnan(a) ? PETSC_TRUE : PETSC_FALSE;
    107: }
    108: #else
    109: PetscBool PetscIsNanReal(PetscReal a)
    110: {
    111:   return (a != a) ? PETSC_TRUE : PETSC_FALSE;
    112: }
    113: #endif