2 ent-pseumpc.h -- Numeric types for SXEmacs
3 Copyright (C) 2005, 2006 Sebastian Freundt
5 Author: Sebastian Freundt
7 This file is part of SXEmacs
9 SXEmacs is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
14 SXEmacs is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 #ifndef INCLUDED_number_pseumpc_h_
24 #define INCLUDED_number_pseumpc_h_
27 /* Uno complains about several inline functions that include conditions with
28 assignments and side effects if we don't do this */
41 typedef struct bigc bigc[1];
46 struct lrecord_header lheader;
49 typedef struct Lisp_Bigc Lisp_Bigc;
51 DECLARE_LRECORD(bigc, Lisp_Bigc);
52 #define XBIGC(x) XRECORD(x, bigc, Lisp_Bigc)
53 #define wrap_bigc(p) wrap_object(p)
54 #define BIGCP(x) RECORDP(x, bigc)
55 #define CHECK_BIGC(x) CHECK_RECORD(x, bigc)
56 #define CONCHECK_BIGC(x) CONCHECK_RECORD(x, bigc)
58 #define bigc_data(f) ((f)->data)
59 #define XBIGC_DATA(x) bigc_data(XBIGC(x))
60 #define XBIGC_GET_PREC(x) bigc_get_prec(XBIGC_DATA(x))
61 #define XBIGC_SET_PREC(x,p) bigc_set_prec(XBIGC_DATA(x), p)
63 #define XBIGC_RE(x) bigc_re(XBIGC_DATA(x))
64 #define XBIGC_IM(x) bigc_im(XBIGC_DATA(x))
66 #define BIGC_ARITH_RETURN(f,op) do \
68 Lisp_Object retval = make_bigc_bc(XBIGC_DATA(f)); \
69 bigc_##op(XBIGC_DATA(retval), XBIGC_DATA(f)); \
73 #define BIGC_ARITH_RETURN1(f,op,arg) do \
75 Lisp_Object retval = make_bigc_bc(XBIGC_DATA(f)); \
76 bigc_##op(XBIGC_DATA(retval), XBIGC_DATA(f), arg); \
80 #define BIGC_INIT_PREC(f, prec) do \
82 bigc_init_prec(f, internal_get_precision(prec)); \
85 extern Lisp_Object make_bigc(fpfloat, fpfloat, unsigned long);
86 extern Lisp_Object make_bigc_bfr(bigfr, bigfr, unsigned long);
87 extern Lisp_Object make_bigc_bc(bigc);
89 extern bigc ent_scratch_bigc;
92 /******************************** Bigcs ********************************/
94 /***** Bigc: basic functions *****/
95 extern void bigc_init(bigc);
96 extern void bigc_init_prec(bigc, unsigned long);
97 extern void bigc_init_2prec(bigc, unsigned long, unsigned long);
98 extern void bigc_fini(bigc);
99 #define bigc_hashcode(f) (bigfr_hashcode(bigc_re(f)) ^ \
100 bigfr_hashcode(bigc_im(f)))
101 #define bigc_get_prec(f) max(bigfr_get_prec(bigc_re(f)), \
102 bigfr_get_prec(bigc_im(f)))
103 extern void bigc_set_prec(bigc, unsigned long);
104 #define bigc_set_default_prec(prec)
105 #define bigc_get_default_prec() bigfr_get_default_prec()
107 /***** Bigc: conversions *****/
108 extern Bufbyte *bigc_to_string(bigc, int);
110 /***** Bigc: converting assignments *****/
111 extern void bigc_set(bigc, bigc);
112 extern void bigc_set_long(bigc, long);
113 extern void bigc_set_long_long(bigc, long, long);
114 extern void bigc_set_ulong(bigc, unsigned long);
115 extern void bigc_set_ulong_ulong(bigc, unsigned long, unsigned long);
116 extern void bigc_set_fpfloat(bigc, fpfloat);
117 extern void bigc_set_fpfloat_fpfloat(bigc, fpfloat, fpfloat);
118 extern void bigc_set_bigfr(bigc, bigfr);
119 extern void bigc_set_bigfr_bigfr(bigc, bigfr, bigfr);
121 #define bigc_re(z) ((z)->real)
122 #define bigc_im(z) ((z)->imag)
124 /***** Bigc: comparisons *****/
125 extern int bigc_eq(bigc, bigc);
126 #define bigc_cmp(f1,f2) (bigc_eq(f1,f2) ? 0 : 1)
128 /***** Bigc: arithmetic *****/
129 extern void bigc_neg(bigc, bigc);
130 extern void bigc_abs(bigfr, bigc);
131 extern void bigc_norm(bigfr, bigc);
132 extern void bigc_conj(bigc, bigc);
133 extern void bigc_add(bigc, bigc, bigc);
134 extern void bigc_sub(bigc, bigc, bigc);
135 extern void bigc_mul(bigc, bigc, bigc);
136 extern void bigc_div(bigc, bigc, bigc);
137 #if defined HAVE_MPZ && defined WITH_GMP
138 extern void bigc_pow(bigc, bigc, unsigned long);
141 extern void bigc_sqrt(bigc, bigc);
143 /* Advanced functions */
144 #define bigc_exp(res, f)
146 /* indefinite handling */
147 extern int bigc_nan_p(bigc);
148 extern int bigc_inf_p(bigc);
150 extern Lisp_Object read_bigc_string(char*);
152 extern void init_optables_BIGC_T(void);
153 extern void init_ent_mpc(void);
154 extern void syms_of_ent_mpc(void);
155 extern void vars_of_ent_mpc(void);
157 #endif /* INCLUDED_number_pseumpc_h_ */