1 /* mpfr_gmp -- Limited gmp-impl emulator
2 Modified version of the GMP files.
4 Copyright 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
5 Contributed by the Arenaire and Cacao projects, INRIA.
7 This file is part of the GNU MPFR Library.
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.
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.
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. */
24 #include <stdlib.h> /* For malloc, free, realloc and abort */
26 #include "mpfr-impl.h"
28 #ifndef MPFR_HAVE_GMP_IMPL
30 char mpfr_rands_initialized
= 0;
31 gmp_randstate_t mpfr_rands
;
33 const struct bases mpfr_bases
[257] =
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},
295 mpfr_assert_fail (const char *filename
, int linenum
,
298 if (filename
!= NULL
&& filename
[0] != '\0')
300 fprintf (stderr
, "%s:", filename
);
302 fprintf (stderr
, "%d: ", linenum
);
304 fprintf (stderr
, " assertion failed: %s\n", expr
);
309 mpfr_rand_raw (mp_ptr mp
, gmp_randstate_t rstate
, unsigned long int nbits
)
313 /* To be sure to avoid the potential allocation of mpz_urandomb */
314 ALLOC(z
) = SIZ(z
) = (nbits
/ GMP_NUMB_BITS
) + 1;
316 mpz_urandomb(z
, rstate
, nbits
);
319 #ifdef mp_get_memory_functions
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.
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;
335 mpfr_default_allocate (size_t size
)
341 fprintf (stderr
, "MPFR: Can't allocate memory (size=%lu)\n",
342 (unsigned long) size
);
349 mpfr_default_reallocate (void *oldptr
, size_t old_size
, size_t new_size
)
352 ret
= realloc (oldptr
, new_size
);
356 "MPFR: Can't reallocate memory (old_size=%lu new_size=%lu)\n",
357 (unsigned long) old_size
, (unsigned long) new_size
);
364 mpfr_default_free (void *blk_ptr
, size_t blk_size
)
370 mpfr_tmp_allocate (struct tmp_marker
**tmp_marker
, size_t size
)
372 struct tmp_marker
*head
;
374 head
= (struct tmp_marker
*)
375 mpfr_default_allocate (sizeof (struct tmp_marker
));
376 head
->ptr
= mpfr_default_allocate (size
);
378 head
->next
= *tmp_marker
;
384 mpfr_tmp_free (struct tmp_marker
*tmp_marker
)
386 struct tmp_marker
*t
;
388 while (tmp_marker
!= NULL
)
391 mpfr_default_free (t
->ptr
, t
->size
);
392 tmp_marker
= t
->next
;
393 mpfr_default_free (t
, sizeof (struct tmp_marker
));
397 #endif /* Have gmp-impl.h */