1 /* number.h: Arbitrary precision numbers header file. */
3 Copyright (C) 1991, 1992, 1993, 1994, 1997, 2000 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License , or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; see the file COPYING. If not, write to:
18 The Free Software Foundation, Inc.
19 59 Temple Place, Suite 330
20 Boston, MA 02111-1307 USA.
23 You may contact the author by:
24 e-mail: philnelson@acm.org
25 us-mail: Philip A. Nelson
26 Computer Science Department, 9062
27 Western Washington University
28 Bellingham, WA 98226-9062
30 *************************************************************************/
35 typedef enum {PLUS
, MINUS
} sign
;
37 typedef struct bc_struct
*bc_num
;
39 typedef struct bc_struct
42 int n_len
; /* The number of digits before the decimal point. */
43 int n_scale
; /* The number of digits after the decimal point. */
44 int n_refs
; /* The number of pointers to this number. */
45 bc_num n_next
; /* Linked list for available list. */
46 char *n_ptr
; /* The pointer to the actual storage.
47 If NULL, n_value points to the inside of
48 another number (bc_multiply...) and should
50 char *n_value
; /* The number. Not zero char terminated.
51 May not point to the same place as n_ptr as
52 in the case of leading zeros generated. */
56 /* The base used in storing the numbers in n_value above.
57 Currently this MUST be 10. */
61 /* Some useful macros and constants. */
63 #define CH_VAL(c) (c - '0')
64 #define BCD_CHAR(d) (d + '0')
70 #define MAX(a,b) ((a)>(b)?(a):(b))
71 #define MIN(a,b) ((a)>(b)?(b):(a))
72 #define ODD(a) ((a)&1)
80 #define LONG_MAX 0x7ffffff
90 /* Function Prototypes */
92 /* Define the _PROTOTYPE macro if it is needed. */
96 #define _PROTOTYPE(func, args) func args
98 #define _PROTOTYPE(func, args) func()
102 _PROTOTYPE(void bc_init_numbers
, (void));
104 _PROTOTYPE(bc_num bc_new_num
, (int length
, int scale
));
106 _PROTOTYPE(void bc_free_num
, (bc_num
*num
));
108 _PROTOTYPE(bc_num bc_copy_num
, (bc_num num
));
110 _PROTOTYPE(void bc_init_num
, (bc_num
*num
));
112 _PROTOTYPE(void bc_str2num
, (bc_num
*num
, char *str
, int scale
));
114 _PROTOTYPE(char *bc_num2str
, (bc_num num
));
116 _PROTOTYPE(void bc_int2num
, (bc_num
*num
, int val
));
118 _PROTOTYPE(long bc_num2long
, (bc_num num
));
120 _PROTOTYPE(int bc_compare
, (bc_num n1
, bc_num n2
));
122 _PROTOTYPE(char bc_is_zero
, (bc_num num
));
124 _PROTOTYPE(char bc_is_near_zero
, (bc_num num
, int scale
));
126 _PROTOTYPE(char bc_is_neg
, (bc_num num
));
128 _PROTOTYPE(void bc_add
, (bc_num n1
, bc_num n2
, bc_num
*result
, int scale_min
));
130 _PROTOTYPE(void bc_sub
, (bc_num n1
, bc_num n2
, bc_num
*result
, int scale_min
));
132 _PROTOTYPE(void bc_multiply
, (bc_num n1
, bc_num n2
, bc_num
*prod
, int scale
));
134 _PROTOTYPE(int bc_divide
, (bc_num n1
, bc_num n2
, bc_num
*quot
, int scale
));
136 _PROTOTYPE(int bc_modulo
, (bc_num num1
, bc_num num2
, bc_num
*result
,
139 _PROTOTYPE(int bc_divmod
, (bc_num num1
, bc_num num2
, bc_num
*quot
,
140 bc_num
*rem
, int scale
));
142 _PROTOTYPE(int bc_raisemod
, (bc_num base
, bc_num expo
, bc_num mod
,
143 bc_num
*result
, int scale
));
145 _PROTOTYPE(void bc_raise
, (bc_num num1
, bc_num num2
, bc_num
*result
,
148 _PROTOTYPE(int bc_sqrt
, (bc_num
*num
, int scale
));
150 _PROTOTYPE(void bc_out_num
, (bc_num num
, int o_base
, void (* out_char
)(int),