a68g-stddef.h

You can download the current version of Algol 68 Genie and its documentation here.

   1 //! @file a68g-stddef.h
   2 //! @author J. Marcel van der Veer
   3 //!
   4 //! @section Copyright
   5 //!
   6 //! This file is part of Algol68G - an Algol 68 compiler-interpreter.
   7 //! Copyright 2001-2023 J. Marcel van der Veer .
   8 //!
   9 //! @section License
  10 //!
  11 //! This program is free software; you can redistribute it and/or modify it 
  12 //! under the terms of the GNU General Public License as published by the 
  13 //! Free Software Foundation; either version 3 of the License, or 
  14 //! (at your option) any later version.
  15 //!
  16 //! This program is distributed in the hope that it will be useful, but 
  17 //! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
  18 //! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 
  19 //! more details. You should have received a copy of the GNU General Public 
  20 //! License along with this program. If not, see .
  21 
  22 #if !defined (__A68G_STDDEF_H__)
  23 #define __A68G_STDDEF_H__ 
  24 
  25 #define DOUBLE_ACCURACY (REAL_DIG - 1)
  26 
  27 // Multi-precision parameters
  28 #define LONG_LONG_EXP_WIDTH (EXP_WIDTH)
  29 #define LONG_LONG_INT_WIDTH (1 + LONG_LONG_WIDTH)
  30 #define LONG_LONG_REAL_WIDTH ((long_mp_digits() - 1) * LOG_MP_RADIX)
  31 #define LONG_LONG_WIDTH (long_mp_digits() * LOG_MP_RADIX)
  32 
  33 // Other WIDTHs
  34 #define BYTES_WIDTH 32
  35 #define LONG_BYTES_WIDTH 256
  36 #define MAX_REAL_EXPO 511
  37 
  38 #define LOG_DBL_EPSILON   (-3.6043653389117154e+01)
  39 #define LOG_DBL_MIN       (-7.0839641853226408e+02)
  40 #define LOG_DBL_MAX       (7.0978271289338397e+02)
  41 
  42 #define REAL_DIG DBL_DIG
  43 #define REAL_EPSILON DBL_EPSILON
  44 #define REAL_MANT_DIG DBL_MANT_DIG
  45 #define REAL_MAX DBL_MAX
  46 #define REAL_MAX_10_EXP DBL_MAX_10_EXP
  47 #define REAL_MIN DBL_MIN
  48 #define REAL_MIN_10_EXP DBL_MIN_10_EXP
  49 
  50 #if (A68_LEVEL >= 3)
  51 
  52 #define REAL_WIDTH (REAL_DIG)
  53 #define MAX_REAL_16_EXPO 4932
  54 #define A68_MAX_INT (LLONG_MAX)
  55 #define A68_MAX_BITS (ULLONG_MAX)
  56 #define LONG_WIDTH (2 * INT_WIDTH + 1)
  57 #define LONG_REAL_WIDTH (FLT128_DIG - 1)
  58 #define EXP_WIDTH (3)
  59 #define LONG_EXP_WIDTH (4)
  60 #define LONG_BITS_WIDTH (2 * BITS_WIDTH)
  61 #define D_SIGN 0x8000000000000000LL
  62 #define NaN_MP ((MP_T *) NULL)
  63 #define MP_RADIX 1000000000
  64 #define LOG_MP_RADIX 9
  65 #define MP_RADIX_Q MP_RADIX##q
  66 #define DEFAULT_DOUBLE_DIGITS 4
  67 #define LONG_MP_DIGITS DEFAULT_DOUBLE_DIGITS
  68 #define LONG_LONG_MP_DIGITS width_to_mp_digits (4 * REAL_DIG + REAL_DIG / 2)
  69 #define MAX_MP_EXPONENT 111111             // Arbitrary. Largest range is A68_MAX_INT / Log A68_MAX_INT / LOG_MP_RADIX
  70 #define MAX_REPR_INT 9223372036854775808.0 // 2^63, max int in an extended double (no implicit bit, so 62-bit mantissa)
  71 #define MAX_DOUBLE_EXPO 4932
  72 
  73 #else // if (A68_LEVEL <= 2)
  74 
  75 #define REAL_WIDTH (REAL_DIG)
  76 #define A68_MAX_INT (INT_MAX)
  77 #define A68_MAX_BITS (UINT_MAX)
  78 #define LONG_WIDTH (LONG_MP_DIGITS * LOG_MP_RADIX)
  79 #define LONG_REAL_WIDTH ((LONG_MP_DIGITS - 1) * LOG_MP_RADIX)
  80 #define EXP_WIDTH ((int) (1 + log10 ((REAL_T) REAL_MAX_10_EXP)))
  81 #define LONG_EXP_WIDTH (EXP_WIDTH)
  82 #define D_SIGN 0x80000000L
  83 #define MP_BITS_BITS 23
  84 #define MP_BITS_RADIX 8388608   // Max power of two smaller than MP_RADIX
  85 #define NaN_MP ((MP_T *) NULL)
  86 #define MP_RADIX 10000000
  87 #define MP_RADIX_Q MP_RADIX##q
  88 #define LOG_MP_RADIX 7
  89 #define DEFAULT_DOUBLE_DIGITS 6
  90 #define LONG_MP_DIGITS DEFAULT_DOUBLE_DIGITS
  91 #define LONG_LONG_MP_DIGITS width_to_mp_digits (4 * REAL_DIG + REAL_DIG / 2)
  92 #define MAX_MP_EXPONENT 142857          // Arbitrary. Largest range is A68_MAX_INT / Log A68_MAX_INT / LOG_MP_RADIX
  93 #define MAX_REPR_INT 9007199254740992.0 // 2^53, max int in a double
  94 
  95 #endif
  96 
  97 #endif