Mercurial > hg > xemacs-beta
annotate src/number-gmp.c @ 5118:e0db3c197671 ben-lisp-object
merge up to latest default branch, doesn't compile yet
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Sat, 26 Dec 2009 21:18:49 -0600 |
parents | 313c2cc696b9 |
children | 2fc0e2f18322 |
rev | line source |
---|---|
1983 | 1 /* Numeric types for XEmacs using the GNU MP library. |
2 Copyright (C) 2004 Jerry James. | |
3 | |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
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 | |
17 along with XEmacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 Boston, MA 02111-1307, USA. */ | |
20 | |
21 /* Synched up with: Not in FSF. */ | |
22 | |
23 #include <config.h> | |
24 #include <limits.h> | |
25 #include <math.h> | |
26 #include "lisp.h" | |
1995 | 27 #include "sysproc.h" /* For qxe_getpid */ |
1983 | 28 |
4612
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
29 static mp_exp_t float_print_min, float_print_max; |
1983 | 30 gmp_randstate_t random_state; |
31 | |
32 CIbyte * | |
33 bigfloat_to_string(mpf_t f, int base) | |
34 { | |
35 mp_exp_t expt; | |
36 CIbyte *str = mpf_get_str (NULL, &expt, base, 0, f); | |
37 const int sign = mpf_sgn (f); | |
38 const int neg = (sign < 0) ? 1 : 0; | |
39 int len = strlen (str) + 1; /* Count the null terminator */ | |
40 | |
4612
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
41 if (sign == 0) |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
42 { |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
43 XREALLOC_ARRAY (str, CIbyte, 4); |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
44 strncpy (str, "0.0", 4); |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
45 } |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
46 else if (float_print_min <= expt && expt <= float_print_max) |
1983 | 47 { |
4612
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
48 if (expt < 0) |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
49 { |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
50 /* We need room for a radix point and leading zeroes */ |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
51 const int space = -expt + 2; |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
52 XREALLOC_ARRAY (str, CIbyte, len + space); |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
53 memmove (&str[space + neg], &str[neg], len - neg); |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
54 memset (&str[neg], '0', space); |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
55 str[neg + 1] = '.'; |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
56 } |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
57 else if (len <= expt + neg + 1) |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
58 { |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
59 /* We need room for a radix point and trailing zeroes */ |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
60 XREALLOC_ARRAY (str, CIbyte, expt + neg + 3); |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
61 memset (&str[len - 1], '0', expt + neg + 3 - len); |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
62 str[expt + neg] = '.'; |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
63 str[expt + neg + 2] = '\0'; |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
64 } |
1983 | 65 else |
4612
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
66 { |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
67 /* We just need room for a radix point */ |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
68 XREALLOC_ARRAY (str, CIbyte, len + 1); |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
69 memmove (&str[expt + neg + 1], &str[expt + neg], len - (expt + neg)); |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
70 str[expt + neg] = '.'; |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
71 } |
1983 | 72 } |
73 else | |
74 { | |
4612
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
75 /* Computerized scientific notation: We need room for a possible radix |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
76 point, format identifier, and exponent */ |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
77 /* GMP's idea of the exponent is 1 greater than scientific notation's */ |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
78 expt--; |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
79 const int point = (len == neg + 2) ? 0 : 1; |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
80 const int exponent = (expt < 0) |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
81 ? (int)(log ((double) (-expt)) / log ((double) base)) + 3 |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
82 : (int)(log ((double) expt) / log ((double) base)) + 2; |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
83 const int space = point + exponent; |
1983 | 84 XREALLOC_ARRAY (str, CIbyte, len + space); |
4612
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
85 if (point > 0) |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
86 { |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
87 memmove (&str[neg + 2], &str[neg + 1], len - neg); |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
88 str[neg + 1] = '.'; |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
89 } |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
90 sprintf (&str[len + point - 1], "E%ld", expt); |
1983 | 91 } |
92 return str; | |
93 } | |
94 | |
95 /* We need the next two functions since GNU MP insists on giving us an extra | |
96 parameter. */ | |
2286 | 97 static void *gmp_realloc (void *ptr, size_t UNUSED (old_size), size_t new_size) |
1983 | 98 { |
99 return xrealloc (ptr, new_size); | |
100 } | |
101 | |
2286 | 102 static void gmp_free (void *ptr, size_t UNUSED (size)) |
1983 | 103 { |
104 xfree (ptr, void *); | |
105 } | |
106 | |
107 void | |
108 init_number_gmp () | |
109 { | |
2367 | 110 mp_set_memory_functions ((void *(*) (size_t)) xmalloc, gmp_realloc, |
111 gmp_free); | |
1983 | 112 |
4612
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
113 /* Numbers with smaller exponents than this are printed in scientific |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
114 notation. */ |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
115 float_print_min = -4; |
1983 | 116 |
4612
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
117 /* Numbers with larger exponents than this are printed in scientific |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
118 notation. */ |
313c2cc696b9
Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents:
2956
diff
changeset
|
119 float_print_max = 8; |
1983 | 120 |
121 /* Prepare the bignum/bigfloat random number generator */ | |
122 gmp_randinit_default (random_state); | |
123 gmp_randseed_ui (random_state, qxe_getpid () + time (NULL)); | |
124 } |