blob: 77ef8d0917cf38c2130b508550bc15d02bb0c83b [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 Rossumf61bbc81999-03-12 00:12:21 +0000101#define PyMem_MALLOC malloc
102#define PyMem_FREE free
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000103
Guido van Rossum3fce8831999-03-12 19:43:17 +0000104struct _floatblock {
105 struct _floatblock *next;
106 PyFloatObject objects[N_FLOATOBJECTS];
107};
108
109typedef struct _floatblock PyFloatBlock;
110
111static PyFloatBlock *block_list = NULL;
112static PyFloatObject *free_list = NULL;
113
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000114static PyFloatObject *
115fill_free_list()
116{
117 PyFloatObject *p, *q;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000118 p = (PyFloatObject *)PyMem_MALLOC(sizeof(PyFloatBlock));
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000119 if (p == NULL)
120 return (PyFloatObject *)PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +0000121 ((PyFloatBlock *)p)->next = block_list;
122 block_list = (PyFloatBlock *)p;
123 p = &((PyFloatBlock *)p)->objects[0];
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000124 q = p + N_FLOATOBJECTS;
125 while (--q > p)
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000126 q->ob_type = (struct _typeobject *)(q-1);
127 q->ob_type = NULL;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000128 return p + N_FLOATOBJECTS - 1;
129}
130
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131PyObject *
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000132#ifdef __SC__
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133PyFloat_FromDouble(double fval)
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000134#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135PyFloat_FromDouble(fval)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136 double fval;
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000137#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138{
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000139 register PyFloatObject *op;
140 if (free_list == NULL) {
141 if ((free_list = fill_free_list()) == NULL)
142 return NULL;
143 }
144 op = free_list;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000145 free_list = (PyFloatObject *)op->ob_type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 op->ob_type = &PyFloat_Type;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000147 op->ob_fval = fval;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000148 _Py_NewReference((PyObject *)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150}
151
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000152PyObject *
153PyFloat_FromString(v, pend)
154 PyObject *v;
155 char **pend;
156{
157 extern double strtod Py_PROTO((const char *, char **));
Guido van Rossum4c08d552000-03-10 22:55:18 +0000158 const char *s, *last, *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000159 double x;
160 char buffer[256]; /* For errors */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000161 int len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000162
Guido van Rossum4c08d552000-03-10 22:55:18 +0000163 if (PyString_Check(v)) {
164 s = PyString_AS_STRING(v);
165 len = PyString_GET_SIZE(v);
166 }
Guido van Rossum9e896b32000-04-05 20:11:21 +0000167 else if (PyUnicode_Check(v)) {
168 char s_buffer[256];
169
170 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
171 PyErr_SetString(PyExc_ValueError,
172 "float() literal too large to convert");
173 return NULL;
174 }
175 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
176 PyUnicode_GET_SIZE(v),
177 s_buffer,
178 NULL))
179 return NULL;
180 s = s_buffer;
181 len = strlen(s);
182 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000183 else if (PyObject_AsCharBuffer(v, &s, &len)) {
184 PyErr_SetString(PyExc_TypeError,
185 "float() needs a string argument");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000186 return NULL;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000187 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000188
Guido van Rossum4c08d552000-03-10 22:55:18 +0000189 last = s + len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000190 while (*s && isspace(Py_CHARMASK(*s)))
191 s++;
192 if (s[0] == '\0') {
193 PyErr_SetString(PyExc_ValueError, "empty string for float()");
194 return NULL;
195 }
196 errno = 0;
197 PyFPE_START_PROTECT("PyFloat_FromString", return 0)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000198 x = strtod((char *)s, (char **)&end);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000199 PyFPE_END_PROTECT(x)
200 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
201 byte at the end of the string, when the input is inf(inity) */
202 if (end > last)
203 end = last;
204 while (*end && isspace(Py_CHARMASK(*end)))
205 end++;
206 if (*end != '\0') {
207 sprintf(buffer, "invalid literal for float(): %.200s", s);
208 PyErr_SetString(PyExc_ValueError, buffer);
209 return NULL;
210 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000211 else if (end != last) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000212 PyErr_SetString(PyExc_ValueError,
213 "null byte in argument for float()");
214 return NULL;
215 }
216 else if (errno != 0) {
217 sprintf(buffer, "float() literal too large: %.200s", s);
218 PyErr_SetString(PyExc_ValueError, buffer);
219 return NULL;
220 }
221 if (pend)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000222 *pend = (char *)end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000223 return PyFloat_FromDouble(x);
224}
225
Guido van Rossum234f9421993-06-17 12:35:49 +0000226static void
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000227float_dealloc(op)
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000228 PyFloatObject *op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000229{
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000230 op->ob_type = (struct _typeobject *)free_list;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000231 free_list = op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000232}
233
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235PyFloat_AsDouble(op)
236 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000238 PyNumberMethods *nb;
239 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000240 double val;
241
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000242 if (op && PyFloat_Check(op))
243 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000244
245 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
246 nb->nb_float == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000247 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248 return -1;
249 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000250
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000251 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252 if (fo == NULL)
253 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254 if (!PyFloat_Check(fo)) {
255 PyErr_SetString(PyExc_TypeError,
256 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000257 return -1;
258 }
259
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000260 val = PyFloat_AS_DOUBLE(fo);
261 Py_DECREF(fo);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000262
263 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264}
265
266/* Methods */
267
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000268void
Guido van Rossum57072eb1999-12-23 19:00:28 +0000269PyFloat_AsStringEx(buf, v, precision)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000270 char *buf;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000271 PyFloatObject *v;
Guido van Rossum57072eb1999-12-23 19:00:28 +0000272 int precision;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273{
274 register char *cp;
275 /* Subroutine for float_repr and float_print.
276 We want float numbers to be recognizable as such,
277 i.e., they should contain a decimal point or an exponent.
278 However, %g may print the number as an integer;
279 in such cases, we append ".0" to the string. */
Guido van Rossum57072eb1999-12-23 19:00:28 +0000280 sprintf(buf, "%.*g", precision, v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281 cp = buf;
282 if (*cp == '-')
283 cp++;
284 for (; *cp != '\0'; cp++) {
285 /* Any non-digit means it's not an integer;
286 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000287 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288 break;
289 }
290 if (*cp == '\0') {
291 *cp++ = '.';
292 *cp++ = '0';
293 *cp++ = '\0';
294 }
295}
296
Guido van Rossum57072eb1999-12-23 19:00:28 +0000297/* Precisions used by repr() and str(), respectively.
298
299 The repr() precision (17 significant decimal digits) is the minimal number
300 that is guaranteed to have enough precision so that if the number is read
301 back in the exact same binary value is recreated. This is true for IEEE
302 floating point by design, and also happens to work for all other modern
303 hardware.
304
305 The str() precision is chosen so that in most cases, the rounding noise
306 created by various operations is suppressed, while giving plenty of
307 precision for practical use.
308
309*/
310
311#define PREC_REPR 17
312#define PREC_STR 12
313
314void
315PyFloat_AsString(buf, v)
316 char *buf;
317 PyFloatObject *v;
318{
319 PyFloat_AsStringEx(buf, v, PREC_STR);
320}
321
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000322/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000323static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324float_print(v, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000326 FILE *fp;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000327 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328{
329 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000330 PyFloat_AsStringEx(buf, v, flags&Py_PRINT_RAW ? PREC_STR : PREC_REPR);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000332 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333}
334
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336float_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338{
339 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000340 PyFloat_AsStringEx(buf, v, PREC_REPR);
341 return PyString_FromString(buf);
342}
343
344static PyObject *
345float_str(v)
346 PyFloatObject *v;
347{
348 char buf[100];
349 PyFloat_AsStringEx(buf, v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000351}
352
353static int
354float_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000355 PyFloatObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000356{
357 double i = v->ob_fval;
358 double j = w->ob_fval;
359 return (i < j) ? -1 : (i > j) ? 1 : 0;
360}
361
Guido van Rossum9bfef441993-03-29 10:43:31 +0000362static long
363float_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 PyFloatObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000365{
366 double intpart, fractpart;
367 int expo;
368 long x;
369 /* This is designed so that Python numbers with the same
370 value hash to the same value, otherwise comparisons
371 of mapping keys will turn out weird */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000372
373#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
374{
375 extended e;
376 fractpart = modf(v->ob_fval, &e);
377 intpart = e;
378}
379#else
Guido van Rossum9bfef441993-03-29 10:43:31 +0000380 fractpart = modf(v->ob_fval, &intpart);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000381#endif
382
Guido van Rossum9bfef441993-03-29 10:43:31 +0000383 if (fractpart == 0.0) {
384 if (intpart > 0x7fffffffL || -intpart > 0x7fffffffL) {
385 /* Convert to long int and use its hash... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 PyObject *w = PyLong_FromDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000387 if (w == NULL)
388 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000389 x = PyObject_Hash(w);
390 Py_DECREF(w);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000391 return x;
392 }
393 x = (long)intpart;
394 }
395 else {
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000396 /* Note -- if you change this code, also change the copy
397 in complexobject.c */
398 long hipart;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000399 fractpart = frexp(fractpart, &expo);
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000400 fractpart = fractpart * 2147483648.0; /* 2**31 */
401 hipart = (long)fractpart; /* Take the top 32 bits */
402 fractpart = (fractpart - (double)hipart) * 2147483648.0;
403 /* Get the next 32 bits */
404 x = hipart + (long)fractpart + (long)intpart + (expo << 15);
405 /* Combine everything */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000406 }
407 if (x == -1)
408 x = -2;
409 return x;
410}
411
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000413float_add(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414 PyFloatObject *v;
415 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000417 double result;
418 PyFPE_START_PROTECT("add", return 0)
419 result = v->ob_fval + w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000420 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422}
423
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000425float_sub(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000426 PyFloatObject *v;
427 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000429 double result;
430 PyFPE_START_PROTECT("subtract", return 0)
431 result = v->ob_fval - w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000432 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434}
435
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437float_mul(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438 PyFloatObject *v;
439 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000441 double result;
442
443 PyFPE_START_PROTECT("multiply", return 0)
444 result = v->ob_fval * w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000445 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447}
448
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000450float_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 PyFloatObject *v;
452 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000454 double result;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000455 if (w->ob_fval == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000457 return NULL;
458 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000459 PyFPE_START_PROTECT("divide", return 0)
460 result = v->ob_fval / w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000461 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463}
464
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000466float_rem(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 PyFloatObject *v;
468 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000470 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000471 double mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000472 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000473 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000475 return NULL;
476 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000477 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000478 vx = v->ob_fval;
479 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000480 /* note: checking mod*wx < 0 is incorrect -- underflows to
481 0 if wx < sqrt(smallest nonzero double) */
482 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000483 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000484 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000485 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487}
488
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000490float_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 PyFloatObject *v;
492 PyFloatObject *w;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000493{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000494 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000495 double div, mod, floordiv;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000496 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000497 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000498 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000499 return NULL;
500 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000501 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000502 vx = v->ob_fval;
503 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000504 /* fmod is typically exact, so vx-mod is *mathemtically* an
505 exact multiple of wx. But this is fp arithmetic, and fp
506 vx - mod is an approximation; the result is that div may
507 not be an exact integral value after the division, although
508 it will always be very close to one.
509 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000510 div = (vx - mod) / wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000511 /* note: checking mod*wx < 0 is incorrect -- underflows to
512 0 if wx < sqrt(smallest nonzero double) */
513 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum15ecff41991-10-20 20:16:45 +0000514 mod += wx;
515 div -= 1.0;
516 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000517 /* snap quotient to nearest integral value */
518 floordiv = floor(div);
519 if (div - floordiv > 0.5)
520 floordiv += 1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000521 PyFPE_END_PROTECT(div)
Guido van Rossum9263e781999-05-06 14:26:34 +0000522 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000523}
524
Guido van Rossum363078a1996-05-24 20:45:01 +0000525static double powu(x, n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000526 double x;
527 long n;
528{
529 double r = 1.;
530 double p = x;
531 long mask = 1;
532 while (mask > 0 && n >= mask) {
533 if (n & mask)
534 r *= p;
535 mask <<= 1;
536 p *= p;
537 }
538 return r;
539}
540
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541static PyObject *
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000542float_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 PyFloatObject *v;
544 PyObject *w;
545 PyFloatObject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000546{
547 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000548 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000549 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
550 * The z parameter is really only going to be useful for integers and
551 * long integers. Maybe something clever with logarithms could be done.
552 * [AMK]
553 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000554 iv = v->ob_fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 iw = ((PyFloatObject *)w)->ob_fval;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000556 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000557 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000558 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000559 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000560 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561 if ((PyObject *)z!=Py_None) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000562 ix=fmod(1.0, z->ob_fval);
563 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
564 }
565 else ix=1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000566 PyFPE_END_PROTECT(ix)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 return PyFloat_FromDouble(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000568 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000569 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000570 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000571 if (intw > 0)
572 ix = powu(iv, intw);
573 else
574 ix = 1./powu(iv, -intw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000575 PyFPE_END_PROTECT(ix)
Guido van Rossum86c04c21996-08-09 20:50:14 +0000576 }
577 else {
578 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000579 if (iv == 0.0) {
580 if (iw < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000582 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000583 return NULL;
584 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 return PyFloat_FromDouble(0.0);
Guido van Rossum39739ea1996-01-12 01:22:56 +0000586 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000587 if (iv < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000589 "negative number to a float power");
590 return NULL;
591 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000592 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000593 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000594 ix = pow(iv, iw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000595 PyFPE_END_PROTECT(ix)
Guido van Rossum70d93461991-05-28 21:57:39 +0000596 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000597 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000598 if (errno != 0) {
599 /* XXX could it be another type of error? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000600 PyErr_SetFromErrno(PyExc_OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000601 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000602 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 if ((PyObject *)z!=Py_None) {
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000604 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000605 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
606 if ( ix!=0 &&
607 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
608 ix+=z->ob_fval;
609 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000610 PyFPE_END_PROTECT(ix)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000611 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000613}
614
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000616float_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000618{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000620}
621
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000623float_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000625{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 Py_INCREF(v);
627 return (PyObject *)v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000628}
629
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000631float_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 PyFloatObject *v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000633{
634 if (v->ob_fval < 0)
635 return float_neg(v);
636 else
637 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000638}
639
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000640static int
641float_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642 PyFloatObject *v;
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000643{
644 return v->ob_fval != 0.0;
645}
646
Guido van Rossum234f9421993-06-17 12:35:49 +0000647static int
Guido van Rossume6eefc21992-08-14 12:06:52 +0000648float_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649 PyObject **pv;
650 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000651{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 if (PyInt_Check(*pw)) {
653 long x = PyInt_AsLong(*pw);
654 *pw = PyFloat_FromDouble((double)x);
655 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000656 return 0;
657 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658 else if (PyLong_Check(*pw)) {
659 *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
660 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000661 return 0;
662 }
663 return 1; /* Can't do it */
664}
665
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000667float_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000669{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000670 double x = PyFloat_AsDouble(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000671 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
672 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673 PyErr_SetString(PyExc_OverflowError,
674 "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000675 return NULL;
676 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 return PyInt_FromLong((long)x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000678}
679
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000681float_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000683{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000684 double x = PyFloat_AsDouble(v);
685 return PyLong_FromDouble(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000686}
687
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000689float_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000691{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000693 return v;
694}
695
696
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000697static PyNumberMethods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000698 (binaryfunc)float_add, /*nb_add*/
699 (binaryfunc)float_sub, /*nb_subtract*/
700 (binaryfunc)float_mul, /*nb_multiply*/
701 (binaryfunc)float_div, /*nb_divide*/
702 (binaryfunc)float_rem, /*nb_remainder*/
703 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000704 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000705 (unaryfunc)float_neg, /*nb_negative*/
706 (unaryfunc)float_pos, /*nb_positive*/
707 (unaryfunc)float_abs, /*nb_absolute*/
708 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000709 0, /*nb_invert*/
710 0, /*nb_lshift*/
711 0, /*nb_rshift*/
712 0, /*nb_and*/
713 0, /*nb_xor*/
714 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000715 (coercion)float_coerce, /*nb_coerce*/
716 (unaryfunc)float_int, /*nb_int*/
717 (unaryfunc)float_long, /*nb_long*/
718 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000719 0, /*nb_oct*/
720 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000721};
722
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723PyTypeObject PyFloat_Type = {
724 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000725 0,
726 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000728 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000729 (destructor)float_dealloc, /*tp_dealloc*/
730 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000731 0, /*tp_getattr*/
732 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000733 (cmpfunc)float_compare, /*tp_compare*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000734 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000735 &float_as_number, /*tp_as_number*/
736 0, /*tp_as_sequence*/
737 0, /*tp_as_mapping*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000738 (hashfunc)float_hash, /*tp_hash*/
739 0, /*tp_call*/
740 (reprfunc)float_str, /*tp_str*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000741};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000742
743void
744PyFloat_Fini()
745{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000746 PyFloatObject *p;
747 PyFloatBlock *list, *next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000748 int i;
749 int bc, bf; /* block count, number of freed blocks */
750 int frem, fsum; /* remaining unfreed floats per block, total */
751
752 bc = 0;
753 bf = 0;
754 fsum = 0;
755 list = block_list;
756 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000757 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000758 while (list != NULL) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000759 bc++;
760 frem = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000761 for (i = 0, p = &list->objects[0];
762 i < N_FLOATOBJECTS;
763 i++, p++) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000764 if (PyFloat_Check(p) && p->ob_refcnt != 0)
765 frem++;
766 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000767 next = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000768 if (frem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000769 list->next = block_list;
770 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000771 for (i = 0, p = &list->objects[0];
772 i < N_FLOATOBJECTS;
773 i++, p++) {
774 if (!PyFloat_Check(p) || p->ob_refcnt == 0) {
775 p->ob_type = (struct _typeobject *)
776 free_list;
777 free_list = p;
778 }
779 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000780 }
781 else {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000782 PyMem_FREE(list);
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000783 bf++;
784 }
785 fsum += frem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000786 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000787 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000788 if (!Py_VerboseFlag)
789 return;
790 fprintf(stderr, "# cleanup floats");
791 if (!fsum) {
792 fprintf(stderr, "\n");
793 }
794 else {
795 fprintf(stderr,
796 ": %d unfreed float%s in %d out of %d block%s\n",
797 fsum, fsum == 1 ? "" : "s",
798 bc - bf, bc, bc == 1 ? "" : "s");
799 }
800 if (Py_VerboseFlag > 1) {
801 list = block_list;
802 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000803 for (i = 0, p = &list->objects[0];
804 i < N_FLOATOBJECTS;
805 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000806 if (PyFloat_Check(p) && p->ob_refcnt != 0) {
807 char buf[100];
808 PyFloat_AsString(buf, p);
809 fprintf(stderr,
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000810 "# <float at %lx, refcnt=%d, val=%s>\n",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000811 (long)p, p->ob_refcnt, buf);
Guido van Rossum3fce8831999-03-12 19:43:17 +0000812 }
813 }
814 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000815 }
816 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000817}