Listing 1 real_t.h — contains all the needed preprocessor gymnastics to make different precision versions of the same application

/* REAL_T.H */

#if !defined ( REAL_T_INCLUDED )
#define REAL_T_INCLUDED

/* Minimum numbers before sqrt()fails */
#define FLT_SQRT_MIN  1.0e-19F
#define DBL_SQRT_MIN  1.0e-154
#define LDBL_SQRT_MIN 1.0e-2466L

#if defined ( REAL_FLT )
   /* Type and constant macro for float */
   typedef float real_t;
   #define RC( x ) ( x##F )

   /* float.h constants */
   #define REAL_DIG        FLT_DIG
   #define REAL_EPSILON    FLT_EPSILON
   #define REAL_GUARD      FLT_GUARD
   #define REAL_MANT_DIG   FLT_MANT_DIG
   #define REAL_MAX        FLT_MAX
   #define REAL_MAX_10_EXP FLT_MAX_10_EXP
   #define REAL_MAX_EXP    FLT_MAX_EXP
   #define REAL_MIN        FLT_MIN
   #define REAL_MIN_10_EXP FLT_MIN_10_EXP
   #define REAL_MIN_EXP    FLT_MIN_EXP
   #define REAL_NORMALIZE  FLT_NORMALIZE
   #define REAL_RADIX      FLT_RADIX
   #define REAL_ROUNDS     FLT_ROUNDS
   #define REAL_SQRT_MIN   FLT_SQRT_MIN
   #if !defined ( REAL_MP )
   #undef DBL_DIG
   #undef DBL_EPSILON
   #undef DBL_MANT_DIG
   #undef DBL_MAX
   #undef DBL_MAX_10_EXP
   #undef DBL_MAX_EXP
   #undef DBL_MIN
   #undef DBL_MIN_10_EXP
   #undef DBL_MIN_EXP
   #undef DBL_RADIX
   #undef DBL_ROUNDS
   #undef DBL_SQRT_MIN
   #undef LDBL_DIG
   #undef LDBL_EPSILON
   #undef LDBL_MANT_DIG
   #undef LDBL_MAX
   #undef LDBL_MAX_10_EXP
   #under LDBL_MAX_EXP
   #undef LDBL_MIN
   #undef LDBL_MIN_10_EXP
   #undef LDBL_MIN_EXP
   #undef LDBL_RADIX
   #undef LDBL_ROUNDS
   #undef LDBL_SQRT_MIN
   #define DBL_DIG         REAL_DIG
   #define DBL_EPSILON     REAL_EPSILON
   #define DBL_MANT_DIG    REAL_MANT_DIG
   #define DBL_MAX         REAL_MAX
   #define DBL_MAX_10_EXP  REAL_MAX_10_EXP
   #define DBL_MAX_EXP     REAL_MAX_EXP
   #define DBL_MIN         REAL_MIN
   #define DBL_MIN_10_ EXP REAL_MIN_10_EXP
   #define DBL_MIN_EXP     REAL_MIN_EXP
   #define DBL_RADIX       REAL_RADIX
   #define DBL_ROUNDS      REAL_ROUNDS
   #define DBL_SQRT_MIN    REAL_SQRT_MIN
   #define LDBL_DIG        REAL_DIG
   #define LDBL_EPSILON    REAL_EPSILON
   #define LDBL_MANT_DIG   REAL_MANT_DIG
   #define LDBL_MAX        REAL_ MAX
   #define LDBL_MAX_10_EXP REAL_MAX_10_EXP
   #define LDBL_MAX_EXP    REAL_MAX_EXP
   #define LDBL_MIN        REAL_MIN
   #define LDBL_MIN_10_EXP REAL_MIN_10_EXP
   #define LDBL_MIN_EXP    REAL_MIN_EXP
   #define LDBL_RADIX      REAL_RADIX
   #define LDBL_ROUNDS     REAL_ROUNDS
   #define LDBL_SQRT_MIN   REAL_SQRT_MIN
   typedef long double long_double;
   #define long_double real_t
   #define double real_t
   #endif   /* #if !defined ( REAL_MP ) */

   /* math.h functions */
   #define acos( x ) ( (float)acos((double)(x) ) )
   #define asin( x ) ( (float)asin((double)(x) ) )
   #define atan( x ) ( (float)atan((double)(x) ) )
   #define atan2( y, x ) ( (float)atan2((double)(y), \
        (double)(x) ) )
   #define ceil( x ) ( (float)ceil( (double)(x) ) )
   #define cos( x ) ( (float)cos( (double)(x) ) )
   #define cosh( x ) ( (float)cosh( (double)(x) ) )
   #define exp( x ) ( (float)exp( (double)(x) ) )
   #define fabs( x ) ( (float)fabs( (double)(x) ) )
   #define floor( x ) ( (float)floor( (double)(x) ) )
   #define fmod( x, y ) ( (float)fmod( (double)(x), \
        (double)(y) ) )
   #define sin( x ) ( (float)sin( (double)(x) ) )
   #define sinh( x ) ( (float)sinh( (double)(x) ) )
   #define tan( x ) ( (float)tan( (double)(x) ) )
   #define tanh( x ) ( (float)tanh( (double)(x) ) )
   #if defined ( REAL_SAFE )
   #define atof( x )\
        ( ( (x) == NULL ) ? \
        RC( 0.0 ) : (float)atof( (x) ) )
   #define log( x ) \
        ( ( fabs( (x) ) ) < REAL_MIN ? \
        (float)log( (double)REAL_MIN) : \
        (float)log( (double)fabs( (x) ) ) )
   #define log10( x ) \
        ( ( fabs( x ) ) < REAL_MIN ? \
        (float)log10((double)REAL_MIN) : \
        (float)log10( (double)fabs( (x) ) ) )
   #define pow( x, y ) \
        ( fabs( (y) ) < REAL_MIN ? \
        RC ( 1.0 ) : \
        ( fabs( (x) ) < REAL MIN ? \
        ( (y)<RC(0.0) ? \
        REAL_MAX : RC( 0.0 ) ) : \
        (float)pow( (double)(x), (double)(y) ) ) )
   #define sqrt( x ) \
        ( fabs( (x) ) < REAL_SQRT_MIN ? \
        RC( 0.0 ) : (float)sqrt( double)fabs( (x) ) ) )
   #else
   #define atof( x ) ( (float)atof( (x) ) )
   #define log( x ) ( (float)log( (double)(x) ) )
   #define 1og10( x ) ( (float)log10( (double)(x) ) )
   #define pow( x, y ) ( (float)pow( (double)(x), \
        (double)(y) ) )
   #define sqrt( x ) ( (float)sqrt( (double)(x) ) )
   #endif   /* #if defined ( REAL_SAFE ) */

#else
#if defined ( REAL_LDBL )
   /* Type and constant macro for long double */
   typedef long double real_t;
   typedef long double long_double;
   #define RC( x ) ( x##L )

   /* float.h constants */
   #define REAL_DIG        LDBL_DIG
   #define REAL_EPSILON    LDBL_EPSILON
   #define REAL_MANT_DIG   LDBL_MANT_DIG
   #define REAL_MAX        LDBL_MAX
   #define REAL_MAX_10_EXP LDBL_MAX_10_EXP
   #define REAL_MAX_EXP    LDBL_MAX_EXP
   #define REAL_MIN        LDBL_MIN
   #define REAL_MIN_10_EXP LDBL_MIN_10_EXP
   #define REAL_MIN_EXP    LDBL_MIN_EXP
   #define REAL_RADIX      LDBL_RADIX
   #define REAL_ROUNDS     LDBL_ROUNDS
   #define REAL_SQRT_MIN   LDBL_SQRT_MIN
   #if !defined ( REAL_MP )
   #undef FLT_DIG
   #undef FLT_EPSILON
   #undef FLT_MANT_DIG
   #undef FLT_MAX
   #undef FLT_MAX_10_EXP
   #undef FLT_MAX_EXP
   #undef FLT_MIN
   #undef FLT_MIN_10_EXP
   #undef FLT_MIN_EXP
   #undef FLT_RADIX
   #undef FLT_ROUNDS
   #undef FLT_SQRT_MIN
   #undef DBL_DIG
   #undef DBL_EPSILON
   #undef DBL_MANT_DIG
   #undef DBL_MAX
   #undef DBL_MAX_10_EXP
   #undef DBL_MAX_EXP
   #undef DBL_MIN
   #undef DBL_MIN_10_EXP
   #undef DBL_MIN_EXP
   #undef DBL_RADIX
   #undef DBL_ROUNDS
   #undef DBL_SQRT_MIN
   #define DBL_DIG          REAL_DIG
   #define DBL_EPSILON      REAL_EPSILON
   #define DBL_MANT_DIG     REAL_MANT_DIG
   #define DBL_MAX          REAL_MAX
   #define DBL-MAX_10_EXP  REAL_MAX_10_EXP
   #define DBL_MAX_EXP     REAL_MAX_EXP
   #define DBL_MIN         REAL_MIN
   #define DBL_MIN_10_EXP  REAL_MIN_10_EXP
   #define DBL_MIN_EXP     REAL_MIN_EXP
   #define DBL_RADIX       REAL_RADIX
   #define DBL_ROUNDS      REAL_ROUNDS
   #define DBL_SQRT_MIN    REAL_SQRT_MIN
   #define FLT_DIG         REAL_DIG
   #define FLT_EPSILON     REAL_EPSILON
   #define FLT_MANT_DIG    REAL_MANT_DIG
   #define FLT_MAX         REAL_MAX
   #define FLT_MAX_10_EXP  REAL_MAX_10_EXP
   #define FLT_MAX_EXP     REAL_MAX_EXP
   #define FLT_MIN         REAL_MIN
   #define FLT_MIN_10_EXP  REAL_MIN_10_EXP
   #define FLT_MIN_EXP     REAL_MIN_EXP
   #define FLT_RADIX       REAL_RADIX
   #define FLT_ROUNDS      REAL_ROUNDS
   #define FLT_SQRT_MIN    REAL_SQRT_MIN
    #define float real_t
   #define double real_t
   #endif   /* #if !defined ( REAL_MP ) */

   /* math.h functions */
   #define acos acosl
   #define asin asinl
   #define atan atanl
   #define atan2 atan2l
   #define ceil ceill
   #define cos cosl
   #define cosh coshl
   #define exp expl
   #define fabs fabsl
   #define floor floorl
   #define fmod fmodl
   #define sin sinl
   #define sinh sinhl
   #define tan tanl
   #define tanh tanhl
   #if defined ( REAL_SAFE )
   #define atof( x ) \
        ( ((x)  == NULL ) ? \
        RC( 0.0 ) : (float)atofl( (x) ) )
   #define log( x ) \
        ( ( fabsl( (x) ) ) < REAL_MIN ? \
        logl( REAL_MIN ) : logl( fabsl( (x) ) ) )
   #define log10( x ) \
        ( ( fabsl( x ) ) < REAL_MIN ? \
        log10l( REAL_MIN ) : log10l( fabs( x ) ) )
   #define pow( x, y ) \
        ( fabsl( (y) ) < REAL_MIN ? \
        RC( 1.0 ) : \
        ( fabsl( (x) ) < REAL_MIN ? \
        ( (y) < RC( 0.0 ) ) : \
        REAL_MAX : RC( 0.0 ) ) : \
        (float)powl( (x), (y) ) ) )
   #define sqrt( x ) \
        ( fabsl( (x) ) < REAL_SQRT_MIN ? \
        RC( 0.0 ) : sqrtl( fabsl( (x) ) ) )
   #else
   #define atof atofl
   #define log logl
   #define log10 log101
   #define pow powl
   #define sqrt sqrtl
   #endif   /* #if defined ( REAL_SAFE ) */

#else    /* REAL_DBL is default */
   /* Type and constant macro for double */
   typedef double real_t;
   #define RC( x ) ( x )

   /* float.h constants */
   #define REAL_DIG        DBL_DIG
   #define REAL_EPSILON    DBL_EPSILON
   #define REAL_MANT_DIG   DBL_MANT_DIG
   #define REAL_MAX        DBL_MAX
   #define REAL_MAX_10_EXP DBL_MAX_10_EXP
   #define REAL_MAX_EXP    DBL_MAX_EXP
   #define REAL_MIN        DBL_MIN
   #define REAL_MIN_10_EXP DBL_MIN_10_EXP
   #define REAL_MIN_EXP    DBL_MIN_EXP
   #define REAL_RADIX      DBL_RADIX
   #define REAL_ROUNDS     DBL_ROUNDS
   #define REAL_SQRT_MIN   DBL_SQRT_MIN
   #if !defined ( REAL_MP )
   #undef FLT_DIG
   #undef FLT_EPSILON
   #undef FLT_MANT_DIG
   #undef FLT_MAX
   #undef FLT_MAX_10_EXP
   #undef FLT_MAX_EXP
   #undef FLT_MIN
   #undef FLT_MIN_10_EXP
   #undef FLT_MIN_EXP
   #undef FLT_RADIX
   #undef FLT_ROUNDS
   #undef FLT_SQRT_MIN
   #undef LDBL_DIG
   #undef LDBL_EPSILON
   #undef LDBL_MANT_DIG
   #undef LDBL_MAX
   #undef LDBL_MAX_10_EXP
   #undef LDBL_MAX_EXP
   #undef LDBL_MIN
   #undef LDBL_MIN_10_EXP
   #undef LDBL_MIN_EXP
   #undef LDBL_RADIX
   #undef LDBL_ROUNDS
   #undef LDBL_SQRT_MIN
   #define FLT_DIG         REAL_DIG
   #define FLT_EPSILON     REAL_EPSILON
   #define FLT_MANT_DIG    REAL_MANT_DIG
   #define FLT_MAX         REAL_MAX
   #define FLT_MAX_10_EXP  REAL_MAX_10_EXP
   #define FLT_MAX_EXP     REAL_MAX_EXP
   #define FLT_MIN         REAL_MIN
   #define FLT_MIN_10_EXP  REAL_MIN_10_EXP
   #define FLT_MIN_EXP     REAL_MIN_EXP
   #define FLT_RADIX       REAL_RADIX
   #define FLT_ROUNDS      REAL_ROUNDS
   #define LDBL_DIG        REAL_DIG
   #define LDBL_EPSILON    REAL_EPSILON
   #define LDBL_MANT_DIG   REAL_MANT_DIG
   #define LDBL_MAX        REAL_MAX
   #define LDBL_MAX_10_EXP REAL_MAX_10_EXP
   #define LDBL_MAX_EXP    REAL_MAX_EXP
   #define LDBL_MIN        REAL_MIN
   #define LDBL_MIN_10_EXP REAL_MIN_10_EXP
   #define LDBL_MIN_EXP    REAL_MIN_EXP
   #define LDBL_RADIX      REAL_RADIX
   #define LDBL_ROUNDS     REAL_ROUNDS
   typedef long double long_double;
   #define long_double real_t
   #define float real_t
   #endif   /* #if !defined ( REAL_MP ) */

   /* math.h functions */
   #if defined ( REAL_SAFE )
   #define atof( x ) \
        ( ( (x) == NULL ) ? \
        RC( 0.0 ) : (float)atof( (x) ) )
   #define log( x ) \
        ( ( fabs( (x) ) ) < REAL_MIN ? \
        log( REAL_MIN ) : log( fabs( (x) ) ) )
   #define log10( x ) \
        ( ( fabs( x ) ) < REAL_MIN ? \
        log10( REAL_MIN ) : log10( fabs( x ) ) )
   #define pow( x, y ) \
        ( fabs( (y) ) < REAL_MIN ? \
        RC( 1.0 ) : \
        ( fabs( (x) ) < REAL_MIN ? \
        ( (y) < RC( 0.0 ) ? \
        REAL_MAX : RC( 0.0 ) ) : \
        (float)pow( (x), (y) ) ) )
   #define sqrt( x ) \
        ( fabs( (x) ) < REAL_SQRT_MIN ? \
        RC( 0.0 ) : sqrtl( fabs( (x) ) ) )
   #endif   /* #if defined ( REAL_SAFE ) */

#endif   /* #if defined ( REAL_LDBL ) */
#endif   /* #if defined ( REAL_FLT ) */

/* kludge for long double */
#if defined ( REAL_NL ) && !defined ( REAL_MP )
/define long
#endif

#endif   /* #if defined ( REAL_T_INCLUDED ) */

/* End of File */