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