1 /* big.h */ 2 3 /* Wesley Loewer's Big Numbers. (C) 1994, Wesley B. Loewer */ 4 5 #ifndef _BIG_H 6 #define _BIG_H 7 8 /************************************************************* 9 The following allows the programmer to customize routines. 10 They can be selected here or on the compiler command line. 11 **************************************************************/ 12 13 /* different pointer versions: near, based, far */ 14 /* huge pointers is not supported in assembly, only in C */ 15 /* uncomment only ONE of these or declare on compiler command line */ 16 /* #define BIG_NEAR */ 17 #if defined(_MSC_VER) 18 # define BIG_BASED 19 #elif defined( __BORLANDC__) 20 # define BIG_FAR 21 #endif 22 /* #define BIG_HUGE */ /* C code only */ 23 /* #define BIG_ANSI_C */ /* C code only */ 24 /* In DOS, BIG_ANSI_C uses default pointer for model selected */ 25 26 27 /* Number of bytes to use for integer part for fixed decimal math, */ 28 /* does not effect floating point math at all. */ 29 #define BN_INT_LENGTH 4 30 31 /* #define CALCULATING_BIG_PI */ /* define for generating big_pi[] table */ 32 33 /**************************************************************** 34 The rest is handled by the compiler 35 ****************************************************************/ 36 37 #ifndef BIG_NEAR 38 #ifndef BIG_BASED 39 #ifndef BIG_FAR 40 #ifndef BIG_HUGE 41 #ifndef BIG_ANSI_C 42 #error BIG_NEAR, BIG_BASED, BIG_FAR, BIG_HUGE, or BIG_ANSI_C must be defined. 43 #endif 44 #endif 45 #endif 46 #endif 47 #endif 48 49 #define LOG10_256 2.4082399653118 50 #define LOG_256 5.5451774444795 51 52 /* values that bf_math can hold, */ 53 /* 0 = bf_math is not being used */ 54 /* 1 = bf_math is being used */ 55 #define BIGNUM 1 /* bf_math is being used with bn_t numbers */ 56 #define BIGFLT 2 /* bf_math is being used with bf_t numbers */ 57 58 59 /* use this for dynamic allocation */ 60 #ifdef BIG_NEAR 61 extern _segment bignum_seg; 62 #define BIGDIST __near 63 #define BIG_NULL NULL 64 #define BIG_SIZE_T size_t 65 #define big_malloc(size) _nmalloc(size) 66 #define big_free(ptr) _nfree(ptr) 67 #endif 68 69 #ifdef BIG_BASED 70 extern _segment bignum_seg; 71 #define BIGDIST __based(bignum_seg) 72 #define BIG_NULL _NULLOFF 73 #define BIG_SIZE_T size_t 74 #define big_malloc(size) _bmalloc(bignum_seg, (size)) 75 #define big_free(ptr) _bfree( bignum_seg, (ptr)) 76 #endif 77 78 #ifdef BIG_FAR 79 #define BIGDIST __far 80 #define BIG_NULL NULL 81 #define BIG_SIZE_T size_t 82 #define big_malloc(size) _fmalloc( size ) 83 #define big_free(ptr) _ffree(ptr) 84 #endif 85 86 #ifdef BIG_HUGE 87 #define BIGDIST __huge 88 #define BIG_NULL NULL 89 #define BIG_SIZE_T long 90 #define big_malloc(size) _halloc( (size), 1 ) 91 #define big_free(ptr) _hfree(ptr) 92 #endif 93 94 #ifdef BIG_ANSI_C 95 #define USE_BIGNUM_C_CODE 96 #define BIGDIST 97 #define BIG_NULL NULL 98 #define BIG_SIZE_T size_t 99 #define big_malloc(size) malloc(size) 100 #define big_free(ptr) free(ptr) 101 #endif 102 103 typedef unsigned char BIGDIST * big_t; 104 #define bn_t big_t /* for clarification purposes */ 105 #define bf_t big_t 106 #define bf10_t big_t 107 108 #if 0 /* remove for Fractint */ 109 struct Complex 110 { 111 LDBL x; 112 LDBL y; 113 }; 114 typedef struct Complex _CMPLX; 115 #else 116 #include "cmplx.h" 117 #endif 118 119 struct BFComplex 120 { 121 bn_t x; 122 bn_t y; 123 }; 124 typedef struct BFComplex _BFCMPLX; 125 126 struct BNComplex 127 { 128 bn_t x; 129 bn_t y; 130 }; 131 typedef struct BNComplex _BNCMPLX; 132 133 /* globals */ 134 extern int fpu; 135 extern int cpu; 136 137 extern int bf_math; 138 139 extern int bnstep, intlength; 140 extern int bnlength, rlength, padding, decimals, shiftfactor; 141 extern int bflength, rbflength, bfpadding, bfdecimals; 142 143 extern bn_t bntmp1, bntmp2, bntmp3, bntmp4, bntmp5, bntmp6; /* rlength */ 144 extern bn_t bntest1, bntest2, bntest3; /* rlength */ 145 extern bn_t bntmpcpy1, bntmpcpy2; /* bnlength */ 146 extern bn_t bn_pi; 147 extern bn_t bntmp; /* rlength */ 148 149 extern bf_t bftmp1, bftmp2, bftmp3, bftmp4, bftmp5, bftmp6; /* rbflength+2 */ 150 extern bf_t bftest1, bftest2, bftest3; /* rbflength+2 */ 151 extern bf_t bftmpcpy1, bftmpcpy2; /* bflength+2 */ 152 extern bf_t bf_pi; 153 extern bf_t bftmp; /* rbflength */ 154 155 extern bf10_t bf10tmp; /* dec+4 */ 156 extern big_t big_pi; 157 158 159 /* functions defined in biginit.c */ 160 161 big_t big_alloc(size_t size); 162 /* void big_free(big_t memblock); now defined as a macro above */ 163 164 void calc_lengths(void); 165 void init_big_dec(int dec); 166 void init_big_length(int bnl); 167 void init_big_pi(void); 168 169 170 /* functions defined in bignuma.asm or bignumc.c */ 171 extern bn_t clear_bn(bn_t r); 172 extern bn_t max_bn(bn_t r); 173 extern bn_t copy_bn(bn_t r, bn_t n); 174 extern int cmp_bn(bn_t n1, bn_t n2); 175 extern int is_bn_neg(bn_t n); 176 extern int is_bn_not_zero(bn_t n); 177 extern bn_t add_bn(bn_t r, bn_t n1, bn_t n2); 178 extern bn_t add_a_bn(bn_t r, bn_t n); 179 extern bn_t sub_bn(bn_t r, bn_t n1, bn_t n2); 180 extern bn_t sub_a_bn(bn_t r, bn_t n); 181 extern bn_t neg_bn(bn_t r, bn_t n); 182 extern bn_t neg_a_bn(bn_t r); 183 extern bn_t double_bn(bn_t r, bn_t n); 184 extern bn_t double_a_bn(bn_t r); 185 extern bn_t half_bn(bn_t r, bn_t n); 186 extern bn_t half_a_bn(bn_t r); 187 extern bn_t unsafe_full_mult_bn(bn_t r, bn_t n1, bn_t n2); 188 extern bn_t unsafe_mult_bn(bn_t r, bn_t n1, bn_t n2); 189 extern bn_t unsafe_full_square_bn(bn_t r, bn_t n); 190 extern bn_t unsafe_square_bn(bn_t r, bn_t n); 191 extern bn_t mult_bn_int(bn_t r, bn_t n, U16 u); 192 extern bn_t mult_a_bn_int(bn_t r, U16 u); 193 extern bn_t unsafe_div_bn_int(bn_t r, bn_t n, U16 u); 194 extern bn_t div_a_bn_int(bn_t r, U16 u); 195 196 /* used to be in bigflta.asm or bigfltc.c */ 197 extern bf_t clear_bf(bf_t r); 198 extern bf_t copy_bf(bf_t r, bf_t n); 199 extern bf_t floattobf(bf_t r, LDBL f); 200 extern LDBL bftofloat(bf_t n); 201 extern LDBL bntofloat(bn_t n); 202 extern LDBL extract_256(LDBL f, int *exp_ptr); 203 extern LDBL scale_256( LDBL f, int n ); 204 205 /* functions defined in bignum.c */ 206 #ifdef ACCESS_BY_BYTE 207 /* prototypes */ 208 extern U32 big_access32(BYTE BIGDIST *addr); 209 extern U16 big_access16(BYTE BIGDIST *addr); 210 extern S16 big_accessS16(S16 BIGDIST *addr); 211 extern U32 big_set32(BYTE BIGDIST *addr, U32 val); 212 extern U16 big_set16(BYTE BIGDIST *addr, U16 val); 213 extern S16 big_setS16(S16 BIGDIST *addr, S16 val); 214 #else 215 /* equivalent defines */ 216 #define big_access32(addr) (*(U32 BIGDIST *)(addr)) 217 #define big_access16(addr) (*(U16 BIGDIST *)(addr)) 218 #define big_accessS16(addr) (*(S16 BIGDIST *)(addr)) 219 #define big_set32(addr, val) (*(U32 BIGDIST *)(addr) = (U32)(val)) 220 #define big_set16(addr, val) (*(U16 BIGDIST *)(addr) = (U16)(val)) 221 #define big_setS16(addr, val) (*(S16 BIGDIST *)(addr) = (S16)(val)) 222 #endif 223 224 extern void bn_hexdump(bn_t r); 225 extern bn_t strtobn(bn_t r, char *s); 226 extern char *unsafe_bntostr(char *s, int dec, bn_t r); 227 extern bn_t inttobn(bn_t r, long longval); 228 extern long bntoint(bn_t n); 229 230 extern int sign_bn(bn_t n); 231 extern bn_t abs_bn(bn_t r, bn_t n); 232 extern bn_t abs_a_bn(bn_t r); 233 extern bn_t unsafe_inv_bn(bn_t r, bn_t n); 234 extern bn_t unsafe_div_bn(bn_t r, bn_t n1, bn_t n2); 235 extern bn_t sqrt_bn(bn_t r, bn_t n); 236 extern bn_t exp_bn(bn_t r, bn_t n); 237 extern bn_t unsafe_ln_bn(bn_t r, bn_t n); 238 extern bn_t unsafe_sincos_bn(bn_t s, bn_t c, bn_t n); 239 extern bn_t unsafe_atan_bn(bn_t r, bn_t n); 240 extern bn_t unsafe_atan2_bn(bn_t r, bn_t ny, bn_t nx); 241 extern int convert_bn(bn_t new,bn_t old,int newbnlength,int newintlength,int oldbnlength,int oldintlength); 242 243 /* "safe" versions */ 244 extern bn_t full_mult_bn(bn_t r, bn_t n1, bn_t n2); 245 extern bn_t mult_bn(bn_t r, bn_t n1, bn_t n2); 246 extern bn_t full_square_bn(bn_t r, bn_t n); 247 extern bn_t square_bn(bn_t r, bn_t n); 248 extern bn_t div_bn_int(bn_t r, bn_t n, U16 u); 249 extern char *bntostr(char *s, int dec, bn_t r); 250 extern bn_t inv_bn(bn_t r, bn_t n); 251 extern bn_t div_bn(bn_t r, bn_t n1, bn_t n2); 252 extern bn_t ln_bn(bn_t r, bn_t n); 253 extern bn_t sincos_bn(bn_t s, bn_t c, bn_t n); 254 extern bn_t atan_bn(bn_t r, bn_t n); 255 extern bn_t atan2_bn(bn_t r, bn_t ny, bn_t nx); 256 257 /* misc */ 258 extern int is_bn_zero(bn_t n); 259 extern bn_t floattobn(bn_t r, LDBL f); 260 261 /************/ 262 /* bigflt.c */ 263 extern void bf_hexdump(bf_t r); 264 extern bf_t strtobf(bf_t r, char *s); 265 extern int strlen_needed_bf(); 266 extern char *unsafe_bftostr(char *s, int dec, bf_t r); 267 extern char *unsafe_bftostr_e(char *s, int dec, bf_t r); 268 extern char *unsafe_bftostr_f(char *s, int dec, bf_t r); 269 extern bn_t bftobn(bn_t n, bf_t f); 270 extern bn_t bntobf(bf_t f, bn_t n); 271 extern long bftoint(bf_t f); 272 extern bf_t inttobf(bf_t r, long longval); 273 274 extern int sign_bf(bf_t n); 275 extern bf_t abs_bf(bf_t r, bf_t n); 276 extern bf_t abs_a_bf(bf_t r); 277 extern bf_t unsafe_inv_bf(bf_t r, bf_t n); 278 extern bf_t unsafe_div_bf(bf_t r, bf_t n1, bf_t n2); 279 extern bf_t unsafe_sqrt_bf(bf_t r, bf_t n); 280 extern bf_t exp_bf(bf_t r, bf_t n); 281 extern bf_t unsafe_ln_bf(bf_t r, bf_t n); 282 extern bf_t unsafe_sincos_bf(bf_t s, bf_t c, bf_t n); 283 extern bf_t unsafe_atan_bf(bf_t r, bf_t n); 284 extern bf_t unsafe_atan2_bf(bf_t r, bf_t ny, bf_t nx); 285 286 extern bf_t add_bf(bf_t r, bf_t n1, bf_t n2); 287 extern bf_t add_a_bf(bf_t r, bf_t n); 288 extern bf_t sub_bf(bf_t r, bf_t n1, bf_t n2); 289 extern bf_t sub_a_bf(bf_t r, bf_t n); 290 extern bf_t full_mult_bf(bf_t r, bf_t n1, bf_t n2); 291 extern bf_t mult_bf(bf_t r, bf_t n1, bf_t n2); 292 extern bf_t full_square_bf(bf_t r, bf_t n); 293 extern bf_t square_bf(bf_t r, bf_t n); 294 extern bf_t mult_bf_int(bf_t r, bf_t n, U16 u); 295 extern bf_t div_bf_int(bf_t r, bf_t n, U16 u); 296 297 extern char *bftostr(char *s, int dec, bf_t r); 298 extern char *bftostr_e(char *s, int dec, bf_t r); 299 extern char *bftostr_f(char *s, int dec, bf_t r); 300 extern bf_t inv_bf(bf_t r, bf_t n); 301 extern bf_t div_bf(bf_t r, bf_t n1, bf_t n2); 302 extern bf_t sqrt_bf(bf_t r, bf_t n); 303 extern bf_t ln_bf(bf_t r, bf_t n); 304 extern bf_t sincos_bf(bf_t s, bf_t c, bf_t n); 305 extern bf_t atan_bf(bf_t r, bf_t n); 306 extern bf_t atan2_bf(bf_t r, bf_t ny, bf_t nx); 307 extern int is_bf_zero(bf_t n); 308 extern int convert_bf(bf_t new, bf_t old, int newbflength, int oldbflength); 309 310 extern LDBL extract_value(LDBL f, LDBL b, int *exp_ptr); 311 extern LDBL scale_value( LDBL f, LDBL b , int n ); 312 extern LDBL extract_10(LDBL f, int *exp_ptr); 313 extern LDBL scale_10( LDBL f, int n ); 314 315 extern bf10_t unsafe_bftobf10(bf10_t s, int dec, bf_t n); 316 extern bf10_t mult_a_bf10_int(bf10_t s, int dec, U16 n); 317 extern bf10_t div_a_bf10_int (bf10_t s, int dec, U16 n); 318 extern char *bf10tostr_e(char *s, int dec, bf10_t n); 319 extern char *bf10tostr_f(char *s, int dec, bf10_t n); 320 321 /* functions defined in bigfltc.c */ 322 extern bf_t norm_bf(bf_t r); 323 extern void norm_sign_bf(bf_t r, int positive); 324 extern S16 adjust_bf_add(bf_t n1, bf_t n2); 325 extern bf_t max_bf(bf_t r); 326 extern int cmp_bf(bf_t n1, bf_t n2); 327 extern int is_bf_neg(bf_t n); 328 extern int is_bf_not_zero(bf_t n); 329 extern bf_t unsafe_add_bf(bf_t r, bf_t n1, bf_t n2); 330 extern bf_t unsafe_add_a_bf(bf_t r, bf_t n); 331 extern bf_t unsafe_sub_bf(bf_t r, bf_t n1, bf_t n2); 332 extern bf_t unsafe_sub_a_bf(bf_t r, bf_t n); 333 extern bf_t neg_bf(bf_t r, bf_t n); 334 extern bf_t neg_a_bf(bf_t r); 335 extern bf_t double_bf(bf_t r, bf_t n); 336 extern bf_t double_a_bf(bf_t r); 337 extern bf_t half_bf(bf_t r, bf_t n); 338 extern bf_t half_a_bf(bf_t r); 339 extern bf_t unsafe_full_mult_bf(bf_t r, bf_t n1, bf_t n2); 340 extern bf_t unsafe_mult_bf(bf_t r, bf_t n1, bf_t n2); 341 extern bf_t unsafe_full_square_bf(bf_t r, bf_t n); 342 extern bf_t unsafe_square_bf(bf_t r, bf_t n); 343 extern bf_t unsafe_mult_bf_int(bf_t r, bf_t n, U16 u); 344 extern bf_t mult_a_bf_int(bf_t r, U16 u); 345 extern bf_t unsafe_div_bf_int(bf_t r, bf_t n, U16 u); 346 extern bf_t div_a_bf_int(bf_t r, U16 u); 347 348 /****************************/ 349 /* bigcmplx.c */ 350 extern _CMPLX cmplxbntofloat(_BNCMPLX *s); 351 extern _CMPLX cmplxbftofloat(_BFCMPLX *s); 352 extern _BFCMPLX *cmplxlog_bf(_BFCMPLX *t, _BFCMPLX *s); 353 extern _BFCMPLX *cplxmul_bf( _BFCMPLX *t, _BFCMPLX *x, _BFCMPLX *y); 354 extern _BFCMPLX *ComplexPower_bf(_BFCMPLX *t, _BFCMPLX *xx, _BFCMPLX *yy); 355 extern _BNCMPLX *ComplexPower_bn(_BNCMPLX *t, _BNCMPLX *xx, _BNCMPLX *yy); 356 extern _BNCMPLX *cmplxlog_bn(_BNCMPLX *t, _BNCMPLX *s); 357 extern _BNCMPLX *cplxmul_bn( _BNCMPLX *t, _BNCMPLX *x, _BNCMPLX *y); 358 359 #include "biginit.h" /* fractint only */ 360 361 #endif /* _BIG_H */ 362