blob: f455ef58912f1b18d3e767f12790ac6da20c0080 [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
Fred Drake13634cf2000-06-29 19:17:04 +000062#if SIZEOF_LONG == 4
Guido van Rossum03093a21994-09-28 15:51:32 +000063#define LONG_MAX 0X7FFFFFFFL
Fred Drake13634cf2000-06-29 19:17:04 +000064#elif SIZEOF_LONG == 8
65#define LONG_MAX 0X7FFFFFFFFFFFFFFFL
66#else
67#error "could not set LONG_MAX"
68#endif
Guido van Rossum03093a21994-09-28 15:51:32 +000069#endif
70
71#ifndef LONG_MIN
72#define LONG_MIN (-LONG_MAX-1)
73#endif
74
Guido van Rossum67ca7011995-02-13 16:38:41 +000075#ifdef __NeXT__
76#ifdef __sparc__
77/*
78 * This works around a bug in the NS/Sparc 3.3 pre-release
79 * limits.h header file.
80 * 10-Feb-1995 bwarsaw@cnri.reston.va.us
81 */
82#undef LONG_MIN
83#define LONG_MIN (-LONG_MAX-1)
84#endif
85#endif
86
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000087#if !defined(__STDC__) && !defined(macintosh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088extern double fmod Py_PROTO((double, double));
89extern double pow Py_PROTO((double, double));
Guido van Rossum6923e131990-11-02 17:50:43 +000090#endif
91
Guido van Rossum3c03fa81997-10-31 17:00:30 +000092#ifdef sun
93/* On SunOS4.1 only libm.a exists. Make sure that references to all
94 needed math functions exist in the executable, so that dynamic
95 loading of mathmodule does not fail. */
96double (*_Py_math_funcs_hack[])() = {
97 acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor,
98 fmod, log, log10, pow, sin, sinh, sqrt, tan, tanh
99};
100#endif
101
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000102/* Special free list -- see comments for same code in intobject.c. */
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000103#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +0000104#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000105#define N_FLOATOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyFloatObject))
Guido van Rossum3fce8831999-03-12 19:43:17 +0000106
Guido van Rossum3fce8831999-03-12 19:43:17 +0000107struct _floatblock {
108 struct _floatblock *next;
109 PyFloatObject objects[N_FLOATOBJECTS];
110};
111
112typedef struct _floatblock PyFloatBlock;
113
114static PyFloatBlock *block_list = NULL;
115static PyFloatObject *free_list = NULL;
116
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000117static PyFloatObject *
118fill_free_list()
119{
120 PyFloatObject *p, *q;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000121 /* XXX Float blocks escape the object heap. Use PyObject_MALLOC ??? */
122 p = (PyFloatObject *) PyMem_MALLOC(sizeof(PyFloatBlock));
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000123 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000124 return (PyFloatObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +0000125 ((PyFloatBlock *)p)->next = block_list;
126 block_list = (PyFloatBlock *)p;
127 p = &((PyFloatBlock *)p)->objects[0];
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000128 q = p + N_FLOATOBJECTS;
129 while (--q > p)
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000130 q->ob_type = (struct _typeobject *)(q-1);
131 q->ob_type = NULL;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000132 return p + N_FLOATOBJECTS - 1;
133}
134
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135PyObject *
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000136#ifdef __SC__
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000137PyFloat_FromDouble(double fval)
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000138#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139PyFloat_FromDouble(fval)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140 double fval;
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000141#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142{
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000143 register PyFloatObject *op;
144 if (free_list == NULL) {
145 if ((free_list = fill_free_list()) == NULL)
146 return NULL;
147 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000148 /* PyObject_New is inlined */
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000149 op = free_list;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000150 free_list = (PyFloatObject *)op->ob_type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000151 PyObject_INIT(op, &PyFloat_Type);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000152 op->ob_fval = fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000153 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000154}
155
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000156PyObject *
157PyFloat_FromString(v, pend)
158 PyObject *v;
159 char **pend;
160{
161 extern double strtod Py_PROTO((const char *, char **));
Guido van Rossum4c08d552000-03-10 22:55:18 +0000162 const char *s, *last, *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000163 double x;
164 char buffer[256]; /* For errors */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000165 int len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000166
Guido van Rossum4c08d552000-03-10 22:55:18 +0000167 if (PyString_Check(v)) {
168 s = PyString_AS_STRING(v);
169 len = PyString_GET_SIZE(v);
170 }
Guido van Rossum9e896b32000-04-05 20:11:21 +0000171 else if (PyUnicode_Check(v)) {
172 char s_buffer[256];
173
174 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
175 PyErr_SetString(PyExc_ValueError,
176 "float() literal too large to convert");
177 return NULL;
178 }
179 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
180 PyUnicode_GET_SIZE(v),
181 s_buffer,
182 NULL))
183 return NULL;
184 s = s_buffer;
185 len = strlen(s);
186 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000187 else if (PyObject_AsCharBuffer(v, &s, &len)) {
188 PyErr_SetString(PyExc_TypeError,
189 "float() needs a string argument");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000190 return NULL;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000191 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000192
Guido van Rossum4c08d552000-03-10 22:55:18 +0000193 last = s + len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000194 while (*s && isspace(Py_CHARMASK(*s)))
195 s++;
196 if (s[0] == '\0') {
197 PyErr_SetString(PyExc_ValueError, "empty string for float()");
198 return NULL;
199 }
200 errno = 0;
201 PyFPE_START_PROTECT("PyFloat_FromString", return 0)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000202 x = strtod((char *)s, (char **)&end);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000203 PyFPE_END_PROTECT(x)
204 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
205 byte at the end of the string, when the input is inf(inity) */
206 if (end > last)
207 end = last;
208 while (*end && isspace(Py_CHARMASK(*end)))
209 end++;
210 if (*end != '\0') {
211 sprintf(buffer, "invalid literal for float(): %.200s", s);
212 PyErr_SetString(PyExc_ValueError, buffer);
213 return NULL;
214 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000215 else if (end != last) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000216 PyErr_SetString(PyExc_ValueError,
217 "null byte in argument for float()");
218 return NULL;
219 }
220 else if (errno != 0) {
221 sprintf(buffer, "float() literal too large: %.200s", s);
222 PyErr_SetString(PyExc_ValueError, buffer);
223 return NULL;
224 }
225 if (pend)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000226 *pend = (char *)end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000227 return PyFloat_FromDouble(x);
228}
229
Guido van Rossum234f9421993-06-17 12:35:49 +0000230static void
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000231float_dealloc(op)
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000232 PyFloatObject *op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000233{
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000234 op->ob_type = (struct _typeobject *)free_list;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000235 free_list = op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000236}
237
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239PyFloat_AsDouble(op)
240 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000242 PyNumberMethods *nb;
243 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000244 double val;
245
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246 if (op && PyFloat_Check(op))
247 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000248
249 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
250 nb->nb_float == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000251 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000252 return -1;
253 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000254
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000255 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000256 if (fo == NULL)
257 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000258 if (!PyFloat_Check(fo)) {
259 PyErr_SetString(PyExc_TypeError,
260 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000261 return -1;
262 }
263
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000264 val = PyFloat_AS_DOUBLE(fo);
265 Py_DECREF(fo);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000266
267 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268}
269
270/* Methods */
271
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000272void
Guido van Rossum57072eb1999-12-23 19:00:28 +0000273PyFloat_AsStringEx(buf, v, precision)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274 char *buf;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000275 PyFloatObject *v;
Guido van Rossum57072eb1999-12-23 19:00:28 +0000276 int precision;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277{
278 register char *cp;
279 /* Subroutine for float_repr and float_print.
280 We want float numbers to be recognizable as such,
281 i.e., they should contain a decimal point or an exponent.
282 However, %g may print the number as an integer;
283 in such cases, we append ".0" to the string. */
Guido van Rossum57072eb1999-12-23 19:00:28 +0000284 sprintf(buf, "%.*g", precision, v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285 cp = buf;
286 if (*cp == '-')
287 cp++;
288 for (; *cp != '\0'; cp++) {
289 /* Any non-digit means it's not an integer;
290 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000291 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292 break;
293 }
294 if (*cp == '\0') {
295 *cp++ = '.';
296 *cp++ = '0';
297 *cp++ = '\0';
298 }
299}
300
Guido van Rossum57072eb1999-12-23 19:00:28 +0000301/* Precisions used by repr() and str(), respectively.
302
303 The repr() precision (17 significant decimal digits) is the minimal number
304 that is guaranteed to have enough precision so that if the number is read
305 back in the exact same binary value is recreated. This is true for IEEE
306 floating point by design, and also happens to work for all other modern
307 hardware.
308
309 The str() precision is chosen so that in most cases, the rounding noise
310 created by various operations is suppressed, while giving plenty of
311 precision for practical use.
312
313*/
314
315#define PREC_REPR 17
316#define PREC_STR 12
317
318void
319PyFloat_AsString(buf, v)
320 char *buf;
321 PyFloatObject *v;
322{
323 PyFloat_AsStringEx(buf, v, PREC_STR);
324}
325
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000326/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000327static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328float_print(v, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000329 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330 FILE *fp;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000331 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332{
333 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000334 PyFloat_AsStringEx(buf, v, flags&Py_PRINT_RAW ? PREC_STR : PREC_REPR);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000336 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337}
338
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340float_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000342{
343 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000344 PyFloat_AsStringEx(buf, v, PREC_REPR);
345 return PyString_FromString(buf);
346}
347
348static PyObject *
349float_str(v)
350 PyFloatObject *v;
351{
352 char buf[100];
353 PyFloat_AsStringEx(buf, v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355}
356
357static int
358float_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 PyFloatObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360{
361 double i = v->ob_fval;
362 double j = w->ob_fval;
363 return (i < j) ? -1 : (i > j) ? 1 : 0;
364}
365
Fred Drake13634cf2000-06-29 19:17:04 +0000366
Guido van Rossum9bfef441993-03-29 10:43:31 +0000367static long
368float_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 PyFloatObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000370{
371 double intpart, fractpart;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000372 long x;
373 /* This is designed so that Python numbers with the same
374 value hash to the same value, otherwise comparisons
375 of mapping keys will turn out weird */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000376
377#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
378{
379 extended e;
380 fractpart = modf(v->ob_fval, &e);
381 intpart = e;
382}
383#else
Guido van Rossum9bfef441993-03-29 10:43:31 +0000384 fractpart = modf(v->ob_fval, &intpart);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000385#endif
386
Guido van Rossum9bfef441993-03-29 10:43:31 +0000387 if (fractpart == 0.0) {
Fred Drake13634cf2000-06-29 19:17:04 +0000388 if (intpart > LONG_MAX || -intpart > LONG_MAX) {
Guido van Rossum9bfef441993-03-29 10:43:31 +0000389 /* Convert to long int and use its hash... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390 PyObject *w = PyLong_FromDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000391 if (w == NULL)
392 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393 x = PyObject_Hash(w);
394 Py_DECREF(w);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000395 return x;
396 }
397 x = (long)intpart;
398 }
399 else {
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000400 /* Note -- if you change this code, also change the copy
401 in complexobject.c */
Fred Drake13634cf2000-06-29 19:17:04 +0000402 x = _Py_HashDouble(v->ob_fval);
403 if (x == -1)
404 return -1;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000405 }
406 if (x == -1)
407 x = -2;
408 return x;
409}
410
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000411static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412float_add(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 PyFloatObject *v;
414 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000416 double result;
417 PyFPE_START_PROTECT("add", return 0)
418 result = v->ob_fval + w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000419 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000420 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421}
422
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424float_sub(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000425 PyFloatObject *v;
426 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000428 double result;
429 PyFPE_START_PROTECT("subtract", return 0)
430 result = v->ob_fval - w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000431 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000432 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433}
434
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436float_mul(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000437 PyFloatObject *v;
438 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000440 double result;
441
442 PyFPE_START_PROTECT("multiply", return 0)
443 result = v->ob_fval * w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000444 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446}
447
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449float_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450 PyFloatObject *v;
451 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000453 double result;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000454 if (w->ob_fval == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456 return NULL;
457 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000458 PyFPE_START_PROTECT("divide", return 0)
459 result = v->ob_fval / w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000460 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000462}
463
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000465float_rem(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 PyFloatObject *v;
467 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000468{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000469 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000470 double mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000471 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000474 return NULL;
475 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000476 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000477 vx = v->ob_fval;
478 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000479 /* note: checking mod*wx < 0 is incorrect -- underflows to
480 0 if wx < sqrt(smallest nonzero double) */
481 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000482 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000483 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000484 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000485 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486}
487
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000489float_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 PyFloatObject *v;
491 PyFloatObject *w;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000492{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000493 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000494 double div, mod, floordiv;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000495 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000496 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000497 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000498 return NULL;
499 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000500 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000501 vx = v->ob_fval;
502 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000503 /* fmod is typically exact, so vx-mod is *mathemtically* an
504 exact multiple of wx. But this is fp arithmetic, and fp
505 vx - mod is an approximation; the result is that div may
506 not be an exact integral value after the division, although
507 it will always be very close to one.
508 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000509 div = (vx - mod) / wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000510 /* note: checking mod*wx < 0 is incorrect -- underflows to
511 0 if wx < sqrt(smallest nonzero double) */
512 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum15ecff41991-10-20 20:16:45 +0000513 mod += wx;
514 div -= 1.0;
515 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000516 /* snap quotient to nearest integral value */
517 floordiv = floor(div);
518 if (div - floordiv > 0.5)
519 floordiv += 1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000520 PyFPE_END_PROTECT(div)
Guido van Rossum9263e781999-05-06 14:26:34 +0000521 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000522}
523
Guido van Rossum363078a1996-05-24 20:45:01 +0000524static double powu(x, n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000525 double x;
526 long n;
527{
528 double r = 1.;
529 double p = x;
530 long mask = 1;
531 while (mask > 0 && n >= mask) {
532 if (n & mask)
533 r *= p;
534 mask <<= 1;
535 p *= p;
536 }
537 return r;
538}
539
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540static PyObject *
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000541float_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 PyFloatObject *v;
543 PyObject *w;
544 PyFloatObject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545{
546 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000547 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000548 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
549 * The z parameter is really only going to be useful for integers and
550 * long integers. Maybe something clever with logarithms could be done.
551 * [AMK]
552 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000553 iv = v->ob_fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 iw = ((PyFloatObject *)w)->ob_fval;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000555 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000556 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000557 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000558 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000559 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 if ((PyObject *)z!=Py_None) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000561 ix=fmod(1.0, z->ob_fval);
562 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
563 }
564 else ix=1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000565 PyFPE_END_PROTECT(ix)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 return PyFloat_FromDouble(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000567 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000568 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000569 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000570 if (intw > 0)
571 ix = powu(iv, intw);
572 else
573 ix = 1./powu(iv, -intw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000574 PyFPE_END_PROTECT(ix)
Guido van Rossum86c04c21996-08-09 20:50:14 +0000575 }
576 else {
577 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000578 if (iv == 0.0) {
579 if (iw < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000581 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000582 return NULL;
583 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584 return PyFloat_FromDouble(0.0);
Guido van Rossum39739ea1996-01-12 01:22:56 +0000585 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000586 if (iv < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000588 "negative number to a float power");
589 return NULL;
590 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000591 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000592 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000593 ix = pow(iv, iw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000594 PyFPE_END_PROTECT(ix)
Guido van Rossum70d93461991-05-28 21:57:39 +0000595 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000596 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000597 if (errno != 0) {
598 /* XXX could it be another type of error? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 PyErr_SetFromErrno(PyExc_OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000600 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000601 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 if ((PyObject *)z!=Py_None) {
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000603 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000604 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
605 if ( ix!=0 &&
606 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
607 ix+=z->ob_fval;
608 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000609 PyFPE_END_PROTECT(ix)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000610 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000612}
613
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000614static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000615float_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000617{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000618 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000619}
620
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000622float_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000624{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625 Py_INCREF(v);
626 return (PyObject *)v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000627}
628
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000630float_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000631 PyFloatObject *v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000632{
633 if (v->ob_fval < 0)
634 return float_neg(v);
635 else
636 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000637}
638
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000639static int
640float_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641 PyFloatObject *v;
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000642{
643 return v->ob_fval != 0.0;
644}
645
Guido van Rossum234f9421993-06-17 12:35:49 +0000646static int
Guido van Rossume6eefc21992-08-14 12:06:52 +0000647float_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 PyObject **pv;
649 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000650{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651 if (PyInt_Check(*pw)) {
652 long x = PyInt_AsLong(*pw);
653 *pw = PyFloat_FromDouble((double)x);
654 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000655 return 0;
656 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000657 else if (PyLong_Check(*pw)) {
658 *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
659 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000660 return 0;
661 }
662 return 1; /* Can't do it */
663}
664
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000666float_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000668{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000669 double x = PyFloat_AsDouble(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000670 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
671 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672 PyErr_SetString(PyExc_OverflowError,
673 "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000674 return NULL;
675 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 return PyInt_FromLong((long)x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000677}
678
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000679static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000680float_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000682{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683 double x = PyFloat_AsDouble(v);
684 return PyLong_FromDouble(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000685}
686
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000687static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000688float_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000690{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000692 return v;
693}
694
695
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696static PyNumberMethods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000697 (binaryfunc)float_add, /*nb_add*/
698 (binaryfunc)float_sub, /*nb_subtract*/
699 (binaryfunc)float_mul, /*nb_multiply*/
700 (binaryfunc)float_div, /*nb_divide*/
701 (binaryfunc)float_rem, /*nb_remainder*/
702 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000703 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000704 (unaryfunc)float_neg, /*nb_negative*/
705 (unaryfunc)float_pos, /*nb_positive*/
706 (unaryfunc)float_abs, /*nb_absolute*/
707 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000708 0, /*nb_invert*/
709 0, /*nb_lshift*/
710 0, /*nb_rshift*/
711 0, /*nb_and*/
712 0, /*nb_xor*/
713 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000714 (coercion)float_coerce, /*nb_coerce*/
715 (unaryfunc)float_int, /*nb_int*/
716 (unaryfunc)float_long, /*nb_long*/
717 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000718 0, /*nb_oct*/
719 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000720};
721
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722PyTypeObject PyFloat_Type = {
723 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000724 0,
725 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000726 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000727 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000728 (destructor)float_dealloc, /*tp_dealloc*/
729 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000730 0, /*tp_getattr*/
731 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000732 (cmpfunc)float_compare, /*tp_compare*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000733 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000734 &float_as_number, /*tp_as_number*/
735 0, /*tp_as_sequence*/
736 0, /*tp_as_mapping*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000737 (hashfunc)float_hash, /*tp_hash*/
738 0, /*tp_call*/
739 (reprfunc)float_str, /*tp_str*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000740};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000741
742void
743PyFloat_Fini()
744{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000745 PyFloatObject *p;
746 PyFloatBlock *list, *next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000747 int i;
748 int bc, bf; /* block count, number of freed blocks */
749 int frem, fsum; /* remaining unfreed floats per block, total */
750
751 bc = 0;
752 bf = 0;
753 fsum = 0;
754 list = block_list;
755 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000756 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000757 while (list != NULL) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000758 bc++;
759 frem = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000760 for (i = 0, p = &list->objects[0];
761 i < N_FLOATOBJECTS;
762 i++, p++) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000763 if (PyFloat_Check(p) && p->ob_refcnt != 0)
764 frem++;
765 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000766 next = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000767 if (frem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000768 list->next = block_list;
769 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000770 for (i = 0, p = &list->objects[0];
771 i < N_FLOATOBJECTS;
772 i++, p++) {
773 if (!PyFloat_Check(p) || p->ob_refcnt == 0) {
774 p->ob_type = (struct _typeobject *)
775 free_list;
776 free_list = p;
777 }
778 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000779 }
780 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000781 PyMem_FREE(list); /* XXX PyObject_FREE ??? */
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000782 bf++;
783 }
784 fsum += frem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000785 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000786 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000787 if (!Py_VerboseFlag)
788 return;
789 fprintf(stderr, "# cleanup floats");
790 if (!fsum) {
791 fprintf(stderr, "\n");
792 }
793 else {
794 fprintf(stderr,
795 ": %d unfreed float%s in %d out of %d block%s\n",
796 fsum, fsum == 1 ? "" : "s",
797 bc - bf, bc, bc == 1 ? "" : "s");
798 }
799 if (Py_VerboseFlag > 1) {
800 list = block_list;
801 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000802 for (i = 0, p = &list->objects[0];
803 i < N_FLOATOBJECTS;
804 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000805 if (PyFloat_Check(p) && p->ob_refcnt != 0) {
806 char buf[100];
807 PyFloat_AsString(buf, p);
808 fprintf(stderr,
Fred Drakea44d3532000-06-30 15:01:00 +0000809 "# <float at %p, refcnt=%d, val=%s>\n",
810 p, p->ob_refcnt, buf);
Guido van Rossum3fce8831999-03-12 19:43:17 +0000811 }
812 }
813 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000814 }
815 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000816}