File: headers\big.h
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
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
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
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
84 #endif
85
86 #ifdef BIG_HUGE
92 #endif
93
94 #ifdef BIG_ANSI_C
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 */
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
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