blob: fb1acdc9734f572d45515829021ee385dd28b777 [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 }
167 else if (PyObject_AsCharBuffer(v, &s, &len)) {
168 PyErr_SetString(PyExc_TypeError,
169 "float() needs a string argument");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000170 return NULL;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000171 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000172
Guido van Rossum4c08d552000-03-10 22:55:18 +0000173 last = s + len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000174 while (*s && isspace(Py_CHARMASK(*s)))
175 s++;
176 if (s[0] == '\0') {
177 PyErr_SetString(PyExc_ValueError, "empty string for float()");
178 return NULL;
179 }
180 errno = 0;
181 PyFPE_START_PROTECT("PyFloat_FromString", return 0)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000182 x = strtod((char *)s, (char **)&end);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000183 PyFPE_END_PROTECT(x)
184 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
185 byte at the end of the string, when the input is inf(inity) */
186 if (end > last)
187 end = last;
188 while (*end && isspace(Py_CHARMASK(*end)))
189 end++;
190 if (*end != '\0') {
191 sprintf(buffer, "invalid literal for float(): %.200s", s);
192 PyErr_SetString(PyExc_ValueError, buffer);
193 return NULL;
194 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000195 else if (end != last) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000196 PyErr_SetString(PyExc_ValueError,
197 "null byte in argument for float()");
198 return NULL;
199 }
200 else if (errno != 0) {
201 sprintf(buffer, "float() literal too large: %.200s", s);
202 PyErr_SetString(PyExc_ValueError, buffer);
203 return NULL;
204 }
205 if (pend)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000206 *pend = (char *)end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000207 return PyFloat_FromDouble(x);
208}
209
Guido van Rossum234f9421993-06-17 12:35:49 +0000210static void
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000211float_dealloc(op)
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000212 PyFloatObject *op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000213{
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000214 op->ob_type = (struct _typeobject *)free_list;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000215 free_list = op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000216}
217
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000219PyFloat_AsDouble(op)
220 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000222 PyNumberMethods *nb;
223 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000224 double val;
225
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 if (op && PyFloat_Check(op))
227 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000228
229 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
230 nb->nb_float == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232 return -1;
233 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000234
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000236 if (fo == NULL)
237 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000238 if (!PyFloat_Check(fo)) {
239 PyErr_SetString(PyExc_TypeError,
240 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000241 return -1;
242 }
243
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244 val = PyFloat_AS_DOUBLE(fo);
245 Py_DECREF(fo);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000246
247 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248}
249
250/* Methods */
251
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000252void
Guido van Rossum57072eb1999-12-23 19:00:28 +0000253PyFloat_AsStringEx(buf, v, precision)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254 char *buf;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000255 PyFloatObject *v;
Guido van Rossum57072eb1999-12-23 19:00:28 +0000256 int precision;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257{
258 register char *cp;
259 /* Subroutine for float_repr and float_print.
260 We want float numbers to be recognizable as such,
261 i.e., they should contain a decimal point or an exponent.
262 However, %g may print the number as an integer;
263 in such cases, we append ".0" to the string. */
Guido van Rossum57072eb1999-12-23 19:00:28 +0000264 sprintf(buf, "%.*g", precision, v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265 cp = buf;
266 if (*cp == '-')
267 cp++;
268 for (; *cp != '\0'; cp++) {
269 /* Any non-digit means it's not an integer;
270 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000271 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272 break;
273 }
274 if (*cp == '\0') {
275 *cp++ = '.';
276 *cp++ = '0';
277 *cp++ = '\0';
278 }
279}
280
Guido van Rossum57072eb1999-12-23 19:00:28 +0000281/* Precisions used by repr() and str(), respectively.
282
283 The repr() precision (17 significant decimal digits) is the minimal number
284 that is guaranteed to have enough precision so that if the number is read
285 back in the exact same binary value is recreated. This is true for IEEE
286 floating point by design, and also happens to work for all other modern
287 hardware.
288
289 The str() precision is chosen so that in most cases, the rounding noise
290 created by various operations is suppressed, while giving plenty of
291 precision for practical use.
292
293*/
294
295#define PREC_REPR 17
296#define PREC_STR 12
297
298void
299PyFloat_AsString(buf, v)
300 char *buf;
301 PyFloatObject *v;
302{
303 PyFloat_AsStringEx(buf, v, PREC_STR);
304}
305
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000306/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000307static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308float_print(v, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 FILE *fp;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000311 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312{
313 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000314 PyFloat_AsStringEx(buf, v, flags&Py_PRINT_RAW ? PREC_STR : PREC_REPR);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000316 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317}
318
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320float_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000321 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322{
323 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000324 PyFloat_AsStringEx(buf, v, PREC_REPR);
325 return PyString_FromString(buf);
326}
327
328static PyObject *
329float_str(v)
330 PyFloatObject *v;
331{
332 char buf[100];
333 PyFloat_AsStringEx(buf, v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335}
336
337static int
338float_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 PyFloatObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340{
341 double i = v->ob_fval;
342 double j = w->ob_fval;
343 return (i < j) ? -1 : (i > j) ? 1 : 0;
344}
345
Guido van Rossum9bfef441993-03-29 10:43:31 +0000346static long
347float_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 PyFloatObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000349{
350 double intpart, fractpart;
351 int expo;
352 long x;
353 /* This is designed so that Python numbers with the same
354 value hash to the same value, otherwise comparisons
355 of mapping keys will turn out weird */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000356
357#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
358{
359 extended e;
360 fractpart = modf(v->ob_fval, &e);
361 intpart = e;
362}
363#else
Guido van Rossum9bfef441993-03-29 10:43:31 +0000364 fractpart = modf(v->ob_fval, &intpart);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000365#endif
366
Guido van Rossum9bfef441993-03-29 10:43:31 +0000367 if (fractpart == 0.0) {
368 if (intpart > 0x7fffffffL || -intpart > 0x7fffffffL) {
369 /* Convert to long int and use its hash... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370 PyObject *w = PyLong_FromDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000371 if (w == NULL)
372 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 x = PyObject_Hash(w);
374 Py_DECREF(w);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000375 return x;
376 }
377 x = (long)intpart;
378 }
379 else {
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000380 /* Note -- if you change this code, also change the copy
381 in complexobject.c */
382 long hipart;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000383 fractpart = frexp(fractpart, &expo);
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000384 fractpart = fractpart * 2147483648.0; /* 2**31 */
385 hipart = (long)fractpart; /* Take the top 32 bits */
386 fractpart = (fractpart - (double)hipart) * 2147483648.0;
387 /* Get the next 32 bits */
388 x = hipart + (long)fractpart + (long)intpart + (expo << 15);
389 /* Combine everything */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000390 }
391 if (x == -1)
392 x = -2;
393 return x;
394}
395
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397float_add(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 PyFloatObject *v;
399 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000400{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000401 double result;
402 PyFPE_START_PROTECT("add", return 0)
403 result = v->ob_fval + w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000404 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000405 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406}
407
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000408static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409float_sub(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 PyFloatObject *v;
411 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000413 double result;
414 PyFPE_START_PROTECT("subtract", return 0)
415 result = v->ob_fval - w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000416 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418}
419
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000420static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421float_mul(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 PyFloatObject *v;
423 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000425 double result;
426
427 PyFPE_START_PROTECT("multiply", return 0)
428 result = v->ob_fval * w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000429 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431}
432
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434float_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435 PyFloatObject *v;
436 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000438 double result;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000439 if (w->ob_fval == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441 return NULL;
442 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000443 PyFPE_START_PROTECT("divide", 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_rem(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 Rossum56cd67a1992-01-26 18:16:35 +0000454 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000455 double mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000456 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000457 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459 return NULL;
460 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000461 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000462 vx = v->ob_fval;
463 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000464 /* note: checking mod*wx < 0 is incorrect -- underflows to
465 0 if wx < sqrt(smallest nonzero double) */
466 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000467 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000468 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000469 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471}
472
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000474float_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 PyFloatObject *v;
476 PyFloatObject *w;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000477{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000478 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000479 double div, mod, floordiv;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000480 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000481 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000483 return NULL;
484 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000485 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000486 vx = v->ob_fval;
487 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000488 /* fmod is typically exact, so vx-mod is *mathemtically* an
489 exact multiple of wx. But this is fp arithmetic, and fp
490 vx - mod is an approximation; the result is that div may
491 not be an exact integral value after the division, although
492 it will always be very close to one.
493 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000494 div = (vx - mod) / wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000495 /* note: checking mod*wx < 0 is incorrect -- underflows to
496 0 if wx < sqrt(smallest nonzero double) */
497 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum15ecff41991-10-20 20:16:45 +0000498 mod += wx;
499 div -= 1.0;
500 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000501 /* snap quotient to nearest integral value */
502 floordiv = floor(div);
503 if (div - floordiv > 0.5)
504 floordiv += 1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000505 PyFPE_END_PROTECT(div)
Guido van Rossum9263e781999-05-06 14:26:34 +0000506 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000507}
508
Guido van Rossum363078a1996-05-24 20:45:01 +0000509static double powu(x, n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000510 double x;
511 long n;
512{
513 double r = 1.;
514 double p = x;
515 long mask = 1;
516 while (mask > 0 && n >= mask) {
517 if (n & mask)
518 r *= p;
519 mask <<= 1;
520 p *= p;
521 }
522 return r;
523}
524
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525static PyObject *
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000526float_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 PyFloatObject *v;
528 PyObject *w;
529 PyFloatObject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000530{
531 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000532 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000533 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
534 * The z parameter is really only going to be useful for integers and
535 * long integers. Maybe something clever with logarithms could be done.
536 * [AMK]
537 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000538 iv = v->ob_fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 iw = ((PyFloatObject *)w)->ob_fval;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000540 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000541 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000542 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000543 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000544 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 if ((PyObject *)z!=Py_None) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000546 ix=fmod(1.0, z->ob_fval);
547 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
548 }
549 else ix=1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000550 PyFPE_END_PROTECT(ix)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 return PyFloat_FromDouble(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000552 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000553 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000554 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000555 if (intw > 0)
556 ix = powu(iv, intw);
557 else
558 ix = 1./powu(iv, -intw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000559 PyFPE_END_PROTECT(ix)
Guido van Rossum86c04c21996-08-09 20:50:14 +0000560 }
561 else {
562 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000563 if (iv == 0.0) {
564 if (iw < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000565 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000566 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000567 return NULL;
568 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 return PyFloat_FromDouble(0.0);
Guido van Rossum39739ea1996-01-12 01:22:56 +0000570 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000571 if (iv < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000573 "negative number to a float power");
574 return NULL;
575 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000576 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000577 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000578 ix = pow(iv, iw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000579 PyFPE_END_PROTECT(ix)
Guido van Rossum70d93461991-05-28 21:57:39 +0000580 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000581 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000582 if (errno != 0) {
583 /* XXX could it be another type of error? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584 PyErr_SetFromErrno(PyExc_OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000585 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000586 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 if ((PyObject *)z!=Py_None) {
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000588 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000589 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
590 if ( ix!=0 &&
591 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
592 ix+=z->ob_fval;
593 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000594 PyFPE_END_PROTECT(ix)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000595 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000597}
598
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000600float_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000602{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000604}
605
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000607float_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000609{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 Py_INCREF(v);
611 return (PyObject *)v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000612}
613
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000614static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000615float_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 PyFloatObject *v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000617{
618 if (v->ob_fval < 0)
619 return float_neg(v);
620 else
621 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000622}
623
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000624static int
625float_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 PyFloatObject *v;
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000627{
628 return v->ob_fval != 0.0;
629}
630
Guido van Rossum234f9421993-06-17 12:35:49 +0000631static int
Guido van Rossume6eefc21992-08-14 12:06:52 +0000632float_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633 PyObject **pv;
634 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000635{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636 if (PyInt_Check(*pw)) {
637 long x = PyInt_AsLong(*pw);
638 *pw = PyFloat_FromDouble((double)x);
639 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000640 return 0;
641 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642 else if (PyLong_Check(*pw)) {
643 *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
644 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000645 return 0;
646 }
647 return 1; /* Can't do it */
648}
649
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000651float_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000653{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654 double x = PyFloat_AsDouble(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000655 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
656 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000657 PyErr_SetString(PyExc_OverflowError,
658 "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000659 return NULL;
660 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 return PyInt_FromLong((long)x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000662}
663
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000665float_long(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);
669 return PyLong_FromDouble(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000670}
671
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000673float_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000675{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000677 return v;
678}
679
680
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681static PyNumberMethods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000682 (binaryfunc)float_add, /*nb_add*/
683 (binaryfunc)float_sub, /*nb_subtract*/
684 (binaryfunc)float_mul, /*nb_multiply*/
685 (binaryfunc)float_div, /*nb_divide*/
686 (binaryfunc)float_rem, /*nb_remainder*/
687 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000688 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000689 (unaryfunc)float_neg, /*nb_negative*/
690 (unaryfunc)float_pos, /*nb_positive*/
691 (unaryfunc)float_abs, /*nb_absolute*/
692 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000693 0, /*nb_invert*/
694 0, /*nb_lshift*/
695 0, /*nb_rshift*/
696 0, /*nb_and*/
697 0, /*nb_xor*/
698 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000699 (coercion)float_coerce, /*nb_coerce*/
700 (unaryfunc)float_int, /*nb_int*/
701 (unaryfunc)float_long, /*nb_long*/
702 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000703 0, /*nb_oct*/
704 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000705};
706
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707PyTypeObject PyFloat_Type = {
708 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000709 0,
710 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000712 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000713 (destructor)float_dealloc, /*tp_dealloc*/
714 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000715 0, /*tp_getattr*/
716 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000717 (cmpfunc)float_compare, /*tp_compare*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000718 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000719 &float_as_number, /*tp_as_number*/
720 0, /*tp_as_sequence*/
721 0, /*tp_as_mapping*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000722 (hashfunc)float_hash, /*tp_hash*/
723 0, /*tp_call*/
724 (reprfunc)float_str, /*tp_str*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000725};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000726
727void
728PyFloat_Fini()
729{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000730 PyFloatObject *p;
731 PyFloatBlock *list, *next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000732 int i;
733 int bc, bf; /* block count, number of freed blocks */
734 int frem, fsum; /* remaining unfreed floats per block, total */
735
736 bc = 0;
737 bf = 0;
738 fsum = 0;
739 list = block_list;
740 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000741 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000742 while (list != NULL) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000743 bc++;
744 frem = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000745 for (i = 0, p = &list->objects[0];
746 i < N_FLOATOBJECTS;
747 i++, p++) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000748 if (PyFloat_Check(p) && p->ob_refcnt != 0)
749 frem++;
750 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000751 next = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000752 if (frem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000753 list->next = block_list;
754 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000755 for (i = 0, p = &list->objects[0];
756 i < N_FLOATOBJECTS;
757 i++, p++) {
758 if (!PyFloat_Check(p) || p->ob_refcnt == 0) {
759 p->ob_type = (struct _typeobject *)
760 free_list;
761 free_list = p;
762 }
763 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000764 }
765 else {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000766 PyMem_FREE(list);
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000767 bf++;
768 }
769 fsum += frem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000770 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000771 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000772 if (!Py_VerboseFlag)
773 return;
774 fprintf(stderr, "# cleanup floats");
775 if (!fsum) {
776 fprintf(stderr, "\n");
777 }
778 else {
779 fprintf(stderr,
780 ": %d unfreed float%s in %d out of %d block%s\n",
781 fsum, fsum == 1 ? "" : "s",
782 bc - bf, bc, bc == 1 ? "" : "s");
783 }
784 if (Py_VerboseFlag > 1) {
785 list = block_list;
786 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000787 for (i = 0, p = &list->objects[0];
788 i < N_FLOATOBJECTS;
789 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000790 if (PyFloat_Check(p) && p->ob_refcnt != 0) {
791 char buf[100];
792 PyFloat_AsString(buf, p);
793 fprintf(stderr,
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000794 "# <float at %lx, refcnt=%d, val=%s>\n",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000795 (long)p, p->ob_refcnt, buf);
Guido van Rossum3fce8831999-03-12 19:43:17 +0000796 }
797 }
798 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000799 }
800 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000801}