DEC C
User's Guide for OpenVMS Systems


Previous Contents Index


Appendix E
DEC C Limits

The <float.h> and <limits.h> header files define several macros that expand to various implementation-specific limits and parameters. This appendix contains the contents of these header files for DEC C for OpenVMS Systems.

E.1 Contents of <float.h>

The <float.h> header file has the following contents:


#ifndef <double_uscore>FLOAT_LOADED 
#define <double_uscore>FLOAT_LOADED 1 
/**************************************************************************** 
** 
**  <float.h> - Characteristics of floating types 
** 
***************************************************************************** 
**  Header introduced by the ANSI C Standard 
***************************************************************************** 
** 
**  Copyright Digital Equipment Corporation 1993, 1997.  All rights reserved. 
** 
**  Restricted Rights: Use, duplication, or disclosure by the U.S. 
**  Government is subject to restrictions as set forth in subparagraph 
**  (c) (1) (ii) of DFARS 252.227-7013, or in FAR 52.227-19, or in FAR 
**  52.227-14 Alt. III, as applicable. 
** 
**  This software is proprietary to and embodies the confidential 
**  technology of Digital Equipment Corporation. Possession, use, or 
**  copying of this software and media is authorized only pursuant to a 
**  valid written license from Digital or an authorized sublicensor. 
** 
****************************************************************************** 
*/ 
 
#include "common_header.h" 
#pragma   <double_uscore>nostandard 
#ifdef <double_uscore>cplusplus 
    extern "C" { 
#endif 
 
 
/* 
**  The following literals and routines are available on OpenVMS for 
**  Alpha, but only after OpenVMS V7.1 or with C++. 
*/ 
#if defined <double_uscore>ALPHA && !defined _ANSI_C_SOURCE 
#   if (defined(<double_uscore>DECCXX) || (<double_uscore>CRTL_VER >= 70100000)) 
 
    /* 
    **  Values for the IEEE Rounding Modes (IEEE ANSI Values) 
    ** 
    **  RZ = Round toward zero (chopped) 
    **  RN = Round toward nearest (default, normal) 
    **  RP = Round toward plus infinity 
    **  RM = Round toward minus infinity 
    */ 
#   define FP_RND_RZ    0 
#   define FP_RND_RN    1 
#   define FP_RND_RP    2 
#   define FP_RND_RM    3 
 
 
    /* 
    ** IEEE Constants 
    */ 
#   ifdef _IEEE_FP 
#      pragma <double_uscore>extern_model <double_uscore>save 
#      pragma <double_uscore>extern_model <double_uscore>strict_refdef 
       extern double decc$gt_dinfinity; 
       extern double decc$gt_dqnan; 
       extern double decc$gt_dsnan; 
       extern float decc$gs_sinfinity; 
       extern float decc$gs_sqnan; 
       extern float decc$gs_ssnan; 
#      pragma <double_uscore>extern_model <double_uscore>restore 
#      define DBL_INFINITY decc$gt_dinfinity 
#      define LDBL_INFINITY DBL_INFINITY 
#      define DBL_QNAN decc$gt_dqnan 
#      define DBL_SNAN decc$gt_dsnan 
#      define FLT_INFINITY decc$gs_sinfinity 
#      define FLT_QNAN decc$gs_sqnan 
#      define FLT_SNAN decc$gs_ssnan 
#   endif 
 
 
    /* 
    ** Macros to get decc$ names 
    */ 
#   if (<double_uscore>CRTL_VER < 70100000) 
#      define write_rnd(<double_uscore>p1) decc$write_rnd(<double_uscore>p1) 
#      define read_rnd decc$read_rnd 
#   endif 
 
 
    /* 
    ** Functions to read and write floating point rounding mode 
    */ 
    unsigned int write_rnd(unsigned int <double_uscore>rnd); 
    unsigned int read_rnd(void); 
 
#   endif 
#endif 
 
 
/* 
**  Rounding mode for floating point addition: 
*/ 
#ifdef <double_uscore>BIASED_FLT_ROUNDS 
#  define FLT_ROUNDS (<double_uscore>BIASED_FLT_ROUNDS-1) /* use compiler generated value, if present */ 
#else 
#  define FLT_ROUNDS 1   
#endif 
 
 
/* 
**  Radix of exponent representation: 
*/ 
#define FLT_RADIX 2 
 
 
/* 
**  Number of FLT_RADIX digits in the mantissa including the hidden bit: 
*/ 
#define <double_uscore>F_FLT_MANT_DIG    24 
#define <double_uscore>G_DBL_MANT_DIG    53 
#ifdef <double_uscore>ALPHA 
#define <double_uscore>S_FLT_MANT_DIG    24 
#define <double_uscore>T_FLT_MANT_DIG    53 
#define <double_uscore>X_FLT_MANT_DIG    113 
#endif 
 
 
/* 
**  Number of decimal digits of precision: 
*/ 
#define <double_uscore>F_FLT_DIG         6 
#define <double_uscore>G_FLT_DIG         15 
#ifdef <double_uscore>ALPHA 
#define <double_uscore>S_FLT_DIG         6 
#define <double_uscore>T_FLT_DIG         15 
#define <double_uscore>X_FLT_DIG         33 
#endif 
 
 
/* 
**  Minimum negative integer such that FLT_RADIX raised to that power 
**  minus 1 is a normalized floating-point number: 
*/ 
#define <double_uscore>F_FLT_MIN_EXP     (-127) 
#define <double_uscore>G_FLT_MIN_EXP     (-1023) 
#ifdef <double_uscore>ALPHA 
#define <double_uscore>S_FLT_MIN_EXP     (-125) 
#define <double_uscore>T_FLT_MIN_EXP     (-1021) 
#define <double_uscore>X_FLT_MIN_EXP     (-16381) 
#endif 
 
 
/* 
**  Minimum negative integer such that 10 raised to that power is in the 
**  range of normalized floating-point numbers: 
*/ 
#define <double_uscore>F_FLT_MIN_10_EXP  (-38) 
#define <double_uscore>G_FLT_MIN_10_EXP  (-308) 
#ifdef <double_uscore>ALPHA 
#define <double_uscore>S_FLT_MIN_10_EXP  (-37) 
#define <double_uscore>T_FLT_MIN_10_EXP  (-307) 
#define <double_uscore>X_FLT_MIN_10_EXP  (-4931) 
#endif 
 
 
/* 
**  Maximum integer such that FLT_RADIX raised to that power minus 1 is a 
**  representable finite floating point number: 
*/ 
#define <double_uscore>F_FLT_MAX_EXP     127 
#define <double_uscore>G_FLT_MAX_EXP     1023 
#ifdef <double_uscore>ALPHA 
#define <double_uscore>S_FLT_MAX_EXP     128 
#define <double_uscore>T_FLT_MAX_EXP     1024 
#define <double_uscore>X_FLT_MAX_EXP     16384 
#endif 
 
 
/* 
**  Maximum integer such that 10 raised to that power is in the range of 
**  representable finite floating-point numbers: 
*/ 
#define <double_uscore>F_FLT_MAX_10_EXP  38 
#define <double_uscore>G_FLT_MAX_10_EXP  307 
#ifdef <double_uscore>ALPHA 
#define <double_uscore>S_FLT_MAX_10_EXP  38 
#define <double_uscore>T_FLT_MAX_10_EXP  308 
#define <double_uscore>X_FLT_MAX_10_EXP  4932 
#endif 
 
 
/* 
**  Maximum representable finite floating-point number: 
*/ 
#define <double_uscore>F_FLT_MAX         1.7014117e+38f 
#define <double_uscore>G_FLT_MAX         8.98846567431157854e+307 
#ifdef <double_uscore>ALPHA 
#define <double_uscore>S_FLT_MAX         3.40282347e+38f 
#define <double_uscore>T_FLT_MAX         1.79769313486231570e+308 
#define <double_uscore>X_FLT_MAX         1.189731495357231765085759326628007016196477e4932l 
#endif 
 
 
/* 
**  The difference between 1.0 and the least value greater than 1.0 that 
**  is representable in the given floating-point type 
**    (i.e. 1.0 + epsilon != 1.0): 
*/ 
#define <double_uscore>F_FLT_EPSILON     ((float)(1.0 / (1 << 23))) 
#define <double_uscore>G_FLT_EPSILON     (1.0 / (1 << 30) / (1 << 22)) 
#ifdef <double_uscore>ALPHA 
#define <double_uscore>S_FLT_EPSILON     1.19209290e-07f 
#define <double_uscore>T_FLT_EPSILON     2.2204460492503131e-16 
#define <double_uscore>X_FLT_EPSILON     1.9259299443872358530559779425849273185381e-34l 
#endif 
 
 
/* 
**  Minimum normalized positive floating-point number: 
*/ 
#define <double_uscore>F_FLT_MIN         ((float) 2.93873587705571877e-39) 
#define <double_uscore>G_FLT_MIN         5.56268464626800346e-309 
#ifdef <double_uscore>ALPHA 
#define <double_uscore>S_FLT_MIN         1.17549435e-38f 
#define <double_uscore>T_FLT_MIN         2.2250738585072014e-308 
#define <double_uscore>X_FLT_MIN         ((long double) 3.3621031431120935062626778173217526025981e-4932l) 
#endif 
 
 
/* 
**  Define the FLT values to be either the <double_uscore>S or <double_uscore>F values based on IEEE 
*/ 
#if <double_uscore>IEEE_FLOAT 
#   define FLT_MANT_DIG     <double_uscore>S_FLT_MANT_DIG 
#   define FLT_DIG          <double_uscore>S_FLT_DIG 
#   define FLT_MIN_EXP      <double_uscore>S_FLT_MIN_EXP 
#   define FLT_MIN_10_EXP   <double_uscore>S_FLT_MIN_10_EXP 
#   define FLT_MAX_EXP      <double_uscore>S_FLT_MAX_EXP 
#   define FLT_MAX_10_EXP   <double_uscore>S_FLT_MAX_10_EXP 
#   define FLT_MAX          <double_uscore>S_FLT_MAX 
#   define FLT_EPSILON      <double_uscore>S_FLT_EPSILON 
#   define FLT_MIN          <double_uscore>S_FLT_MIN 
#else 
#   define FLT_MANT_DIG     <double_uscore>F_FLT_MANT_DIG 
#   define FLT_DIG          <double_uscore>F_FLT_DIG 
#   define FLT_MIN_EXP      <double_uscore>F_FLT_MIN_EXP 
#   define FLT_MIN_10_EXP   <double_uscore>F_FLT_MIN_10_EXP 
#   define FLT_MAX_EXP      <double_uscore>F_FLT_MAX_EXP 
#   define FLT_MAX_10_EXP   <double_uscore>F_FLT_MAX_10_EXP 
#   define FLT_MAX          <double_uscore>F_FLT_MAX 
#   define FLT_EPSILON      <double_uscore>F_FLT_EPSILON 
#   define FLT_MIN          <double_uscore>F_FLT_MIN 
#endif 
 
 
/* 
**  Define the DBL values to be either the <double_uscore>S or <double_uscore>F values based on IEEE 
*/ 
#if <double_uscore>IEEE_FLOAT 
#   define DBL_MANT_DIG     <double_uscore>T_FLT_MANT_DIG 
#   define DBL_DIG          <double_uscore>T_FLT_DIG 
#   define DBL_MIN_EXP      <double_uscore>T_FLT_MIN_EXP 
#   define DBL_MIN_10_EXP   <double_uscore>T_FLT_MIN_10_EXP 
#   define DBL_MAX_EXP      <double_uscore>T_FLT_MAX_EXP 
#   define DBL_MAX_10_EXP   <double_uscore>T_FLT_MAX_10_EXP 
#   define DBL_MIN          <double_uscore>T_FLT_MIN 
#elif <double_uscore>G_FLOAT 
#   define DBL_MANT_DIG     <double_uscore>G_DBL_MANT_DIG 
#   define DBL_DIG          <double_uscore>G_FLT_DIG 
#   define DBL_MIN_EXP      <double_uscore>G_FLT_MIN_EXP 
#   define DBL_MIN_10_EXP   <double_uscore>G_FLT_MIN_10_EXP 
#   define DBL_MAX_EXP      <double_uscore>G_FLT_MAX_EXP 
#   define DBL_MAX_10_EXP   <double_uscore>G_FLT_MAX_10_EXP 
#   define DBL_MIN          <double_uscore>G_FLT_MIN 
#else 
#   define DBL_MANT_DIG     56 
#   define DBL_DIG          16 
#   define DBL_MIN_EXP      <double_uscore>F_FLT_MIN_EXP 
#   define DBL_MIN_10_EXP   <double_uscore>F_FLT_MIN_10_EXP 
#   define DBL_MAX_EXP      <double_uscore>F_FLT_MAX_EXP 
#   define DBL_MAX_10_EXP   <double_uscore>F_FLT_MAX_10_EXP 
#   define DBL_MIN          2.93873587705571877e-39 
#endif 
 
 
#if <double_uscore>IEEE_FLOAT 
#   define DBL_MAX          <double_uscore>T_FLT_MAX 
#elif <double_uscore>G_FLOAT 
#   define DBL_MAX          <double_uscore>G_FLT_MAX 
#else 
#   ifndef <double_uscore>ALPHA 
#       define DBL_MAX      1.70141183460469229e+38 
#   else 
#       define DBL_MAX      1.70141183460469213e+38      
#   endif 
#endif 
 
 
#if <double_uscore>IEEE_FLOAT 
#   define DBL_EPSILON      <double_uscore>T_FLT_EPSILON 
#elif <double_uscore>G_FLOAT || (<double_uscore>D_FLOAT && defined(<double_uscore>ALPHA)) 
#   define DBL_EPSILON      (1.0 / (1 << 20) / (1 << 16) / (1 << 16)) 
#else 
#   define DBL_EPSILON      (1.0 / (1 << 23) / (1 << 16) / (1 << 16)) 
#endif 
 
 
/* 
**  Define the LDBL values based on <double_uscore>X_FLOAT 
*/ 
#if <double_uscore>X_FLOAT 
#   define LDBL_MANT_DIG    <double_uscore>X_FLT_MANT_DIG 
#   define LDBL_DIG         <double_uscore>X_FLT_DIG 
#   define LDBL_MIN_EXP     <double_uscore>X_FLT_MIN_EXP 
#   define LDBL_MIN_10_EXP  <double_uscore>X_FLT_MIN_10_EXP 
#   define LDBL_MAX_EXP     <double_uscore>X_FLT_MAX_EXP 
#   define LDBL_MAX_10_EXP  <double_uscore>X_FLT_MAX_10_EXP 
#   define LDBL_MAX         <double_uscore>X_FLT_MAX 
#   define LDBL_EPSILON     <double_uscore>X_FLT_EPSILON 
#   define LDBL_MIN         3.3621031431120935062626778173217526025981e-4932l 
#else 
#   define LDBL_MANT_DIG    DBL_MANT_DIG 
#   define LDBL_DIG         DBL_DIG 
#   define LDBL_MIN_EXP     DBL_MIN_EXP 
#   define LDBL_MIN_10_EXP  DBL_MIN_10_EXP 
#   define LDBL_MAX_EXP     DBL_MAX_EXP 
#   define LDBL_MAX_10_EXP  DBL_MAX_10_EXP 
#   define LDBL_MAX         DBL_MAX 
#   define LDBL_EPSILON     DBL_EPSILON 
#   define LDBL_MIN         DBL_MIN 
#endif 
 
#ifdef <double_uscore>cplusplus 
    } 
#endif 
 
#pragma <double_uscore>standard 
#endif /* <double_uscore>FLOAT_LOADED */ 
 

E.2 Contents of <limits.h>

The <limits.h> header file has the following contents:


#ifndef <double_uscore>LIMITS_LOADED 
#define <double_uscore>LIMITS_LOADED 1 
/**************************************************************************** 
** 
**  <limits.h> - Sizes of integral types 
** 
***************************************************************************** 
**  Header introduced by the ANSI C Standard 
***************************************************************************** 
** 
**  Copyright Digital Equipment Corporation 1993, 1997.  All rights reserved. 
** 
**  Restricted Rights: Use, duplication, or disclosure by the U.S. 
**  Government is subject to restrictions as set forth in subparagraph 
**  (c) (1) (ii) of DFARS 252.227-7013, or in FAR 52.227-19, or in FAR 
**  52.227-14 Alt. III, as applicable. 
** 
**  This software is proprietary to and embodies the confidential 
**  technology of Digital Equipment Corporation. Possession, use, or 
**  copying of this software and media is authorized only pursuant to a 
**  valid written license from Digital or an authorized sublicensor. 
** 
****************************************************************************** 
**                                  Note 
****************************************************************************** 
** 
**  Section 2.2.4.2 of the Rationale states "The limits for the maxima and 
**  minima of unsigned types are specified as unsigned constants..." 
** 
**  The alert reader will notice there are no minima for the unsigned types, 
**  but we will follow the Rationale's advice anyway. 
** 
****************************************************************************** 
**                           Implementors Note 
****************************************************************************** 
** 
**  Some constants in this file such as INT_MIN is defined in terms of an 
**  expression involving an INT_MAX which is a constant value.  Please do 
**  not be tempted to speed processing up by evaluating those expressions 
**  into constant values.  This will cause things to not work correctly. 
****************************************************************************** 
*/ 
 
#include "common_header.h" 
#pragma   <double_uscore>nostandard 
 
/* 
**  Number of bits for the smallest object that is not a bit-field (byte) 
*/ 
#define   CHAR_BIT    8 
 
 
/* 
**  Minimum and maximum values for "signed/unsigned char" 
*/ 
#define   UCHAR_MAX   255u 
#define   SCHAR_MAX   127 
#define   SCHAR_MIN   (-SCHAR_MAX - 1) 
 
 
/* 
**  Minimum and maximum values for "char" affected by /unsigned_char qualifier 
*/ 
#ifdef <double_uscore>UNSIGNED_CHAR 
#define   CHAR_MIN    0 
#define   CHAR_MAX    UCHAR_MAX 
#else 
#define   CHAR_MIN    SCHAR_MIN 
#define   CHAR_MAX    SCHAR_MAX 
#endif 
 
 
/* 
**  Minimum and maximum values for "signed/unsigned short int" 
*/ 
#define   USHRT_MAX   65535u 
#define   SHRT_MAX    32767 
#define   SHRT_MIN    (-SHRT_MAX - 1) 
 
 
/* 
**  Minimum and maximum values for "signed/unsigned int" 
*/ 
#define   UINT_MAX    4294967295u 
#define   INT_MAX     2147483647 
#define   INT_MIN     (-INT_MAX - 1) 
 
 
/* 
**  Minimum and maximum values for "signed/unsigned long int" 
*/ 
#define   ULONG_MAX   4294967295u 
#define   LONG_MAX    2147483647 
#define   LONG_MIN    (-LONG_MAX - 1) 
 
 
/* 
**  Minimum and maximum values for "signed/unsigned <double_uscore>intxx" 
*/ 
#define <double_uscore>UINT16_MAX  65535u 
#define <double_uscore>INT16_MAX   32767 
#define <double_uscore>INT16_MIN   (-<double_uscore>INT16_MAX - 1) 
 
#define <double_uscore>UINT32_MAX  4294967295u 
#define <double_uscore>INT32_MAX   2147483647 
#define <double_uscore>INT32_MIN   (-<double_uscore>INT32_MAX - 1) 
 
 
#ifdef <double_uscore>ALPHA 
#define <double_uscore>UINT64_MAX  18446744073709551615u 
#define <double_uscore>INT64_MAX   9223372036854775807 
#define <double_uscore>INT64_MIN   (-<double_uscore>INT64_MAX - 1) 
#endif 
 
#if <double_uscore>CRTL_VER < 60200000 
#   define  MB_LEN_MAX               1   /*  Before OpenVMS V6.2  */ 
#else 
#   define  MB_LEN_MAX               8   /*  After  OpenVMS V6.2  */ 
#endif 
 
/* 
**  Limits which changed beginning with OpenVMS V6.2 
*/ 
#   if defined(_XOPEN_SOURCE) || !defined(_ANSI_C_SOURCE) 
#   define  COLL_WEIGHTS_MAX         5   /*  Max collate weights  */ 
#   define  NL_TEXTMAX            8192 
#   define  NL_SETMAX            65535 
#   define  NL_MSGMAX            65535 
#   define  CHARCLASS_NAME_MAX      14 
#   define  NL_ARGMAX                9 
#   define  NL_LANGMAX              14 
#   define  TZNAME_MAX              15 
#   define  SSIZE_MAX          INT_MAX 
 
    /* 
    ** Limits needed to support *conf() functions. 
    */ 
#   define  BC_BASE_MAX             -1   /* Max ibase and obase values for bc not implemented */ 
#   define  BC_DIM_MAX              -1   /* Max num elements in array for bcnot implemented */ 
#   define  BC_SCALE_MAX            -1   /* Max scale value allowed by bc not implemented */ 
#   define  BC_STRING_MAX           -1   /* Max len of string constant by bc not implemented */ 
 
#   define  EXPR_NEST_MAX           (-1)  /* Max num expression nested for expr */ 
#   define  LINE_MAX                (-1)  /* Max len of utility input line */ 
#   define  RE_DUP_MAX              (-1)  /* Max num repeated reg for interval */ 
 
#   define  NGROUPS_MAX             0   /* User can be in no extra groups */ 
#   define  PASS_MAX                31    /* Max bytes in a password */ 
#   define  ARG_MAX                 4096  /* Max len of arg to exec rtns */ 
 
    /* 
    **  These are used by pathconf() as well as others 
    */ 
#   define  LINK_MAX     1      /* Only 1 link to a file */ 
#   define  MAX_CANON     511    /* Max bytes in terminal canonical input */ 
#   define  MAX_INPUT     511    /* Max bytes required as input before reading */ 
#   define  NAME_MAX     255    /* Max bytes in filename */ 
#   define  PATH_MAX     255    /* Max bytes in pathname */ 
#   define  PIPE_BUF     512    /* Max atomic bytes on write to pipe */ 
 
    /*  
    **  New limits with DEC C V5.2 
    */  
#   define _POSIX_PIPE_BUF            512 
 
#endif /* XOPEN_SOURCE */ 
 
#if defined(_XOPEN_SOURCE_EXTENDED) || !defined(_ANSI_C_SOURCE) 
#   define  ATEXIT_MAX              32767 /* Max number of functions that may be registered 
                                          ** with atexit().  essentially unlimited 
                                          */ 
#   define  IOV_MAX                 (-1)  /* Maximum number of iovec structures 
                                          ** that one process has available for 
                                          ** use with readv() or writev() */ 
#endif 
 
 
 
/* 
**  Macros defined by the POSIX 1003.1c-1995 formally approved at 
**  the June 1995 meeting of the IEEE Standards Board.  The correct 
**  feature test macro for strictly conforming POSIX 1003.1c-1995 
**  applications is: 
** 
**      #define _POSIX_C_SOURCE 199506L 
*/ 
#if _POSIX_C_SOURCE >= 199506 || !defined _ANSI_C_SOURCE 
 
#   ifndef _POSIX_THREAD_DESTRUCTOR_ITERATIONS   
#      define _POSIX_THREAD_DESTRUCTOR_ITERATIONS   4 
#   endif 
 
#   ifndef _POSIX_THREAD_KEYS_MAX                
#      define _POSIX_THREAD_KEYS_MAX                128 
#   endif 
 
#   ifndef _POSIX_THREAD_THREADS_MAX             
#      define _POSIX_THREAD_THREADS_MAX             64 
#   endif 
 
#   ifndef PTHREAD_DESTRUCTOR_ITERATIONS         
#      define PTHREAD_DESTRUCTOR_ITERATIONS         _POSIX_THREAD_DESTRUCTOR_ITERATIONS 
#   endif 
 
#   ifndef PTHREAD_KEYS_MAX 
#      define PTHREAD_KEYS_MAX              255 
#   endif 
 
#   ifndef PTHREAD_STACK_MIN                 
#      if defined <double_uscore>ALPHA 
#         define PTHREAD_STACK_MIN                  8192 
#      else 
#         define PTHREAD_STACK_MIN                  1024 
#      endif 
#   endif 
 
#endif /* _POSIX_C_SOURCE >= 199506 */ 
 
#pragma <double_uscore>standard 
 
#endif /* <double_uscore>LIMITS_LOADED */ 


Previous Next Contents Index