Import mpfr-2.4.1
[dragonfly.git] / contrib / mpfr / mpfr-gmp.c
1 /* mpfr_gmp -- Limited gmp-impl emulator
2    Modified version of the GMP files.
3
4 Copyright 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
5 Contributed by the Arenaire and Cacao projects, INRIA.
6
7 This file is part of the GNU MPFR Library.
8
9 The GNU MPFR Library is free software; you can redistribute it and/or modify
10 it under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or (at your
12 option) any later version.
13
14 The GNU MPFR Library is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
17 License for more details.
18
19 You should have received a copy of the GNU Lesser General Public License
20 along with the GNU MPFR Library; see the file COPYING.LIB.  If not, write to
21 the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
22 MA 02110-1301, USA. */
23
24 #include <stdlib.h> /* For malloc, free, realloc and abort */
25
26 #include "mpfr-impl.h"
27
28 #ifndef MPFR_HAVE_GMP_IMPL
29
30 char             mpfr_rands_initialized = 0;
31 gmp_randstate_t  mpfr_rands;
32
33 const struct bases mpfr_bases[257] =
34 {
35   /*  0 */ {0.0},
36   /*  1 */ {1e37},
37   /*  2 */ {1.0000000000000000},
38   /*  3 */ {0.6309297535714574},
39   /*  4 */ {0.5000000000000000},
40   /*  5 */ {0.4306765580733931},
41   /*  6 */ {0.3868528072345416},
42   /*  7 */ {0.3562071871080222},
43   /*  8 */ {0.3333333333333333},
44   /*  9 */ {0.3154648767857287},
45   /* 10 */ {0.3010299956639812},
46   /* 11 */ {0.2890648263178878},
47   /* 12 */ {0.2789429456511298},
48   /* 13 */ {0.2702381544273197},
49   /* 14 */ {0.2626495350371935},
50   /* 15 */ {0.2559580248098155},
51   /* 16 */ {0.2500000000000000},
52   /* 17 */ {0.2446505421182260},
53   /* 18 */ {0.2398124665681314},
54   /* 19 */ {0.2354089133666382},
55   /* 20 */ {0.2313782131597592},
56   /* 21 */ {0.2276702486969530},
57   /* 22 */ {0.2242438242175754},
58   /* 23 */ {0.2210647294575037},
59   /* 24 */ {0.2181042919855316},
60   /* 25 */ {0.2153382790366965},
61   /* 26 */ {0.2127460535533632},
62   /* 27 */ {0.2103099178571525},
63   /* 28 */ {0.2080145976765095},
64   /* 29 */ {0.2058468324604344},
65   /* 30 */ {0.2037950470905062},
66   /* 31 */ {0.2018490865820999},
67   /* 32 */ {0.2000000000000000},
68   /* 33 */ {0.1982398631705605},
69   /* 34 */ {0.1965616322328226},
70   /* 35 */ {0.1949590218937863},
71   /* 36 */ {0.1934264036172708},
72   /* 37 */ {0.1919587200065601},
73   /* 38 */ {0.1905514124267734},
74   /* 39 */ {0.1892003595168700},
75   /* 40 */ {0.1879018247091076},
76   /* 41 */ {0.1866524112389434},
77   /* 42 */ {0.1854490234153689},
78   /* 43 */ {0.1842888331487062},
79   /* 44 */ {0.1831692509136336},
80   /* 45 */ {0.1820879004699383},
81   /* 46 */ {0.1810425967800402},
82   /* 47 */ {0.1800313266566926},
83   /* 48 */ {0.1790522317510414},
84   /* 49 */ {0.1781035935540111},
85   /* 50 */ {0.1771838201355579},
86   /* 51 */ {0.1762914343888821},
87   /* 52 */ {0.1754250635819545},
88   /* 53 */ {0.1745834300480449},
89   /* 54 */ {0.1737653428714400},
90   /* 55 */ {0.1729696904450771},
91   /* 56 */ {0.1721954337940981},
92   /* 57 */ {0.1714416005739134},
93   /* 58 */ {0.1707072796637201},
94   /* 59 */ {0.1699916162869140},
95   /* 60 */ {0.1692938075987814},
96   /* 61 */ {0.1686130986895011},
97   /* 62 */ {0.1679487789570419},
98   /* 63 */ {0.1673001788101741},
99   /* 64 */ {0.1666666666666667},
100   /* 65 */ {0.1660476462159378},
101   /* 66 */ {0.1654425539190583},
102   /* 67 */ {0.1648508567221603},
103   /* 68 */ {0.1642720499620502},
104   /* 69 */ {0.1637056554452156},
105   /* 70 */ {0.1631512196835108},
106   /* 71 */ {0.1626083122716342},
107   /* 72 */ {0.1620765243931223},
108   /* 73 */ {0.1615554674429964},
109   /* 74 */ {0.1610447717564444},
110   /* 75 */ {0.1605440854340214},
111   /* 76 */ {0.1600530732548213},
112   /* 77 */ {0.1595714156699382},
113   /* 78 */ {0.1590988078692941},
114   /* 79 */ {0.1586349589155960},
115   /* 80 */ {0.1581795909397823},
116   /* 81 */ {0.1577324383928644},
117   /* 82 */ {0.1572932473495469},
118   /* 83 */ {0.1568617748594410},
119   /* 84 */ {0.1564377883420715},
120   /* 85 */ {0.1560210650222250},
121   /* 86 */ {0.1556113914024939},
122   /* 87 */ {0.1552085627701551},
123   /* 88 */ {0.1548123827357682},
124   /* 89 */ {0.1544226628011101},
125   /* 90 */ {0.1540392219542636},
126   /* 91 */ {0.1536618862898642},
127   /* 92 */ {0.1532904886526781},
128   /* 93 */ {0.1529248683028321},
129   /* 94 */ {0.1525648706011593},
130   /* 95 */ {0.1522103467132434},
131   /* 96 */ {0.1518611533308632},
132   /* 97 */ {0.1515171524096389},
133   /* 98 */ {0.1511782109217764},
134   /* 99 */ {0.1508442006228941},
135   /* 100 */ {0.1505149978319906},
136   /* 101 */ {0.1501904832236880},
137   /* 102 */ {0.1498705416319474},
138   /* 103 */ {0.1495550618645152},
139   /* 104 */ {0.1492439365274121},
140   /* 105 */ {0.1489370618588283},
141   /* 106 */ {0.1486343375718350},
142   /* 107 */ {0.1483356667053617},
143   /* 108 */ {0.1480409554829326},
144   /* 109 */ {0.1477501131786861},
145   /* 110 */ {0.1474630519902391},
146   /* 111 */ {0.1471796869179852},
147   /* 112 */ {0.1468999356504447},
148   /* 113 */ {0.1466237184553111},
149   /* 114 */ {0.1463509580758620},
150   /* 115 */ {0.1460815796324244},
151   /* 116 */ {0.1458155105286054},
152   /* 117 */ {0.1455526803620167},
153   /* 118 */ {0.1452930208392429},
154   /* 119 */ {0.1450364656948130},
155   /* 120 */ {0.1447829506139581},
156   /* 121 */ {0.1445324131589439},
157   /* 122 */ {0.1442847926987864},
158   /* 123 */ {0.1440400303421672},
159   /* 124 */ {0.1437980688733776},
160   /* 125 */ {0.1435588526911310},
161   /* 126 */ {0.1433223277500932},
162   /* 127 */ {0.1430884415049874},
163   /* 128 */ {0.1428571428571428},
164   /* 129 */ {0.1426283821033600},
165   /* 130 */ {0.1424021108869747},
166   /* 131 */ {0.1421782821510107},
167   /* 132 */ {0.1419568500933153},
168   /* 133 */ {0.1417377701235801},
169   /* 134 */ {0.1415209988221527},
170   /* 135 */ {0.1413064939005528},
171   /* 136 */ {0.1410942141636095},
172   /* 137 */ {0.1408841194731412},
173   /* 138 */ {0.1406761707131039},
174   /* 139 */ {0.1404703297561400},
175   /* 140 */ {0.1402665594314587},
176   /* 141 */ {0.1400648234939879},
177   /* 142 */ {0.1398650865947379},
178   /* 143 */ {0.1396673142523192},
179   /* 144 */ {0.1394714728255649},
180   /* 145 */ {0.1392775294872041},
181   /* 146 */ {0.1390854521985406},
182   /* 147 */ {0.1388952096850913},
183   /* 148 */ {0.1387067714131417},
184   /* 149 */ {0.1385201075671774},
185   /* 150 */ {0.1383351890281539},
186   /* 151 */ {0.1381519873525671},
187   /* 152 */ {0.1379704747522905},
188   /* 153 */ {0.1377906240751463},
189   /* 154 */ {0.1376124087861776},
190   /* 155 */ {0.1374358029495937},
191   /* 156 */ {0.1372607812113589},
192   /* 157 */ {0.1370873187823978},
193   /* 158 */ {0.1369153914223921},
194   /* 159 */ {0.1367449754241439},
195   /* 160 */ {0.1365760475984821},
196   /* 161 */ {0.1364085852596902},
197   /* 162 */ {0.1362425662114337},
198   /* 163 */ {0.1360779687331669},
199   /* 164 */ {0.1359147715670014},
200   /* 165 */ {0.1357529539050150},
201   /* 166 */ {0.1355924953769864},
202   /* 167 */ {0.1354333760385373},
203   /* 168 */ {0.1352755763596663},
204   /* 169 */ {0.1351190772136599},
205   /* 170 */ {0.1349638598663645},
206   /* 171 */ {0.1348099059658080},
207   /* 172 */ {0.1346571975321549},
208   /* 173 */ {0.1345057169479844},
209   /* 174 */ {0.1343554469488779},
210   /* 175 */ {0.1342063706143054},
211   /* 176 */ {0.1340584713587979},
212   /* 177 */ {0.1339117329233981},
213   /* 178 */ {0.1337661393673756},
214   /* 179 */ {0.1336216750601996},
215   /* 180 */ {0.1334783246737591},
216   /* 181 */ {0.1333360731748201},
217   /* 182 */ {0.1331949058177136},
218   /* 183 */ {0.1330548081372441},
219   /* 184 */ {0.1329157659418126},
220   /* 185 */ {0.1327777653067443},
221   /* 186 */ {0.1326407925678156},
222   /* 187 */ {0.1325048343149731},
223   /* 188 */ {0.1323698773862368},
224   /* 189 */ {0.1322359088617821},
225   /* 190 */ {0.1321029160581950},
226   /* 191 */ {0.1319708865228925},
227   /* 192 */ {0.1318398080287045},
228   /* 193 */ {0.1317096685686114},
229   /* 194 */ {0.1315804563506306},
230   /* 195 */ {0.1314521597928493},
231   /* 196 */ {0.1313247675185968},
232   /* 197 */ {0.1311982683517524},
233   /* 198 */ {0.1310726513121843},
234   /* 199 */ {0.1309479056113158},
235   /* 200 */ {0.1308240206478128},
236   /* 201 */ {0.1307009860033912},
237   /* 202 */ {0.1305787914387386},
238   /* 203 */ {0.1304574268895465},
239   /* 204 */ {0.1303368824626505},
240   /* 205 */ {0.1302171484322746},
241   /* 206 */ {0.1300982152363760},
242   /* 207 */ {0.1299800734730872},
243   /* 208 */ {0.1298627138972530},
244   /* 209 */ {0.1297461274170591},
245   /* 210 */ {0.1296303050907487},
246   /* 211 */ {0.1295152381234257},
247   /* 212 */ {0.1294009178639407},
248   /* 213 */ {0.1292873358018581},
249   /* 214 */ {0.1291744835645007},
250   /* 215 */ {0.1290623529140715},
251   /* 216 */ {0.1289509357448472},
252   /* 217 */ {0.1288402240804449},
253   /* 218 */ {0.1287302100711566},
254   /* 219 */ {0.1286208859913518},
255   /* 220 */ {0.1285122442369443},
256   /* 221 */ {0.1284042773229231},
257   /* 222 */ {0.1282969778809442},
258   /* 223 */ {0.1281903386569819},
259   /* 224 */ {0.1280843525090381},
260   /* 225 */ {0.1279790124049077},
261   /* 226 */ {0.1278743114199984},
262   /* 227 */ {0.1277702427352035},
263   /* 228 */ {0.1276667996348261},
264   /* 229 */ {0.1275639755045533},
265   /* 230 */ {0.1274617638294791},
266   /* 231 */ {0.1273601581921740},
267   /* 232 */ {0.1272591522708010},
268   /* 233 */ {0.1271587398372755},
269   /* 234 */ {0.1270589147554692},
270   /* 235 */ {0.1269596709794558},
271   /* 236 */ {0.1268610025517973},
272   /* 237 */ {0.1267629036018709},
273   /* 238 */ {0.1266653683442337},
274   /* 239 */ {0.1265683910770258},
275   /* 240 */ {0.1264719661804097},
276   /* 241 */ {0.1263760881150453},
277   /* 242 */ {0.1262807514205999},
278   /* 243 */ {0.1261859507142915},
279   /* 244 */ {0.1260916806894653},
280   /* 245 */ {0.1259979361142023},
281   /* 246 */ {0.1259047118299582},
282   /* 247 */ {0.1258120027502338},
283   /* 248 */ {0.1257198038592741},
284   /* 249 */ {0.1256281102107963},
285   /* 250 */ {0.1255369169267456},
286   /* 251 */ {0.1254462191960791},
287   /* 252 */ {0.1253560122735751},
288   /* 253 */ {0.1252662914786691},
289   /* 254 */ {0.1251770521943144},
290   /* 255 */ {0.1250882898658681},
291   /* 256 */ {0.1250000000000000},
292 };
293
294 void
295 mpfr_assert_fail (const char *filename, int linenum,
296                      const char *expr)
297 {
298   if (filename != NULL && filename[0] != '\0')
299     {
300       fprintf (stderr, "%s:", filename);
301       if (linenum != -1)
302         fprintf (stderr, "%d: ", linenum);
303     }
304   fprintf (stderr, " assertion failed: %s\n", expr);
305   abort();
306 }
307
308 void
309 mpfr_rand_raw (mp_ptr mp, gmp_randstate_t rstate, unsigned long int nbits)
310 {
311   mpz_t z;
312
313   /* To be sure to avoid the potential allocation of mpz_urandomb */
314   ALLOC(z) = SIZ(z) = (nbits / GMP_NUMB_BITS) + 1;
315   PTR(z)   = mp;
316   mpz_urandomb(z, rstate, nbits);
317 }
318
319 #ifdef mp_get_memory_functions
320
321 /* putting 0 as initial values forces those symbols to be fully defined,
322    and always resolved, otherwise they are only tentatively defined, which
323    leads to problems on e.g. MacOS, cf
324    http://lists.gforge.inria.fr/pipermail/mpc-discuss/2008-November/000048.html
325    and http://software.intel.com/en-us/articles/intelr-fortran-compiler-for-mac-os-non_lazy_ptr-unresolved-references-from-linking
326    Note that using ranlib -c or libtool -c is another fix.
327 */
328 void * (*mpfr_allocate_func) (size_t) = 0;
329 void * (*mpfr_reallocate_func) (void *,size_t, size_t) = 0;
330 void   (*mpfr_free_func) (void *, size_t) = 0;
331
332 #endif
333
334 void *
335 mpfr_default_allocate (size_t size)
336 {
337   void *ret;
338   ret = malloc (size);
339   if (ret == NULL)
340     {
341       fprintf (stderr, "MPFR: Can't allocate memory (size=%lu)\n",
342                (unsigned long) size);
343       abort ();
344     }
345   return ret;
346 }
347
348 void *
349 mpfr_default_reallocate (void *oldptr, size_t old_size, size_t new_size)
350 {
351   void *ret;
352   ret = realloc (oldptr, new_size);
353   if (ret == NULL)
354     {
355       fprintf (stderr,
356                "MPFR: Can't reallocate memory (old_size=%lu new_size=%lu)\n",
357                (unsigned long) old_size, (unsigned long) new_size);
358       abort ();
359     }
360   return ret;
361 }
362
363 void
364 mpfr_default_free (void *blk_ptr, size_t blk_size)
365 {
366   free (blk_ptr);
367 }
368
369 void *
370 mpfr_tmp_allocate (struct tmp_marker **tmp_marker, size_t size)
371 {
372   struct tmp_marker *head;
373
374   head = (struct tmp_marker *)
375     mpfr_default_allocate (sizeof (struct tmp_marker));
376   head->ptr = mpfr_default_allocate (size);
377   head->size = size;
378   head->next = *tmp_marker;
379   *tmp_marker = head;
380   return head->ptr;
381 }
382
383 void
384 mpfr_tmp_free (struct tmp_marker *tmp_marker)
385 {
386   struct tmp_marker *t;
387
388   while (tmp_marker != NULL)
389     {
390       t = tmp_marker;
391       mpfr_default_free (t->ptr, t->size);
392       tmp_marker = t->next;
393       mpfr_default_free (t, sizeof (struct tmp_marker));
394     }
395 }
396
397 #endif /* Have gmp-impl.h */