Mercurial > hg > xemacs-beta
annotate src/number-mp.h @ 5602:c9e5612f5424
Support the MP library on recent FreeBSD, have it pass relevant tests.
src/ChangeLog addition:
2011-11-26 Aidan Kehoe <kehoea@parhasard.net>
* number-mp.c (bignum_to_string):
Don't overwrite the accumulator we've just set up for this
function.
* number-mp.c (BIGNUM_TO_TYPE):
mp_itom() doesn't necessarily do what this code used to think with
negative numbers, it can treat them as unsigned ints. Subtract
numbers from bignum_zero instead of multiplying them by -1 to
convert them to their negative equivalents.
* number-mp.c (bignum_to_int):
* number-mp.c (bignum_to_uint):
* number-mp.c (bignum_to_long):
* number-mp.c (bignum_to_ulong):
* number-mp.c (bignum_to_double):
Use the changed BIGNUM_TO_TYPE() in these functions.
* number-mp.c (bignum_ceil):
* number-mp.c (bignum_floor):
In these functions, be more careful about rounding to positive and
negative infinity, respectively. Don't use the sign of QUOTIENT
when working out out whether to add or subtract one, rather use
the sign QUOTIENT would have if arbitrary-precision division were
done.
* number-mp.h:
* number-mp.h (MP_GCD):
Wrap #include <mp.h> in BEGIN_C_DECLS/END_C_DECLS.
* number.c (Fbigfloat_get_precision):
* number.c (Fbigfloat_set_precision):
Don't attempt to call XBIGFLOAT_GET_PREC if this build doesn't
support big floats.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sat, 26 Nov 2011 17:59:14 +0000 |
parents | 2aa9cd456ae7 |
children | 3192994c49ca |
rev | line source |
---|---|
1983 | 1 /* Definitions of numeric types for XEmacs using the MP library. |
2 Copyright (C) 2004 Jerry James. | |
3 | |
4 This file is part of XEmacs. | |
5 | |
5405
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
5231
diff
changeset
|
6 XEmacs is free software: you can redistribute it and/or modify it |
1983 | 7 under the terms of the GNU General Public License as published by the |
5405
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
5231
diff
changeset
|
8 Free Software Foundation, either version 3 of the License, or (at your |
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
5231
diff
changeset
|
9 option) any later version. |
1983 | 10 |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
5405
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
5231
diff
changeset
|
17 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */ |
1983 | 18 |
19 /* Synched up with: Not in FSF. */ | |
20 | |
21 /* This library defines the following types: | |
22 bignum = MINT | |
23 | |
24 The MP library does not include support for ratios or bigfloats. | |
25 */ | |
26 | |
27 #ifndef INCLUDED_number_mp_h_ | |
28 #define INCLUDED_number_mp_h_ | |
29 | |
30 /* BSD MP libraries without MP_PREFIX define a function named pow in mp.h that | |
31 has a different prototype from the one in math.h. We don't use that | |
32 function anyway, so we do this for safety purposes. However, this means | |
33 that number-mp.h must always be included before math.h. */ | |
34 #define pow mp_pow | |
5602
c9e5612f5424
Support the MP library on recent FreeBSD, have it pass relevant tests.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5405
diff
changeset
|
35 BEGIN_C_DECLS |
1983 | 36 #include <mp.h> |
5602
c9e5612f5424
Support the MP library on recent FreeBSD, have it pass relevant tests.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5405
diff
changeset
|
37 END_C_DECLS |
1983 | 38 #undef pow |
39 | |
40 #ifdef MP_PREFIX | |
41 #define MP_GCD mp_gcd | |
42 #define MP_ITOM mp_itom | |
43 #define MP_MADD mp_madd | |
44 #define MP_MCMP mp_mcmp | |
45 #define MP_MDIV mp_mdiv | |
46 #define MP_MFREE mp_mfree | |
47 #define MP_MSUB mp_msub | |
48 #define MP_MULT mp_mult | |
49 #define MP_SDIV mp_sdiv | |
50 #ifdef HAVE_MP_MOVE | |
51 #define MP_MOVE(x,y) mp_move (x, y) | |
52 #else | |
53 #define MP_MOVE(x,y) mp_madd (x, bignum_zero, y) | |
54 #endif | |
55 #else | |
56 #define MP_GCD gcd | |
57 #define MP_ITOM itom | |
58 #define MP_MADD madd | |
59 #define MP_MCMP mcmp | |
60 #define MP_MDIV mdiv | |
61 #define MP_MFREE mfree | |
62 #define MP_MSUB msub | |
63 #define MP_MULT mult | |
64 #define MP_SDIV sdiv | |
65 #ifdef HAVE_MP_MOVE | |
66 #define MP_MOVE(x,y) move (x, y) | |
67 #else | |
68 #define MP_MOVE(x,y) madd (x, bignum_zero, y) | |
69 #endif | |
70 #endif | |
71 | |
72 typedef MINT *bignum; | |
73 | |
74 extern void init_number_mp(void); | |
75 | |
76 | |
77 /********************************* Bignums **********************************/ | |
78 | |
79 #define HAVE_BIGNUM 1 | |
80 | |
81 extern MINT *bignum_zero, *intern_bignum; | |
82 extern MINT *bignum_min_int, *bignum_max_int, *bignum_max_uint; | |
83 extern MINT *bignum_min_long, *bignum_max_long, *bignum_max_ulong; | |
84 extern short div_rem; | |
85 | |
86 /***** Bignum: basic functions *****/ | |
87 #define bignum_init(b) (b = MP_ITOM (0)) | |
88 #define bignum_fini(b) MP_MFREE (b) | |
89 #define bignum_hashcode(b) bignum_to_uint (b) | |
90 #define bignum_sign(b) MP_MCMP (b, bignum_zero) | |
91 #define bignum_evenp(b) (MP_SDIV (b, 2, intern_bignum, &div_rem), \ | |
92 div_rem == 0) | |
93 #define bignum_oddp(b) (MP_SDIV (b, 2, intern_bignum, &div_rem), \ | |
94 div_rem != 0) | |
95 | |
96 /***** Bignum: size *****/ | |
97 #define bignum_fits_int_p(b) (MP_MCMP (b, bignum_min_int) >= 0 && \ | |
98 MP_MCMP (b, bignum_max_int) <= 0) | |
99 #define bignum_fits_uint_p(b) (MP_MCMP (b, bignum_zero) >= 0 && \ | |
100 MP_MCMP (b, bignum_max_uint) <= 0) | |
101 #define bignum_fits_long_p(b) (MP_MCMP (b, bignum_min_long) >= 0 && \ | |
102 MP_MCMP (b, bignum_max_long) <= 0) | |
103 #define bignum_fits_ulong_p(b) (MP_MCMP (b, bignum_zero) >= 0 && \ | |
104 MP_MCMP (b, bignum_max_ulong) <= 0) | |
105 | |
106 /***** Bignum: conversions *****/ | |
107 extern char *bignum_to_string(bignum, int); | |
108 extern int bignum_to_int(bignum); | |
109 extern unsigned int bignum_to_uint(bignum); | |
110 extern long bignum_to_long(bignum); | |
111 extern unsigned long bignum_to_ulong(bignum); | |
112 extern double bignum_to_double(bignum); | |
113 | |
114 /***** Bignum: converting assignments *****/ | |
115 #define bignum_set(b1, b2) MP_MOVE (b2, b1) | |
116 extern int bignum_set_string(bignum, const char *, int); | |
117 extern void bignum_set_long(bignum, long); | |
118 extern void bignum_set_ulong(bignum, unsigned long); | |
119 extern void bignum_set_double(bignum, double); | |
120 | |
121 /***** Bignum: comparisons *****/ | |
122 #define bignum_cmp(b1,b2) MP_MCMP (b1, b2) | |
123 #define bignum_lt(b1,b2) (MP_MCMP (b1, b2) < 0) | |
124 #define bignum_le(b1,b2) (MP_MCMP (b1, b2) <= 0) | |
125 #define bignum_eql(b1,b2) (MP_MCMP (b1, b2) == 0) | |
126 #define bignum_ge(b1,b2) (MP_MCMP (b1, b2) >= 0) | |
127 #define bignum_gt(b1,b2) (MP_MCMP (b1, b2) > 0) | |
128 | |
129 /***** Bignum: arithmetic *****/ | |
130 #define bignum_neg(b,b2) MP_MSUB (bignum_zero, b2, b) | |
131 #define bignum_abs(b,b2) (MP_MCMP (b2, bignum_zero) < 0 \ | |
132 ? MP_MSUB (bignum_zero, b2, b) \ | |
133 : MP_MADD (bignum_zero, b2, b)) | |
134 #define bignum_add(b,b1,b2) MP_MADD (b1, b2, b) | |
135 #define bignum_sub(b,b1,b2) MP_MSUB (b1, b2, b) | |
136 #define bignum_mul(b,b1,b2) MP_MULT (b1, b2, b) | |
137 extern int bignum_divisible_p(bignum, bignum); | |
138 #define bignum_div(b,b1,b2) MP_MDIV (b1, b2, b, intern_bignum) | |
139 extern void bignum_ceil(bignum, bignum, bignum); | |
140 extern void bignum_floor(bignum, bignum, bignum); | |
141 #define bignum_mod(b,b1,b2) MP_MDIV (b1, b2, intern_bignum, b) | |
142 extern void bignum_pow(bignum, bignum, unsigned long); | |
143 #define bignum_gcd(res,b1,b2) MP_GCD (b1, b2, res) | |
144 extern void bignum_lcm(bignum, bignum, bignum); | |
145 | |
146 /***** Bignum: bit manipulations *****/ | |
147 extern void bignum_and(bignum, bignum, bignum); | |
148 extern void bignum_ior(bignum, bignum, bignum); | |
149 extern void bignum_xor(bignum, bignum, bignum); | |
150 extern void bignum_not(bignum, bignum); | |
151 extern void bignum_setbit(bignum, unsigned long); | |
152 extern void bignum_clrbit(bignum, unsigned long); | |
153 extern int bignum_testbit(bignum, unsigned long); | |
154 extern void bignum_lshift(bignum, bignum, unsigned long); | |
155 extern void bignum_rshift(bignum, bignum, unsigned long); | |
156 | |
157 /***** Bignum: random numbers *****/ | |
158 extern void bignum_random_seed(unsigned long); | |
159 extern void bignum_random(bignum, bignum); | |
160 | |
161 #endif /* INCLUDED_number_mp_h_ */ |