a68g-mp.h

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

   1 //! @file a68g-mp.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_MP_H__)
  23 #define __A68G_MP_H__
  24 
  25 // A68G's multiprecision algorithms are not suited for more than a few hundred
  26 // digits. This is however sufficient for most practical MP applications.
  27 
  28 #define MP_MAX_DECIMALS 250
  29 
  30 #define MP_STATUS(z) ((z)[0])
  31 #define MP_EXPONENT(z) ((z)[1])
  32 #define MP_DIGIT(z, n) ((z)[(n) + 1])
  33 #define MP_SIGN(z) (SIGN (MP_DIGIT (z, 1)))
  34 #define LEN_MP(digs) (2 + digs)
  35 #define SIZE_MP(digs) A68_ALIGN (LEN_MP (digs) * sizeof (MP_T))
  36 #define IS_ZERO_MP(z) (MP_DIGIT (z, 1) == (MP_T) 0)
  37 
  38 #define PLUS_INF_MP(u) ((UNSIGNED_T) MP_STATUS (u) & PLUS_INF_MASK)
  39 #define MINUS_INF_MP(u) ((UNSIGNED_T) MP_STATUS (u) & MINUS_INF_MASK)
  40 #define INF_MP(u) (PLUS_INF_MP (u) || MINUS_INF_MP (u))
  41 #define CHECK_LONG_REAL(p, u, moid) PRELUDE_ERROR (INF_MP (u), p, ERROR_INFINITE, moid)
  42 
  43 static inline MP_T *set_mp (MP_T * z, MP_T x, INT_T expo, int digs)
  44 {
  45   memset (z, 0, SIZE_MP (digs));
  46   MP_STATUS (z) = (MP_T) INIT_MASK;
  47   MP_DIGIT (z, 1) = x;
  48   MP_EXPONENT (z) = (MP_T) expo;
  49   return z;
  50 }
  51 
  52 static inline MP_T *move_mp (MP_T *z, MP_T *x, int N) 
  53 {
  54   MP_T *y = z;
  55   N += 2;
  56   while (N--) {
  57     *z++ = *x++;
  58   }
  59   return y;
  60 }
  61 
  62 static inline MP_T *move_mp_part (MP_T *z, MP_T *x, int N) 
  63 {
  64   MP_T *y = z;
  65   while (N--) {
  66     *z++ = *x++;
  67   }
  68   return y;
  69 }
  70 
  71 static inline void check_mp_exp (NODE_T *p, MP_T *z) 
  72 {
  73   MP_T expo = (MP_EXPONENT (z) < 0 ? -MP_EXPONENT (z) : MP_EXPONENT (z));
  74   if (expo > MAX_MP_EXPONENT || (expo == MAX_MP_EXPONENT && ABS (MP_DIGIT (z, 1)) > (MP_T) 1)) {
  75     errno = EDOM;
  76     diagnostic (A68_RUNTIME_ERROR, p, ERROR_MP_OUT_OF_BOUNDS, NULL);
  77     extern void exit_genie (NODE_T *, int);
  78     exit_genie (p, A68_RUNTIME_ERROR);
  79   }
  80 }
  81 
  82 static inline MP_T *mp_one (int digs)
  83 {
  84   if (digs > A68_MP (mp_one_size)) {
  85     if (A68_MP (mp_one) != (MP_T *) NULL) {
  86       a68_free (A68_MP (mp_one));
  87     }
  88     A68_MP (mp_one) = (MP_T *) get_heap_space (SIZE_MP (digs));
  89     set_mp (A68_MP (mp_one), 1, 0, digs);
  90   }
  91   return A68_MP (mp_one);
  92 }
  93 
  94 static inline MP_T *lit_mp (NODE_T *p, MP_T u, INT_T expo, int digs)
  95 {
  96   ADDR_T pop_sp = A68_SP;
  97   if ((A68_SP += SIZE_MP (digs)) > A68 (expr_stack_limit)) {
  98     diagnostic (A68_RUNTIME_ERROR, p, ERROR_STACK_OVERFLOW);
  99     extern void exit_genie (NODE_T *, int);
 100     exit_genie (p, A68_RUNTIME_ERROR);
 101   }
 102   MP_T *z = (MP_T *) STACK_ADDRESS (pop_sp);
 103   (void) set_mp (z, u, expo, digs);
 104   return z;
 105 }
 106 
 107 static inline MP_T *nil_mp (NODE_T *p, int digs)
 108 {
 109   ADDR_T pop_sp = A68_SP;
 110   if ((A68_SP += SIZE_MP (digs)) > A68 (expr_stack_limit)) {
 111     diagnostic (A68_RUNTIME_ERROR, p, ERROR_STACK_OVERFLOW);
 112     extern void exit_genie (NODE_T *, int);
 113     exit_genie (p, A68_RUNTIME_ERROR);
 114   }
 115   MP_T *z = (MP_T *) STACK_ADDRESS (pop_sp);
 116   (void) set_mp (z, 0, 0, digs);
 117   return z;
 118 }
 119 
 120 static inline MP_T *empty_mp (NODE_T *p, int digs)
 121 {
 122   ADDR_T pop_sp = A68_SP;
 123   if ((A68_SP += SIZE_MP (digs)) > A68 (expr_stack_limit)) {
 124     diagnostic (A68_RUNTIME_ERROR, p, ERROR_STACK_OVERFLOW);
 125     extern void exit_genie (NODE_T *, int);
 126     exit_genie (p, A68_RUNTIME_ERROR);
 127   }
 128   return (MP_T *) STACK_ADDRESS (pop_sp);
 129 }
 130 
 131 extern MP_T *lengthen_mp (NODE_T *, MP_T *, int, MP_T *, int);
 132 
 133 static inline MP_T *len_mp (NODE_T *p, MP_T *u, int digs, int gdigs)
 134 {
 135   ADDR_T pop_sp = A68_SP;
 136   if ((A68_SP += SIZE_MP (gdigs)) > A68 (expr_stack_limit)) {
 137     diagnostic (A68_RUNTIME_ERROR, p, ERROR_STACK_OVERFLOW);
 138     extern void exit_genie (NODE_T *, int);
 139     exit_genie (p, A68_RUNTIME_ERROR);
 140   }
 141   MP_T *z = (MP_T *) STACK_ADDRESS (pop_sp);
 142   for (int k = 1; k <= digs; k++) {
 143     MP_DIGIT (z, k) = MP_DIGIT (u, k);
 144   }
 145   for (int k = digs + 1; k <= gdigs; k++) {
 146     MP_DIGIT (z, k) = (MP_T) 0;
 147   }
 148   MP_EXPONENT (z) = MP_EXPONENT (u);
 149   MP_STATUS (z) = MP_STATUS (u);
 150   return z;
 151 }
 152 
 153 static inline MP_T *cut_mp (NODE_T *p, MP_T *u, int digs, int gdigs)
 154 {
 155   ADDR_T pop_sp = A68_SP;
 156   ASSERT (digs > gdigs);
 157   BOOL_T neg = MP_DIGIT (u, 1) < 0;
 158   if ((A68_SP += SIZE_MP (gdigs)) > A68 (expr_stack_limit)) {
 159     diagnostic (A68_RUNTIME_ERROR, p, ERROR_STACK_OVERFLOW);
 160     extern void exit_genie (NODE_T *, int);
 161     exit_genie (p, A68_RUNTIME_ERROR);
 162   }
 163   MP_T *z = (MP_T *) STACK_ADDRESS (pop_sp);
 164   for (int k = 1; k <= gdigs; k++) {
 165     MP_DIGIT (z, k) = MP_DIGIT (u, k);
 166   }
 167   if (neg) {
 168     MP_DIGIT (z, 1) = -MP_DIGIT (z, 1);
 169   }
 170   if (MP_DIGIT (u, gdigs + 1) >= MP_RADIX / 2) {
 171     MP_DIGIT (z, gdigs) += 1;
 172     for (int k = digs; k >= 2 && MP_DIGIT (z, k) == MP_RADIX; k --) {
 173       MP_DIGIT (z, k) = 0;
 174       MP_DIGIT (z, k - 1) ++;
 175     }
 176   }
 177   if (neg) {
 178     MP_DIGIT (z, 1) = -MP_DIGIT (z, 1);
 179   }
 180   MP_EXPONENT (z) = MP_EXPONENT (u);
 181   MP_STATUS (z) = MP_STATUS (u);
 182   return z;
 183 }
 184 
 185 //! @brief Length in bytes of a long mp number.
 186 
 187 static inline size_t size_mp (void)
 188 {
 189   return (size_t) SIZE_MP (LONG_MP_DIGITS);
 190 }
 191 
 192 //! @brief Length in digits of a long mp number.
 193 
 194 static inline int mp_digits (void)
 195 {
 196   return LONG_MP_DIGITS;
 197 }
 198 
 199 //! @brief Length in bytes of a long long mp number.
 200 
 201 static inline size_t size_long_mp (void)
 202 {
 203   return (size_t) (SIZE_MP (A68_MP (varying_mp_digits)));
 204 }
 205 
 206 //! @brief digits in a long mp number.
 207 
 208 static inline int long_mp_digits (void)
 209 {
 210   return A68_MP (varying_mp_digits);
 211 }
 212 
 213 #define SET_MP_ZERO(z, digits)\
 214   (void) set_mp ((z), 0, 0, digits);
 215 
 216 #define SET_MP_ONE(z, digits)\
 217   (void) set_mp ((z), (MP_T) 1, 0, digits);
 218 
 219 #define SET_MP_MINUS_ONE(z, digits)\
 220   (void) set_mp ((z), (MP_T) -1, 0, digits);
 221 
 222 #define SET_MP_HALF(z, digits)\
 223   (void) set_mp ((z), (MP_T) (MP_RADIX / 2), -1, digits);
 224 
 225 #define SET_MP_MINUS_HALF(z, digits)\
 226   (void) set_mp ((z), (MP_T) -(MP_RADIX / 2), -1, digits);
 227 
 228 #define SET_MP_QUART(z, digits)\
 229   (void) set_mp ((z), (MP_T) (MP_RADIX / 4), -1, digits);
 230 
 231 enum {MP_SQRT_PI, MP_PI, MP_LN_PI, MP_SQRT_TWO_PI, MP_TWO_PI, MP_HALF_PI, MP_180_OVER_PI, MP_PI_OVER_180};
 232 
 233 // If MP_DOUBLE_PRECISION is defined functions are evaluated in double precision.
 234 
 235 #undef MP_DOUBLE_PRECISION
 236 
 237 #define MINIMUM(x, y) ((x) < (y) ? (x) : (y))
 238 
 239 // GUARD_DIGITS: number of guard digits.
 240 
 241 #if defined (MP_DOUBLE_PRECISION)
 242 #define GUARD_DIGITS(digits) (digits)
 243 #else
 244 #define GUARD_DIGITS(digits) (2)
 245 #endif
 246 
 247 #define FUN_DIGITS(n) ((n) + GUARD_DIGITS (n))
 248 
 249 // External multi-precision procedures
 250 
 251 extern BOOL_T check_mp_int (MP_T *, MOID_T *);
 252 extern BOOL_T is_int_mp (NODE_T *p, MP_T *z, int digits);
 253 extern BOOL_T same_mp (NODE_T *, MP_T *, MP_T *, int);
 254 extern int long_mp_digits (void);
 255 extern INT_T mp_to_int (NODE_T *, MP_T *, int);
 256 extern int width_to_mp_digits (int);
 257 extern MP_T *abs_mp (NODE_T *, MP_T *, MP_T *, int);
 258 extern MP_T *acosdg_mp (NODE_T *, MP_T *, MP_T *, int);
 259 extern MP_T *acosh_mp (NODE_T *, MP_T *, MP_T *, int);
 260 extern MP_T *acos_mp (NODE_T *, MP_T *, MP_T *, int);
 261 extern MP_T *acotdg_mp (NODE_T *, MP_T *, MP_T *, int);
 262 extern MP_T *acot_mp (NODE_T *, MP_T *, MP_T *, int);
 263 extern MP_T *acsc_mp (NODE_T *, MP_T *, MP_T *, int);
 264 extern MP_T *add_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 265 extern MP_T *align_mp (MP_T *, INT_T *, int);
 266 extern MP_T *asec_mp (NODE_T *, MP_T *, MP_T *, int);
 267 extern MP_T *asindg_mp (NODE_T *, MP_T *, MP_T *, int);
 268 extern MP_T *asinh_mp (NODE_T *, MP_T *, MP_T *, int);
 269 extern MP_T *asin_mp (NODE_T *, MP_T *, MP_T *, int);
 270 extern MP_T *atan2dg_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 271 extern MP_T *atan2_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 272 extern MP_T *atandg_mp (NODE_T *, MP_T *, MP_T *, int);
 273 extern MP_T *atanh_mp (NODE_T *, MP_T *, MP_T *, int);
 274 extern MP_T *atan_mp (NODE_T *, MP_T *, MP_T *, int);
 275 extern MP_T *beta_inc_mp (NODE_T *, MP_T *, MP_T *, MP_T *, MP_T *, int);
 276 extern MP_T *beta_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 277 extern MP_T *cacosh_mp (NODE_T *, MP_T *, MP_T *, int);
 278 extern MP_T *cacos_mp (NODE_T *, MP_T *, MP_T *, int);
 279 extern MP_T *casinh_mp (NODE_T *, MP_T *, MP_T *, int);
 280 extern MP_T *casin_mp (NODE_T *, MP_T *, MP_T *, int);
 281 extern MP_T *catanh_mp (NODE_T *, MP_T *, MP_T *, int);
 282 extern MP_T *catan_mp (NODE_T *, MP_T *, MP_T *, int);
 283 extern MP_T *ccosh_mp (NODE_T *, MP_T *, MP_T *, int);
 284 extern MP_T *ccos_mp (NODE_T *, MP_T *, MP_T *, int);
 285 extern MP_T *cdiv_mp (NODE_T *, MP_T *, MP_T *, MP_T *, MP_T *, int);
 286 extern MP_T *cexp_mp (NODE_T *, MP_T *, MP_T *, int);
 287 extern MP_T *cln_mp (NODE_T *, MP_T *, MP_T *, int);
 288 extern MP_T *cmul_mp (NODE_T *, MP_T *, MP_T *, MP_T *, MP_T *, int);
 289 extern MP_T *cosdg_mp (NODE_T *, MP_T *, MP_T *, int);
 290 extern MP_T *cosh_mp (NODE_T *, MP_T *, MP_T *, int);
 291 extern MP_T *cos_mp (NODE_T *, MP_T *, MP_T *, int);
 292 extern MP_T *cospi_mp (NODE_T *, MP_T *, MP_T *, int);
 293 extern MP_T *cotdg_mp (NODE_T *, MP_T *, MP_T *, int);
 294 extern MP_T *cot_mp (NODE_T *, MP_T *, MP_T *, int);
 295 extern MP_T *cotpi_mp (NODE_T *, MP_T *, MP_T *, int);
 296 extern MP_T *csc_mp (NODE_T *, MP_T *, MP_T *, int);
 297 extern MP_T *csinh_mp (NODE_T *, MP_T *, MP_T *, int);
 298 extern MP_T *csin_mp (NODE_T *, MP_T *, MP_T *, int);
 299 extern MP_T *csqrt_mp (NODE_T *, MP_T *, MP_T *, int);
 300 extern MP_T *ctanh_mp (NODE_T *, MP_T *, MP_T *, int);
 301 extern MP_T *ctan_mp (NODE_T *, MP_T *, MP_T *, int);
 302 extern MP_T *curt_mp (NODE_T *, MP_T *, MP_T *, int);
 303 extern MP_T *div_mp_digit (NODE_T *, MP_T *, MP_T *, MP_T, int);
 304 extern MP_T *div_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 305 extern MP_T *entier_mp (NODE_T *, MP_T *, MP_T *, int);
 306 extern MP_T *erfc_mp (NODE_T *, MP_T *, MP_T *, int);
 307 extern MP_T *erf_mp (NODE_T *, MP_T *, MP_T *, int);
 308 extern MP_T *expm1_mp (NODE_T *, MP_T *, MP_T *, int);
 309 extern MP_T *exp_mp (NODE_T *, MP_T *, MP_T *, int);
 310 extern MP_T *floor_mp (NODE_T *, MP_T *, MP_T *, int);
 311 extern MP_T *gamma_inc_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 312 extern MP_T *gamma_mp (NODE_T *, MP_T *, MP_T *, int);
 313 extern MP_T *half_mp (NODE_T *, MP_T *, MP_T *, int);
 314 extern MP_T *hyp_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 315 extern MP_T *hypot_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 316 extern MP_T *int_to_mp (NODE_T *, MP_T *, INT_T, int);
 317 extern MP_T *inverfc_mp (NODE_T *, MP_T *, MP_T *, int);
 318 extern MP_T *inverf_mp (NODE_T *, MP_T *, MP_T *, int);
 319 extern MP_T *lnbeta_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 320 extern MP_T *lngamma_mp (NODE_T *, MP_T *, MP_T *, int);
 321 extern MP_T *ln_mp (NODE_T *, MP_T *, MP_T *, int);
 322 extern MP_T *log_mp (NODE_T *, MP_T *, MP_T *, int);
 323 extern MP_T *minus_mp (NODE_T *, MP_T *, MP_T *, int);
 324 extern MP_T *minus_one_mp (NODE_T *, MP_T *, MP_T *, int);
 325 extern MP_T *mod_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 326 extern MP_T *mp_ln_10 (NODE_T *, MP_T *, int);
 327 extern MP_T *mp_ln_scale (NODE_T *, MP_T *, int);
 328 extern MP_T *mp_pi (NODE_T *, MP_T *, int, int);
 329 extern MP_T *ten_up_mp (NODE_T *, MP_T *, int, int);
 330 extern MP_T *mul_mp_digit (NODE_T *, MP_T *, MP_T *, MP_T, int);
 331 extern MP_T *mul_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 332 extern MP_T *one_minus_mp (NODE_T *, MP_T *, MP_T *, int);
 333 extern MP_T *over_mp_digit (NODE_T *, MP_T *, MP_T *, MP_T, int);
 334 extern MP_T *over_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 335 extern MP_T *plus_one_mp (NODE_T *, MP_T *, MP_T *, int);
 336 extern MP_T *pow_mp_int (NODE_T *, MP_T *, MP_T *, INT_T, int);
 337 extern MP_T *pow_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 338 extern MP_T *real_to_mp (NODE_T *, MP_T *, REAL_T, int);
 339 extern MP_T *rec_mp (NODE_T *, MP_T *, MP_T *, int);
 340 extern MP_T *round_mp (NODE_T *, MP_T *, MP_T *, int);
 341 extern MP_T *sec_mp (NODE_T *, MP_T *, MP_T *, int);
 342 extern MP_T *set_mp (MP_T *, MP_T, INT_T, int);
 343 extern MP_T *shorten_mp (NODE_T *, MP_T *, int, MP_T *, int);
 344 extern MP_T *sindg_mp (NODE_T *, MP_T *, MP_T *, int);
 345 extern MP_T *sinh_mp (NODE_T *, MP_T *, MP_T *, int);
 346 extern MP_T *sin_mp (NODE_T *, MP_T *, MP_T *, int);
 347 extern MP_T *sinpi_mp (NODE_T *, MP_T *, MP_T *, int);
 348 extern MP_T *sqrt_mp (NODE_T *, MP_T *, MP_T *, int);
 349 extern MP_T *strtomp (NODE_T *, MP_T *, char *, int);
 350 extern MP_T *sub_mp (NODE_T *, MP_T *, MP_T *, MP_T *, int);
 351 extern MP_T *tandg_mp (NODE_T *, MP_T *, MP_T *, int);
 352 extern MP_T *tanh_mp (NODE_T *, MP_T *, MP_T *, int);
 353 extern MP_T *tan_mp (NODE_T *, MP_T *, MP_T *, int);
 354 extern MP_T *tanpi_mp (NODE_T *, MP_T *, MP_T *, int);
 355 extern MP_T *tenth_mp (NODE_T *, MP_T *, MP_T *, int);
 356 extern MP_T *trunc_mp (NODE_T *, MP_T *, MP_T *, int);
 357 extern MP_T *unt_to_mp (NODE_T *, MP_T *, UNSIGNED_T, int);
 358 extern REAL_T mp_to_real (NODE_T *, MP_T *, int);
 359 extern void eq_mp (NODE_T *, A68_BOOL *, MP_T *, MP_T *, int);
 360 extern void ge_mp (NODE_T *, A68_BOOL *, MP_T *, MP_T *, int);
 361 extern void genie_pi_mp (NODE_T *);
 362 extern void gt_mp (NODE_T *, A68_BOOL *, MP_T *, MP_T *, int);
 363 extern void le_mp (NODE_T *, A68_BOOL *, MP_T *, MP_T *, int);
 364 extern void lt_mp (NODE_T *, A68_BOOL *, MP_T *, MP_T *, int);
 365 extern void ne_mp (NODE_T *, A68_BOOL *, MP_T *, MP_T *, int);
 366 extern void raw_write_mp (char *, MP_T *, int);
 367 extern void set_long_mp_digits (int);
 368 extern void test_long_int_range (NODE_T *, MP_T *, MOID_T *);
 369 
 370 extern GPROC genie_infinity_mp;
 371 extern GPROC genie_minus_infinity_mp;
 372 extern GPROC genie_beta_inc_mp;
 373 extern GPROC genie_gamma_inc_mp;
 374 extern GPROC genie_gamma_inc_f_mp;
 375 extern GPROC genie_gamma_inc_g_mp;
 376 extern GPROC genie_gamma_inc_h_mp;
 377 extern GPROC genie_gamma_inc_gf_mp;
 378 extern GPROC genie_abs_mp;
 379 extern GPROC genie_abs_mp_complex;
 380 extern GPROC genie_acosdg_mp;
 381 extern GPROC genie_acosdg_mp;
 382 extern GPROC genie_acosh_mp;
 383 extern GPROC genie_acosh_mp_complex;
 384 extern GPROC genie_acos_mp;
 385 extern GPROC genie_acos_mp_complex;
 386 extern GPROC genie_acotdg_mp;
 387 extern GPROC genie_acot_mp;
 388 extern GPROC genie_asec_mp;
 389 extern GPROC genie_acsc_mp;
 390 extern GPROC genie_add_mp;
 391 extern GPROC genie_add_mp_complex;
 392 extern GPROC genie_and_mp;
 393 extern GPROC genie_arg_mp_complex;
 394 extern GPROC genie_asindg_mp;
 395 extern GPROC genie_asindg_mp;
 396 extern GPROC genie_asinh_mp;
 397 extern GPROC genie_asinh_mp_complex;
 398 extern GPROC genie_asin_mp;
 399 extern GPROC genie_asin_mp_complex;
 400 extern GPROC genie_atan2_mp;
 401 extern GPROC genie_atandg_mp;
 402 extern GPROC genie_atan2dg_mp;
 403 extern GPROC genie_atanh_mp;
 404 extern GPROC genie_atanh_mp_complex;
 405 extern GPROC genie_atan_mp;
 406 extern GPROC genie_atan_mp_complex;
 407 extern GPROC genie_bin_mp;
 408 extern GPROC genie_clear_long_mp_bits;
 409 extern GPROC genie_conj_mp_complex;
 410 extern GPROC genie_cosdg_mp;
 411 extern GPROC genie_cosh_mp;
 412 extern GPROC genie_cosh_mp_complex;
 413 extern GPROC genie_cos_mp;
 414 extern GPROC genie_cos_mp_complex;
 415 extern GPROC genie_cospi_mp;
 416 extern GPROC genie_cotdg_mp;
 417 extern GPROC genie_cot_mp;
 418 extern GPROC genie_sec_mp;
 419 extern GPROC genie_csc_mp;
 420 extern GPROC genie_cotpi_mp;
 421 extern GPROC genie_curt_mp;
 422 extern GPROC genie_divab_mp;
 423 extern GPROC genie_divab_mp_complex;
 424 extern GPROC genie_div_mp;
 425 extern GPROC genie_div_mp_complex;
 426 extern GPROC genie_elem_long_mp_bits;
 427 extern GPROC genie_elem_long_mp_bits;
 428 extern GPROC genie_entier_mp;
 429 extern GPROC genie_eq_mp;
 430 extern GPROC genie_eq_mp_complex;
 431 extern GPROC genie_erfc_mp;
 432 extern GPROC genie_erf_mp;
 433 extern GPROC genie_exp_mp;
 434 extern GPROC genie_exp_mp_complex;
 435 extern GPROC genie_gamma_mp;
 436 extern GPROC genie_lngamma_mp;
 437 extern GPROC genie_beta_mp;
 438 extern GPROC genie_lnbeta_mp;
 439 extern GPROC genie_ge_mp;
 440 extern GPROC genie_get_long_mp_bits;
 441 extern GPROC genie_get_long_mp_complex;
 442 extern GPROC genie_get_long_mp_int;
 443 extern GPROC genie_get_long_mp_real;
 444 extern GPROC genie_get_mp_complex;
 445 extern GPROC genie_gt_mp;
 446 extern GPROC genie_im_mp_complex;
 447 extern GPROC genie_inverfc_mp;
 448 extern GPROC genie_inverf_mp;
 449 extern GPROC genie_le_mp;
 450 extern GPROC genie_lengthen_complex_to_mp_complex;
 451 extern GPROC genie_lengthen_int_to_mp;
 452 extern GPROC genie_lengthen_mp_complex_to_long_mp_complex;
 453 extern GPROC genie_lengthen_mp_to_long_mp;
 454 extern GPROC genie_lengthen_real_to_mp;
 455 extern GPROC genie_lengthen_unt_to_mp;
 456 extern GPROC genie_ln_mp;
 457 extern GPROC genie_ln_mp_complex;
 458 extern GPROC genie_log_mp;
 459 extern GPROC genie_long_mp_bits_width;
 460 extern GPROC genie_long_mp_exp_width;
 461 extern GPROC genie_long_mp_int_width;
 462 extern GPROC genie_long_mp_max_bits;
 463 extern GPROC genie_long_mp_max_int;
 464 extern GPROC genie_long_mp_max_real;
 465 extern GPROC genie_long_mp_min_real;
 466 extern GPROC genie_long_mp_real_width;
 467 extern GPROC genie_long_mp_small_real;
 468 extern GPROC genie_lt_mp;
 469 extern GPROC genie_minusab_mp;
 470 extern GPROC genie_minusab_mp_complex;
 471 extern GPROC genie_minus_mp;
 472 extern GPROC genie_minus_mp_complex;
 473 extern GPROC genie_modab_mp;
 474 extern GPROC genie_mod_mp;
 475 extern GPROC genie_mul_mp;
 476 extern GPROC genie_mul_mp_complex;
 477 extern GPROC genie_ne_mp;
 478 extern GPROC genie_ne_mp_complex;
 479 extern GPROC genie_not_mp;
 480 extern GPROC genie_odd_mp;
 481 extern GPROC genie_or_mp;
 482 extern GPROC genie_overab_mp;
 483 extern GPROC genie_over_mp;
 484 extern GPROC genie_pi_mp;
 485 extern GPROC genie_plusab_mp;
 486 extern GPROC genie_plusab_mp_complex;
 487 extern GPROC genie_pow_mp;
 488 extern GPROC genie_pow_mp_complex_int;
 489 extern GPROC genie_pow_mp_int;
 490 extern GPROC genie_pow_mp_int_int;
 491 extern GPROC genie_print_long_mp_bits;
 492 extern GPROC genie_print_long_mp_complex;
 493 extern GPROC genie_print_long_mp_int;
 494 extern GPROC genie_print_long_mp_real;
 495 extern GPROC genie_print_mp_complex;
 496 extern GPROC genie_put_long_mp_bits;
 497 extern GPROC genie_put_long_mp_complex;
 498 extern GPROC genie_put_long_mp_int;
 499 extern GPROC genie_put_long_mp_real;
 500 extern GPROC genie_put_mp_complex;
 501 extern GPROC genie_read_long_mp_bits;
 502 extern GPROC genie_read_long_mp_complex;
 503 extern GPROC genie_read_long_mp_int;
 504 extern GPROC genie_read_long_mp_real;
 505 extern GPROC genie_read_mp_complex;
 506 extern GPROC genie_re_mp_complex;
 507 extern GPROC genie_round_mp;
 508 extern GPROC genie_set_long_mp_bits;
 509 extern GPROC genie_shl_mp;
 510 extern GPROC genie_shorten_long_mp_complex_to_mp_complex;
 511 extern GPROC genie_shorten_long_mp_to_mp;
 512 extern GPROC genie_shorten_mp_complex_to_complex;
 513 extern GPROC genie_shorten_mp_to_bits;
 514 extern GPROC genie_shorten_mp_to_int;
 515 extern GPROC genie_shorten_mp_to_real;
 516 extern GPROC genie_shr_mp;
 517 extern GPROC genie_sign_mp;
 518 extern GPROC genie_sindg_mp;
 519 extern GPROC genie_sinh_mp;
 520 extern GPROC genie_sinh_mp_complex;
 521 extern GPROC genie_sin_mp;
 522 extern GPROC genie_sin_mp_complex;
 523 extern GPROC genie_sinpi_mp;
 524 extern GPROC genie_sqrt_mp;
 525 extern GPROC genie_sqrt_mp_complex;
 526 extern GPROC genie_sub_mp;
 527 extern GPROC genie_sub_mp_complex;
 528 extern GPROC genie_tandg_mp;
 529 extern GPROC genie_tanh_mp;
 530 extern GPROC genie_tanh_mp_complex;
 531 extern GPROC genie_tan_mp;
 532 extern GPROC genie_tan_mp_complex;
 533 extern GPROC genie_tanpi_mp;
 534 extern GPROC genie_timesab_mp;
 535 extern GPROC genie_timesab_mp_complex;
 536 extern GPROC genie_xor_mp;
 537 
 538 #if defined (HAVE_GNU_MPFR)
 539 extern GPROC genie_beta_inc_mpfr;
 540 extern GPROC genie_ln_beta_mpfr;
 541 extern GPROC genie_beta_mpfr;
 542 extern GPROC genie_gamma_inc_mpfr;
 543 extern GPROC genie_gamma_inc_real_mpfr;
 544 extern GPROC genie_gamma_inc_real_16_mpfr;
 545 extern GPROC genie_gamma_mpfr;
 546 extern GPROC genie_lngamma_mpfr;
 547 extern GPROC genie_mpfr_erfc_mp;
 548 extern GPROC genie_mpfr_erf_mp;
 549 extern GPROC genie_mpfr_inverfc_mp;
 550 extern GPROC genie_mpfr_inverf_mp;
 551 extern GPROC genie_mpfr_mp;
 552 extern size_t mpfr_digits (void);
 553 #endif
 554 
 555 #if (A68_LEVEL <= 2)
 556 extern int get_mp_bits_width (MOID_T *);
 557 extern int get_mp_bits_words (MOID_T *);
 558 extern MP_BITS_T *stack_mp_bits (NODE_T *, MP_T *, MOID_T *);
 559 #endif
 560 
 561 #endif