home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_11_07 / 1107088a < prev    next >
Text File  |  1993-05-01  |  12KB  |  357 lines

  1. /* REAL_T.H  Listing 1 */
  2.  
  3. #if !defined ( REAL_T_INCLUDED )
  4. #define REAL_T_INCLUDED
  5.  
  6. /* Minimum numbers before sqrt() fails */
  7. #define FLT_SQRT_MIN  1.0e-19F
  8. #define DBL_SQRT_MIN  1.0e-154
  9. #define LDBL_SQRT_MIN 1.0e-2466L
  10.  
  11. #if defined ( REAL_FLT )
  12.    /* Type and constant macro for float */
  13.    typedef float real_t;
  14.    #define RC( x ) ( x##F )
  15.  
  16.    /* float.h constants */
  17.    #define REAL_DIG        FLT_DIG 
  18.    #define REAL_EPSILON    FLT_EPSILON
  19.    #define REAL_GUARD      FLT_GUARD
  20.    #define REAL_MANT_DIG   FLT_MANT_DIG
  21.    #define REAL_MAX        FLT_MAX 
  22.    #define REAL_MAX_10_EXP FLT_MAX_10_EXP
  23.    #define REAL_MAX_EXP    FLT_MAX_EXP
  24.    #define REAL_MIN        FLT_MIN 
  25.    #define REAL_MIN_10_EXP FLT_MIN_10_EXP
  26.    #define REAL_MIN_EXP    FLT_MIN_EXP
  27.    #define REAL_NORMALIZE  FLT_NORMALIZE
  28.    #define REAL_RADIX      FLT_RADIX
  29.    #define REAL_ROUNDS     FLT_ROUNDS
  30.    #define REAL_SQRT_MIN   FLT_SQRT_MIN
  31.    #if !defined ( REAL_MP )
  32.    #undef DBL_DIG
  33.    #undef DBL_EPSILON
  34.    #undef DBL_MANT_DIG
  35.    #undef DBL_MAX
  36.    #undef DBL_MAX_10_EXP
  37.    #undef DBL_MAX_EXP
  38.    #undef DBL_MIN
  39.    #undef DBL_MIN_10_EXP
  40.    #undef DBL_MIN_EXP
  41.    #undef DBL_RADIX
  42.    #undef DBL_ROUNDS
  43.    #undef DBL_SQRT_MIN
  44.    #undef LDBL_DIG
  45.    #undef LDBL_EPSILON
  46.    #undef LDBL_MANT_DIG
  47.    #undef LDBL_MAX
  48.    #undef LDBL_MAX_10_EXP
  49.    #undef LDBL_MAX_EXP
  50.    #undef LDBL_MIN
  51.    #undef LDBL_MIN_10_EXP
  52.    #undef LDBL_MIN_EXP
  53.    #undef LDBL_RADIX
  54.    #undef LDBL_ROUNDS
  55.    #undef LDBL_SQRT_MIN
  56.    #define DBL_DIG         REAL_DIG
  57.    #define DBL_EPSILON     REAL_EPSILON
  58.    #define DBL_MANT_DIG    REAL_MANT_DIG
  59.    #define DBL_MAX         REAL_MAX
  60.    #define DBL_MAX_10_EXP  REAL_MAX_10_EXP
  61.    #define DBL_MAX_EXP     REAL_MAX_EXP
  62.    #define DBL_MIN         REAL_MIN
  63.    #define DBL_MIN_10_EXP  REAL_MIN_10_EXP
  64.    #define DBL_MIN_EXP     REAL_MIN_EXP
  65.    #define DBL_RADIX       REAL_RADIX
  66.    #define DBL_ROUNDS      REAL_ROUNDS
  67.    #define DBL_SQRT_MIN    REAL_SQRT_MIN
  68.    #define LDBL_DIG        REAL_DIG
  69.    #define LDBL_EPSILON    REAL_EPSILON
  70.    #define LDBL_MANT_DIG   REAL_MANT_DIG
  71.    #define LDBL_MAX        REAL_MAX
  72.    #define LDBL_MAX_10_EXP REAL_MAX_10_EXP
  73.    #define LDBL_MAX_EXP    REAL_MAX_EXP
  74.    #define LDBL_MIN        REAL_MIN
  75.    #define LDBL_MIN_10_EXP REAL_MIN_10_EXP
  76.    #define LDBL_MIN_EXP    REAL_MIN_EXP
  77.    #define LDBL_RADIX      REAL_RADIX
  78.    #define LDBL_ROUNDS     REAL_ROUNDS
  79.    #define LDBL_SQRT_MIN   REAL_SQRT_MIN
  80.    typedef long double long_double;
  81.    #define long_double real_t
  82.    #define double real_t
  83.    #endif   /* #if !defined ( REAL_MP ) */
  84.  
  85.    /* math.h functions */
  86.    #define acos( x ) ( (float)acos( (double)(x) ) )
  87.    #define asin( x ) ( (float)asin( (double)(x) ) )
  88.    #define atan( x ) ( (float)atan( (double)(x) ) )
  89.    #define atan2( y, x ) ( (float)atan2( (double)(y), \
  90.          (double)(x) ) )
  91.    #define ceil( x ) ( (float)ceil( (double)(x) ) )
  92.    #define cos( x ) ( (float)cos( (double)(x) ) )
  93.    #define cosh( x ) ( (float)cosh( (double)(x) ) )
  94.    #define exp( x ) ( (float)exp( (double)(x) ) )
  95.    #define fabs( x ) ( (float)fabs( (double)(x) ) )
  96.    #define floor( x ) ( (float)floor( (double)(x) ) )
  97.    #define fmod( x, y ) ( (float)fmod( (double)(x), \
  98.          (double)(y) ) )
  99.    #define sin( x ) ( (float)sin( (double)(x) ) )
  100.    #define sinh( x ) ( (float)sinh( (double)(x) ) )
  101.    #define tan( x ) ( (float)tan( (double)(x) ) )
  102.    #define tanh( x ) ( (float)tanh( (double)(x) ) )
  103.    #if defined ( REAL_SAFE )
  104.    #define atof( x ) \
  105.          ( ( (x) == NULL ) ? \
  106.          RC( 0.0 ) : (float)atof( (x) ) )
  107.    #define log( x ) \
  108.          ( ( fabs( (x) ) ) < REAL_MIN ? \
  109.          (float)log( (double)REAL_MIN ) : \
  110.          (float)log( (double)fabs( (x) ) ) )
  111.    #define log10( x ) \
  112.          ( ( fabs( x ) ) < REAL_MIN ? \
  113.          (float)log10( (double)REAL_MIN ) : \
  114.          (float)log10( (double)fabs( (x) ) ) )
  115.    #define pow( x, y ) \
  116.          ( fabs( (y) ) < REAL_MIN ? \
  117.          RC( 1.0 ) : \
  118.          ( fabs( (x) ) < REAL_MIN ? \
  119.          ( (y) < RC( 0.0 ) ? \
  120.          REAL_MAX : RC( 0.0 ) ) : \
  121.          (float)pow( (double)(x), (double)(y) ) ) )
  122.    #define sqrt( x ) \
  123.          ( fabs( (x) ) < REAL_SQRT_MIN ? \
  124.          RC( 0.0 ) : (float)sqrt( (double)fabs( (x) ) ) )
  125.    #else
  126.    #define atof( x ) ( (float)atof( (x) ) )
  127.    #define log( x ) ( (float)log( (double)(x) ) )
  128.    #define log10( x ) ( (float)log10( (double)(x) ) )
  129.    #define pow( x, y ) ( (float)pow( (double)(x), \
  130.          (double)(y) ) )
  131.    #define sqrt( x ) ( (float)sqrt( (double)(x) ) )
  132.    #endif   /* #if defined ( REAL_SAFE ) */
  133.  
  134. #else
  135. #if defined ( REAL_LDBL )
  136.    /* Type and constant macro for long double */
  137.    typedef long double real_t;
  138.    typedef long double long_double;
  139.    #define RC( x ) ( x##L )
  140.  
  141.    /* float.h constants */
  142.    #define REAL_DIG        LDBL_DIG
  143.    #define REAL_EPSILON    LDBL_EPSILON
  144.    #define REAL_MANT_DIG   LDBL_MANT_DIG
  145.    #define REAL_MAX        LDBL_MAX
  146.    #define REAL_MAX_10_EXP LDBL_MAX_10_EXP
  147.    #define REAL_MAX_EXP    LDBL_MAX_EXP
  148.    #define REAL_MIN        LDBL_MIN
  149.    #define REAL_MIN_10_EXP LDBL_MIN_10_EXP
  150.    #define REAL_MIN_EXP    LDBL_MIN_EXP
  151.    #define REAL_RADIX      LDBL_RADIX
  152.    #define REAL_ROUNDS     LDBL_ROUNDS
  153.    #define REAL_SQRT_MIN   LDBL_SQRT_MIN
  154.    #if !defined ( REAL_MP )
  155.    #undef FLT_DIG
  156.    #undef FLT_EPSILON
  157.    #undef FLT_MANT_DIG
  158.    #undef FLT_MAX
  159.    #undef FLT_MAX_10_EXP
  160.    #undef FLT_MAX_EXP
  161.    #undef FLT_MIN
  162.    #undef FLT_MIN_10_EXP
  163.    #undef FLT_MIN_EXP
  164.    #undef FLT_RADIX
  165.    #undef FLT_ROUNDS
  166.    #undef FLT_SQRT_MIN
  167.    #undef DBL_DIG
  168.    #undef DBL_EPSILON
  169.    #undef DBL_MANT_DIG
  170.    #undef DBL_MAX
  171.    #undef DBL_MAX_10_EXP
  172.    #undef DBL_MAX_EXP
  173.    #undef DBL_MIN
  174.    #undef DBL_MIN_10_EXP
  175.    #undef DBL_MIN_EXP
  176.    #undef DBL_RADIX
  177.    #undef DBL_ROUNDS
  178.    #undef DBL_SQRT_MIN
  179.    #define DBL_DIG         REAL_DIG
  180.    #define DBL_EPSILON     REAL_EPSILON
  181.    #define DBL_MANT_DIG    REAL_MANT_DIG
  182.    #define DBL_MAX         REAL_MAX
  183.    #define DBL_MAX_10_EXP  REAL_MAX_10_EXP
  184.    #define DBL_MAX_EXP     REAL_MAX_EXP
  185.    #define DBL_MIN         REAL_MIN
  186.    #define DBL_MIN_10_EXP  REAL_MIN_10_EXP
  187.    #define DBL_MIN_EXP     REAL_MIN_EXP
  188.    #define DBL_RADIX       REAL_RADIX
  189.    #define DBL_ROUNDS      REAL_ROUNDS
  190.    #define DBL_SQRT_MIN    REAL_SQRT_MIN
  191.    #define FLT_DIG         REAL_DIG
  192.    #define FLT_EPSILON     REAL_EPSILON
  193.    #define FLT_MANT_DIG    REAL_MANT_DIG
  194.    #define FLT_MAX         REAL_MAX
  195.    #define FLT_MAX_10_EXP  REAL_MAX_10_EXP
  196.    #define FLT_MAX_EXP     REAL_MAX_EXP
  197.    #define FLT_MIN         REAL_MIN
  198.    #define FLT_MIN_10_EXP  REAL_MIN_10_EXP
  199.    #define FLT_MIN_EXP     REAL_MIN_EXP
  200.    #define FLT_RADIX       REAL_RADIX
  201.    #define FLT_ROUNDS      REAL_ROUNDS
  202.    #define FLT_SQRT_MIN    REAL_SQRT_MIN
  203.     #define float real_t
  204.    #define double real_t
  205.    #endif   /* #if !defined ( REAL_MP ) */
  206.  
  207.    /* math.h functions */
  208.    #define acos acosl
  209.    #define asin asinl
  210.    #define atan atanl
  211.    #define atan2 atan2l
  212.    #define ceil ceill
  213.    #define cos cosl
  214.    #define cosh coshl
  215.    #define exp expl
  216.    #define fabs fabsl
  217.    #define floor floorl
  218.    #define fmod fmodl
  219.    #define sin sinl
  220.    #define sinh sinhl
  221.    #define tan tanl
  222.    #define tanh tanhl
  223.    #if defined ( REAL_SAFE )
  224.    #define atof( x ) \
  225.          ( ( (x)  == NULL ) ? \
  226.          RC( 0.0 ) : (float)atofl( (x) ) )
  227.    #define log( x ) \
  228.          ( ( fabsl( (x) ) ) < REAL_MIN ? \
  229.          logl( REAL_MIN ) : logl( fabsl( (x) ) ) )
  230.    #define log10( x ) \
  231.          ( ( fabsl( x ) ) < REAL_MIN ? \
  232.          log10l( REAL_MIN ) : log10l( fabs( x ) ) )
  233.    #define pow( x, y ) \
  234.          ( fabsl( (y) ) < REAL_MIN ? \
  235.          RC( 1.0 ) : \
  236.          ( fabsl( (x) ) < REAL_MIN ? \
  237.          ( (y) < RC( 0.0 ) ? \
  238.          REAL_MAX : RC( 0.0 ) ) : \
  239.          (float)powl( (x), (y) ) ) )
  240.    #define sqrt( x ) \
  241.          ( fabsl( (x) ) < REAL_SQRT_MIN ? \
  242.          RC( 0.0 ) : sqrtl( fabsl( (x) ) ) )
  243.    #else
  244.    #define atof atofl
  245.    #define log logl
  246.    #define log10 log10l
  247.    #define pow powl
  248.    #define sqrt sqrtl
  249.    #endif   /* #if defined ( REAL_SAFE ) */
  250.  
  251. #else   /* REAL_DBL is default */
  252.    /* Type and constant macro for double */
  253.    typedef double real_t;
  254.    #define RC( x ) ( x )
  255.  
  256.    /* float.h constants */
  257.    #define REAL_DIG        DBL_DIG 
  258.    #define REAL_EPSILON    DBL_EPSILON 
  259.    #define REAL_MANT_DIG   DBL_MANT_DIG
  260.    #define REAL_MAX        DBL_MAX 
  261.    #define REAL_MAX_10_EXP DBL_MAX_10_EXP
  262.    #define REAL_MAX_EXP    DBL_MAX_EXP
  263.    #define REAL_MIN        DBL_MIN 
  264.    #define REAL_MIN_10_EXP DBL_MIN_10_EXP
  265.    #define REAL_MIN_EXP    DBL_MIN_EXP
  266.    #define REAL_RADIX      DBL_RADIX
  267.    #define REAL_ROUNDS     DBL_ROUNDS
  268.    #define REAL_SQRT_MIN   DBL_SQRT_MIN
  269.    #if !defined ( REAL_MP )
  270.    #undef FLT_DIG
  271.    #undef FLT_EPSILON
  272.    #undef FLT_MANT_DIG
  273.    #undef FLT_MAX
  274.    #undef FLT_MAX_10_EXP
  275.    #undef FLT_MAX_EXP
  276.    #undef FLT_MIN
  277.    #undef FLT_MIN_10_EXP
  278.    #undef FLT_MIN_EXP
  279.    #undef FLT_RADIX
  280.    #undef FLT_ROUNDS
  281.    #undef FLT_SQRT_MIN
  282.    #undef LDBL_DIG
  283.    #undef LDBL_EPSILON
  284.    #undef LDBL_MANT_DIG
  285.    #undef LDBL_MAX
  286.    #undef LDBL_MAX_10_EXP
  287.    #undef LDBL_MAX_EXP
  288.    #undef LDBL_MIN
  289.    #undef LDBL_MIN_10_EXP
  290.    #undef LDBL_MIN_EXP
  291.    #undef LDBL_RADIX
  292.    #undef LDBL_ROUNDS
  293.    #undef LDBL_SQRT_MIN
  294.    #define FLT_DIG         REAL_DIG
  295.    #define FLT_EPSILON     REAL_EPSILON
  296.    #define FLT_MANT_DIG    REAL_MANT_DIG
  297.    #define FLT_MAX         REAL_MAX
  298.    #define FLT_MAX_10_EXP  REAL_MAX_10_EXP
  299.    #define FLT_MAX_EXP     REAL_MAX_EXP
  300.    #define FLT_MIN         REAL_MIN
  301.    #define FLT_MIN_10_EXP  REAL_MIN_10_EXP
  302.    #define FLT_MIN_EXP     REAL_MIN_EXP
  303.    #define FLT_RADIX       REAL_RADIX
  304.    #define FLT_ROUNDS      REAL_ROUNDS
  305.    #define LDBL_DIG        REAL_DIG
  306.    #define LDBL_EPSILON    REAL_EPSILON
  307.    #define LDBL_MANT_DIG   REAL_MANT_DIG
  308.    #define LDBL_MAX        REAL_MAX
  309.    #define LDBL_MAX_10_EXP REAL_MAX_10_EXP
  310.    #define LDBL_MAX_EXP    REAL_MAX_EXP
  311.    #define LDBL_MIN        REAL_MIN
  312.    #define LDBL_MIN_10_EXP REAL_MIN_10_EXP
  313.    #define LDBL_MIN_EXP    REAL_MIN_EXP
  314.    #define LDBL_RADIX      REAL_RADIX
  315.    #define LDBL_ROUNDS     REAL_ROUNDS
  316.    typedef long double long_double;
  317.    #define long_double real_t
  318.    #define float real_t
  319.    #endif   /* #if !defined ( REAL_MP ) */
  320.  
  321.    /* math.h functions */
  322.    #if defined ( REAL_SAFE )
  323.    #define atof( x ) \
  324.          ( ( (x) == NULL ) ? \
  325.          RC( 0.0 ) : (float)atof( (x) ) )
  326.    #define log( x ) \
  327.          ( ( fabs( (x) ) ) < REAL_MIN ? \
  328.          log( REAL_MIN ) : log( fabs( (x) ) ) )
  329.    #define log10( x ) \
  330.          ( ( fabs( x ) ) < REAL_MIN ? \
  331.          log10( REAL_MIN ) : log10( fabs( x ) ) )
  332.    #define pow( x, y ) \
  333.          ( fabs( (y) ) < REAL_MIN ? \
  334.          RC( 1.0 ) : \
  335.          ( fabs( (x) ) < REAL_MIN ? \
  336.          ( (y) < RC( 0.0 ) ? \
  337.          REAL_MAX : RC( 0.0 ) ) : \
  338.          (float)pow( (x), (y) ) ) )
  339.    #define sqrt( x ) \
  340.          ( fabs( (x) ) < REAL_SQRT_MIN ? \
  341.          RC( 0.0 ) : sqrtl( fabs( (x) ) ) )
  342.    #endif   /* #if defined ( REAL_SAFE )  */
  343.  
  344. #endif   /* #if defined ( REAL_LDBL ) */
  345. #endif   /* #if defined ( REAL_FLT ) */
  346.  
  347. /* kludge for long double */
  348. #if defined ( REAL_NL ) && !defined ( REAL_MP )
  349. #define long
  350. #endif
  351.  
  352. #endif   /* #if defined ( REAL_T_INCLUDED ) */
  353.  
  354. /* End of REAL_T.H */
  355.  
  356.  
  357.