Mercurial > hg > xemacs-beta
annotate src/number-gmp.c @ 4742:4cf435fcebbc
Make #'letf not error if handed a #'values form.
lisp/ChangeLog addition:
2009-11-14 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (letf):
Check whether arguments to #'values are bound, and make them
unbound after evaluating BODY; document the limitations of this
macro.
tests/ChangeLog addition:
2009-11-14 Aidan Kehoe <kehoea@parhasard.net>
* automated/lisp-tests.el:
Don't call Known-Bug-Expect-Failure now that the particular letf
bug it tickled is fixed.
| author | Aidan Kehoe <kehoea@parhasard.net> |
|---|---|
| date | Sat, 14 Nov 2009 11:43:09 +0000 |
| 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 } |
