blob: 69b66b7470df9dc0ebf44015fcf5fd66aee1cfa0 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Float object implementation */
33
Guido van Rossum2a9096b1990-10-21 22:15:08 +000034/* XXX There should be overflow checks here, but it's hard to check
35 for any kind of float exception without losing portability. */
36
Guido van Rossumc0b618a1997-05-02 03:12:38 +000037#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038
Guido van Rossum3f5da241990-12-20 15:06:42 +000039#include <ctype.h>
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000040#include "mymath.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041
Guido van Rossum9575a441993-04-07 14:06:14 +000042#ifdef i860
43/* Cray APP has bogus definition of HUGE_VAL in <math.h> */
44#undef HUGE_VAL
45#endif
46
Guido van Rossum9d81b551996-06-26 18:27:19 +000047#if defined(HUGE_VAL) && !defined(CHECK)
Guido van Rossum7fa52f81991-12-16 15:43:14 +000048#define CHECK(x) if (errno != 0) ; \
49 else if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \
50 else errno = ERANGE
Guido van Rossum9d81b551996-06-26 18:27:19 +000051#endif
52
53#ifndef CHECK
Guido van Rossum7fa52f81991-12-16 15:43:14 +000054#define CHECK(x) /* Don't know how to check */
55#endif
56
Guido van Rossum03093a21994-09-28 15:51:32 +000057#ifdef HAVE_LIMITS_H
58#include <limits.h>
59#endif
60
61#ifndef LONG_MAX
62#define LONG_MAX 0X7FFFFFFFL
63#endif
64
65#ifndef LONG_MIN
66#define LONG_MIN (-LONG_MAX-1)
67#endif
68
Guido van Rossum67ca7011995-02-13 16:38:41 +000069#ifdef __NeXT__
70#ifdef __sparc__
71/*
72 * This works around a bug in the NS/Sparc 3.3 pre-release
73 * limits.h header file.
74 * 10-Feb-1995 bwarsaw@cnri.reston.va.us
75 */
76#undef LONG_MIN
77#define LONG_MIN (-LONG_MAX-1)
78#endif
79#endif
80
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000081#if !defined(__STDC__) && !defined(macintosh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000082extern double fmod Py_PROTO((double, double));
83extern double pow Py_PROTO((double, double));
Guido van Rossum6923e131990-11-02 17:50:43 +000084#endif
85
Guido van Rossum3c03fa81997-10-31 17:00:30 +000086#ifdef sun
87/* On SunOS4.1 only libm.a exists. Make sure that references to all
88 needed math functions exist in the executable, so that dynamic
89 loading of mathmodule does not fail. */
90double (*_Py_math_funcs_hack[])() = {
91 acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor,
92 fmod, log, log10, pow, sin, sinh, sqrt, tan, tanh
93};
94#endif
95
Guido van Rossum93ad0df1997-05-13 21:00:42 +000096/* Special free list -- see comments for same code in intobject.c. */
Guido van Rossum93ad0df1997-05-13 21:00:42 +000097#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000098#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
Guido van Rossumf61bbc81999-03-12 00:12:21 +000099#define N_FLOATOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyFloatObject))
Guido van Rossum3fce8831999-03-12 19:43:17 +0000100
Guido van Rossum3fce8831999-03-12 19:43:17 +0000101struct _floatblock {
102 struct _floatblock *next;
103 PyFloatObject objects[N_FLOATOBJECTS];
104};
105
106typedef struct _floatblock PyFloatBlock;
107
108static PyFloatBlock *block_list = NULL;
109static PyFloatObject *free_list = NULL;
110
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000111static PyFloatObject *
112fill_free_list()
113{
114 PyFloatObject *p, *q;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000115 /* XXX Float blocks escape the object heap. Use PyObject_MALLOC ??? */
116 p = (PyFloatObject *) PyMem_MALLOC(sizeof(PyFloatBlock));
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000117 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000118 return (PyFloatObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +0000119 ((PyFloatBlock *)p)->next = block_list;
120 block_list = (PyFloatBlock *)p;
121 p = &((PyFloatBlock *)p)->objects[0];
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000122 q = p + N_FLOATOBJECTS;
123 while (--q > p)
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000124 q->ob_type = (struct _typeobject *)(q-1);
125 q->ob_type = NULL;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000126 return p + N_FLOATOBJECTS - 1;
127}
128
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129PyObject *
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000130#ifdef __SC__
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131PyFloat_FromDouble(double fval)
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000132#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133PyFloat_FromDouble(fval)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134 double fval;
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000135#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136{
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000137 register PyFloatObject *op;
138 if (free_list == NULL) {
139 if ((free_list = fill_free_list()) == NULL)
140 return NULL;
141 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000142 /* PyObject_New is inlined */
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000143 op = free_list;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000144 free_list = (PyFloatObject *)op->ob_type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000145 PyObject_INIT(op, &PyFloat_Type);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000146 op->ob_fval = fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148}
149
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000150PyObject *
151PyFloat_FromString(v, pend)
152 PyObject *v;
153 char **pend;
154{
155 extern double strtod Py_PROTO((const char *, char **));
Guido van Rossum4c08d552000-03-10 22:55:18 +0000156 const char *s, *last, *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000157 double x;
158 char buffer[256]; /* For errors */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000159 int len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000160
Guido van Rossum4c08d552000-03-10 22:55:18 +0000161 if (PyString_Check(v)) {
162 s = PyString_AS_STRING(v);
163 len = PyString_GET_SIZE(v);
164 }
Guido van Rossum9e896b32000-04-05 20:11:21 +0000165 else if (PyUnicode_Check(v)) {
166 char s_buffer[256];
167
168 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
169 PyErr_SetString(PyExc_ValueError,
170 "float() literal too large to convert");
171 return NULL;
172 }
173 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
174 PyUnicode_GET_SIZE(v),
175 s_buffer,
176 NULL))
177 return NULL;
178 s = s_buffer;
179 len = strlen(s);
180 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000181 else if (PyObject_AsCharBuffer(v, &s, &len)) {
182 PyErr_SetString(PyExc_TypeError,
183 "float() needs a string argument");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000184 return NULL;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000185 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000186
Guido van Rossum4c08d552000-03-10 22:55:18 +0000187 last = s + len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000188 while (*s && isspace(Py_CHARMASK(*s)))
189 s++;
190 if (s[0] == '\0') {
191 PyErr_SetString(PyExc_ValueError, "empty string for float()");
192 return NULL;
193 }
194 errno = 0;
195 PyFPE_START_PROTECT("PyFloat_FromString", return 0)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000196 x = strtod((char *)s, (char **)&end);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000197 PyFPE_END_PROTECT(x)
198 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
199 byte at the end of the string, when the input is inf(inity) */
200 if (end > last)
201 end = last;
202 while (*end && isspace(Py_CHARMASK(*end)))
203 end++;
204 if (*end != '\0') {
205 sprintf(buffer, "invalid literal for float(): %.200s", s);
206 PyErr_SetString(PyExc_ValueError, buffer);
207 return NULL;
208 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000209 else if (end != last) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000210 PyErr_SetString(PyExc_ValueError,
211 "null byte in argument for float()");
212 return NULL;
213 }
214 else if (errno != 0) {
215 sprintf(buffer, "float() literal too large: %.200s", s);
216 PyErr_SetString(PyExc_ValueError, buffer);
217 return NULL;
218 }
219 if (pend)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000220 *pend = (char *)end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000221 return PyFloat_FromDouble(x);
222}
223
Guido van Rossum234f9421993-06-17 12:35:49 +0000224static void
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000225float_dealloc(op)
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000226 PyFloatObject *op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000227{
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000228 op->ob_type = (struct _typeobject *)free_list;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000229 free_list = op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000230}
231
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233PyFloat_AsDouble(op)
234 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236 PyNumberMethods *nb;
237 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000238 double val;
239
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 if (op && PyFloat_Check(op))
241 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000242
243 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
244 nb->nb_float == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000245 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246 return -1;
247 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000248
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000249 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000250 if (fo == NULL)
251 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000252 if (!PyFloat_Check(fo)) {
253 PyErr_SetString(PyExc_TypeError,
254 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000255 return -1;
256 }
257
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000258 val = PyFloat_AS_DOUBLE(fo);
259 Py_DECREF(fo);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000260
261 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262}
263
264/* Methods */
265
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000266void
Guido van Rossum57072eb1999-12-23 19:00:28 +0000267PyFloat_AsStringEx(buf, v, precision)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268 char *buf;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 PyFloatObject *v;
Guido van Rossum57072eb1999-12-23 19:00:28 +0000270 int precision;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271{
272 register char *cp;
273 /* Subroutine for float_repr and float_print.
274 We want float numbers to be recognizable as such,
275 i.e., they should contain a decimal point or an exponent.
276 However, %g may print the number as an integer;
277 in such cases, we append ".0" to the string. */
Guido van Rossum57072eb1999-12-23 19:00:28 +0000278 sprintf(buf, "%.*g", precision, v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279 cp = buf;
280 if (*cp == '-')
281 cp++;
282 for (; *cp != '\0'; cp++) {
283 /* Any non-digit means it's not an integer;
284 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000285 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 break;
287 }
288 if (*cp == '\0') {
289 *cp++ = '.';
290 *cp++ = '0';
291 *cp++ = '\0';
292 }
293}
294
Guido van Rossum57072eb1999-12-23 19:00:28 +0000295/* Precisions used by repr() and str(), respectively.
296
297 The repr() precision (17 significant decimal digits) is the minimal number
298 that is guaranteed to have enough precision so that if the number is read
299 back in the exact same binary value is recreated. This is true for IEEE
300 floating point by design, and also happens to work for all other modern
301 hardware.
302
303 The str() precision is chosen so that in most cases, the rounding noise
304 created by various operations is suppressed, while giving plenty of
305 precision for practical use.
306
307*/
308
309#define PREC_REPR 17
310#define PREC_STR 12
311
312void
313PyFloat_AsString(buf, v)
314 char *buf;
315 PyFloatObject *v;
316{
317 PyFloat_AsStringEx(buf, v, PREC_STR);
318}
319
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000320/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000321static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322float_print(v, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324 FILE *fp;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000325 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000326{
327 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000328 PyFloat_AsStringEx(buf, v, flags&Py_PRINT_RAW ? PREC_STR : PREC_REPR);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000329 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000330 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331}
332
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000333static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334float_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336{
337 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000338 PyFloat_AsStringEx(buf, v, PREC_REPR);
339 return PyString_FromString(buf);
340}
341
342static PyObject *
343float_str(v)
344 PyFloatObject *v;
345{
346 char buf[100];
347 PyFloat_AsStringEx(buf, v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349}
350
351static int
352float_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000353 PyFloatObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000354{
355 double i = v->ob_fval;
356 double j = w->ob_fval;
357 return (i < j) ? -1 : (i > j) ? 1 : 0;
358}
359
Guido van Rossum9bfef441993-03-29 10:43:31 +0000360static long
361float_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000362 PyFloatObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000363{
364 double intpart, fractpart;
365 int expo;
366 long x;
367 /* This is designed so that Python numbers with the same
368 value hash to the same value, otherwise comparisons
369 of mapping keys will turn out weird */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000370
371#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
372{
373 extended e;
374 fractpart = modf(v->ob_fval, &e);
375 intpart = e;
376}
377#else
Guido van Rossum9bfef441993-03-29 10:43:31 +0000378 fractpart = modf(v->ob_fval, &intpart);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000379#endif
380
Guido van Rossum9bfef441993-03-29 10:43:31 +0000381 if (fractpart == 0.0) {
382 if (intpart > 0x7fffffffL || -intpart > 0x7fffffffL) {
383 /* Convert to long int and use its hash... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384 PyObject *w = PyLong_FromDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000385 if (w == NULL)
386 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387 x = PyObject_Hash(w);
388 Py_DECREF(w);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000389 return x;
390 }
391 x = (long)intpart;
392 }
393 else {
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000394 /* Note -- if you change this code, also change the copy
395 in complexobject.c */
396 long hipart;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000397 fractpart = frexp(fractpart, &expo);
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000398 fractpart = fractpart * 2147483648.0; /* 2**31 */
399 hipart = (long)fractpart; /* Take the top 32 bits */
400 fractpart = (fractpart - (double)hipart) * 2147483648.0;
401 /* Get the next 32 bits */
402 x = hipart + (long)fractpart + (long)intpart + (expo << 15);
403 /* Combine everything */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000404 }
405 if (x == -1)
406 x = -2;
407 return x;
408}
409
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411float_add(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412 PyFloatObject *v;
413 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000414{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000415 double result;
416 PyFPE_START_PROTECT("add", return 0)
417 result = v->ob_fval + w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000418 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420}
421
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000423float_sub(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 PyFloatObject *v;
425 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000427 double result;
428 PyFPE_START_PROTECT("subtract", return 0)
429 result = v->ob_fval - w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000430 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432}
433
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000435float_mul(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 PyFloatObject *v;
437 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000438{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000439 double result;
440
441 PyFPE_START_PROTECT("multiply", return 0)
442 result = v->ob_fval * w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000443 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445}
446
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000448float_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 PyFloatObject *v;
450 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000451{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000452 double result;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000453 if (w->ob_fval == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000455 return NULL;
456 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000457 PyFPE_START_PROTECT("divide", return 0)
458 result = v->ob_fval / w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000459 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000461}
462
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000463static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464float_rem(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465 PyFloatObject *v;
466 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000467{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000468 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000469 double mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000470 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000473 return NULL;
474 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000475 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000476 vx = v->ob_fval;
477 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000478 /* note: checking mod*wx < 0 is incorrect -- underflows to
479 0 if wx < sqrt(smallest nonzero double) */
480 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000481 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000482 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000483 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000485}
486
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000488float_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489 PyFloatObject *v;
490 PyFloatObject *w;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000491{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000492 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000493 double div, mod, floordiv;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000494 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000495 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000497 return NULL;
498 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000499 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000500 vx = v->ob_fval;
501 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000502 /* fmod is typically exact, so vx-mod is *mathemtically* an
503 exact multiple of wx. But this is fp arithmetic, and fp
504 vx - mod is an approximation; the result is that div may
505 not be an exact integral value after the division, although
506 it will always be very close to one.
507 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000508 div = (vx - mod) / wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000509 /* note: checking mod*wx < 0 is incorrect -- underflows to
510 0 if wx < sqrt(smallest nonzero double) */
511 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum15ecff41991-10-20 20:16:45 +0000512 mod += wx;
513 div -= 1.0;
514 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000515 /* snap quotient to nearest integral value */
516 floordiv = floor(div);
517 if (div - floordiv > 0.5)
518 floordiv += 1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000519 PyFPE_END_PROTECT(div)
Guido van Rossum9263e781999-05-06 14:26:34 +0000520 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000521}
522
Guido van Rossum363078a1996-05-24 20:45:01 +0000523static double powu(x, n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000524 double x;
525 long n;
526{
527 double r = 1.;
528 double p = x;
529 long mask = 1;
530 while (mask > 0 && n >= mask) {
531 if (n & mask)
532 r *= p;
533 mask <<= 1;
534 p *= p;
535 }
536 return r;
537}
538
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539static PyObject *
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000540float_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541 PyFloatObject *v;
542 PyObject *w;
543 PyFloatObject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000544{
545 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000546 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000547 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
548 * The z parameter is really only going to be useful for integers and
549 * long integers. Maybe something clever with logarithms could be done.
550 * [AMK]
551 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000552 iv = v->ob_fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 iw = ((PyFloatObject *)w)->ob_fval;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000554 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000555 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000556 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000557 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000558 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 if ((PyObject *)z!=Py_None) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000560 ix=fmod(1.0, z->ob_fval);
561 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
562 }
563 else ix=1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000564 PyFPE_END_PROTECT(ix)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000565 return PyFloat_FromDouble(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000566 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000567 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000568 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000569 if (intw > 0)
570 ix = powu(iv, intw);
571 else
572 ix = 1./powu(iv, -intw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000573 PyFPE_END_PROTECT(ix)
Guido van Rossum86c04c21996-08-09 20:50:14 +0000574 }
575 else {
576 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000577 if (iv == 0.0) {
578 if (iw < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000580 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000581 return NULL;
582 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000583 return PyFloat_FromDouble(0.0);
Guido van Rossum39739ea1996-01-12 01:22:56 +0000584 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000585 if (iv < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000587 "negative number to a float power");
588 return NULL;
589 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000590 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000591 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000592 ix = pow(iv, iw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000593 PyFPE_END_PROTECT(ix)
Guido van Rossum70d93461991-05-28 21:57:39 +0000594 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000595 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000596 if (errno != 0) {
597 /* XXX could it be another type of error? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 PyErr_SetFromErrno(PyExc_OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000599 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000600 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 if ((PyObject *)z!=Py_None) {
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000602 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000603 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
604 if ( ix!=0 &&
605 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
606 ix+=z->ob_fval;
607 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000608 PyFPE_END_PROTECT(ix)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000609 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000611}
612
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000614float_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000616{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000618}
619
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000621float_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000623{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 Py_INCREF(v);
625 return (PyObject *)v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000626}
627
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000629float_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 PyFloatObject *v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000631{
632 if (v->ob_fval < 0)
633 return float_neg(v);
634 else
635 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000636}
637
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000638static int
639float_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000640 PyFloatObject *v;
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000641{
642 return v->ob_fval != 0.0;
643}
644
Guido van Rossum234f9421993-06-17 12:35:49 +0000645static int
Guido van Rossume6eefc21992-08-14 12:06:52 +0000646float_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647 PyObject **pv;
648 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000649{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650 if (PyInt_Check(*pw)) {
651 long x = PyInt_AsLong(*pw);
652 *pw = PyFloat_FromDouble((double)x);
653 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000654 return 0;
655 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656 else if (PyLong_Check(*pw)) {
657 *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
658 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000659 return 0;
660 }
661 return 1; /* Can't do it */
662}
663
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000665float_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000667{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 double x = PyFloat_AsDouble(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000669 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
670 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671 PyErr_SetString(PyExc_OverflowError,
672 "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000673 return NULL;
674 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 return PyInt_FromLong((long)x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000676}
677
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000679float_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000681{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 double x = PyFloat_AsDouble(v);
683 return PyLong_FromDouble(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000684}
685
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000686static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000687float_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000689{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000691 return v;
692}
693
694
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695static PyNumberMethods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000696 (binaryfunc)float_add, /*nb_add*/
697 (binaryfunc)float_sub, /*nb_subtract*/
698 (binaryfunc)float_mul, /*nb_multiply*/
699 (binaryfunc)float_div, /*nb_divide*/
700 (binaryfunc)float_rem, /*nb_remainder*/
701 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000702 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000703 (unaryfunc)float_neg, /*nb_negative*/
704 (unaryfunc)float_pos, /*nb_positive*/
705 (unaryfunc)float_abs, /*nb_absolute*/
706 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000707 0, /*nb_invert*/
708 0, /*nb_lshift*/
709 0, /*nb_rshift*/
710 0, /*nb_and*/
711 0, /*nb_xor*/
712 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000713 (coercion)float_coerce, /*nb_coerce*/
714 (unaryfunc)float_int, /*nb_int*/
715 (unaryfunc)float_long, /*nb_long*/
716 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000717 0, /*nb_oct*/
718 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000719};
720
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721PyTypeObject PyFloat_Type = {
722 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000723 0,
724 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000726 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000727 (destructor)float_dealloc, /*tp_dealloc*/
728 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000729 0, /*tp_getattr*/
730 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000731 (cmpfunc)float_compare, /*tp_compare*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000732 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000733 &float_as_number, /*tp_as_number*/
734 0, /*tp_as_sequence*/
735 0, /*tp_as_mapping*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000736 (hashfunc)float_hash, /*tp_hash*/
737 0, /*tp_call*/
738 (reprfunc)float_str, /*tp_str*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000739};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000740
741void
742PyFloat_Fini()
743{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000744 PyFloatObject *p;
745 PyFloatBlock *list, *next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000746 int i;
747 int bc, bf; /* block count, number of freed blocks */
748 int frem, fsum; /* remaining unfreed floats per block, total */
749
750 bc = 0;
751 bf = 0;
752 fsum = 0;
753 list = block_list;
754 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000755 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000756 while (list != NULL) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000757 bc++;
758 frem = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000759 for (i = 0, p = &list->objects[0];
760 i < N_FLOATOBJECTS;
761 i++, p++) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000762 if (PyFloat_Check(p) && p->ob_refcnt != 0)
763 frem++;
764 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000765 next = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000766 if (frem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000767 list->next = block_list;
768 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000769 for (i = 0, p = &list->objects[0];
770 i < N_FLOATOBJECTS;
771 i++, p++) {
772 if (!PyFloat_Check(p) || p->ob_refcnt == 0) {
773 p->ob_type = (struct _typeobject *)
774 free_list;
775 free_list = p;
776 }
777 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000778 }
779 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000780 PyMem_FREE(list); /* XXX PyObject_FREE ??? */
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000781 bf++;
782 }
783 fsum += frem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000784 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000785 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000786 if (!Py_VerboseFlag)
787 return;
788 fprintf(stderr, "# cleanup floats");
789 if (!fsum) {
790 fprintf(stderr, "\n");
791 }
792 else {
793 fprintf(stderr,
794 ": %d unfreed float%s in %d out of %d block%s\n",
795 fsum, fsum == 1 ? "" : "s",
796 bc - bf, bc, bc == 1 ? "" : "s");
797 }
798 if (Py_VerboseFlag > 1) {
799 list = block_list;
800 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000801 for (i = 0, p = &list->objects[0];
802 i < N_FLOATOBJECTS;
803 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000804 if (PyFloat_Check(p) && p->ob_refcnt != 0) {
805 char buf[100];
806 PyFloat_AsString(buf, p);
807 fprintf(stderr,
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000808 "# <float at %lx, refcnt=%d, val=%s>\n",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000809 (long)p, p->ob_refcnt, buf);
Guido van Rossum3fce8831999-03-12 19:43:17 +0000810 }
811 }
812 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000813 }
814 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000815}