blob: 8b4f2d99d34abe91bf5040ef82c43ccb6a7dd987 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Float object implementation */
12
Guido van Rossum2a9096b1990-10-21 22:15:08 +000013/* XXX There should be overflow checks here, but it's hard to check
14 for any kind of float exception without losing portability. */
15
Guido van Rossumc0b618a1997-05-02 03:12:38 +000016#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017
Guido van Rossum3f5da241990-12-20 15:06:42 +000018#include <ctype.h>
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000019#include "mymath.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000020
Guido van Rossum9575a441993-04-07 14:06:14 +000021#ifdef i860
22/* Cray APP has bogus definition of HUGE_VAL in <math.h> */
23#undef HUGE_VAL
24#endif
25
Guido van Rossum9d81b551996-06-26 18:27:19 +000026#if defined(HUGE_VAL) && !defined(CHECK)
Guido van Rossum7fa52f81991-12-16 15:43:14 +000027#define CHECK(x) if (errno != 0) ; \
28 else if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \
29 else errno = ERANGE
Guido van Rossum9d81b551996-06-26 18:27:19 +000030#endif
31
32#ifndef CHECK
Guido van Rossum7fa52f81991-12-16 15:43:14 +000033#define CHECK(x) /* Don't know how to check */
34#endif
35
Guido van Rossum03093a21994-09-28 15:51:32 +000036#ifdef HAVE_LIMITS_H
37#include <limits.h>
38#endif
39
40#ifndef LONG_MAX
Fred Drake13634cf2000-06-29 19:17:04 +000041#if SIZEOF_LONG == 4
Guido van Rossum03093a21994-09-28 15:51:32 +000042#define LONG_MAX 0X7FFFFFFFL
Fred Drake13634cf2000-06-29 19:17:04 +000043#elif SIZEOF_LONG == 8
44#define LONG_MAX 0X7FFFFFFFFFFFFFFFL
45#else
46#error "could not set LONG_MAX"
47#endif
Guido van Rossum03093a21994-09-28 15:51:32 +000048#endif
49
50#ifndef LONG_MIN
51#define LONG_MIN (-LONG_MAX-1)
52#endif
53
Guido van Rossum67ca7011995-02-13 16:38:41 +000054#ifdef __NeXT__
55#ifdef __sparc__
56/*
57 * This works around a bug in the NS/Sparc 3.3 pre-release
58 * limits.h header file.
59 * 10-Feb-1995 bwarsaw@cnri.reston.va.us
60 */
61#undef LONG_MIN
62#define LONG_MIN (-LONG_MAX-1)
63#endif
64#endif
65
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000066#if !defined(__STDC__) && !defined(macintosh)
Tim Petersdbd9ba62000-07-09 03:09:57 +000067extern double fmod(double, double);
68extern double pow(double, double);
Guido van Rossum6923e131990-11-02 17:50:43 +000069#endif
70
Guido van Rossum3c03fa81997-10-31 17:00:30 +000071#ifdef sun
72/* On SunOS4.1 only libm.a exists. Make sure that references to all
73 needed math functions exist in the executable, so that dynamic
74 loading of mathmodule does not fail. */
75double (*_Py_math_funcs_hack[])() = {
76 acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor,
77 fmod, log, log10, pow, sin, sinh, sqrt, tan, tanh
78};
79#endif
80
Guido van Rossum93ad0df1997-05-13 21:00:42 +000081/* Special free list -- see comments for same code in intobject.c. */
Guido van Rossum93ad0df1997-05-13 21:00:42 +000082#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000083#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
Guido van Rossumf61bbc81999-03-12 00:12:21 +000084#define N_FLOATOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyFloatObject))
Guido van Rossum3fce8831999-03-12 19:43:17 +000085
Guido van Rossum3fce8831999-03-12 19:43:17 +000086struct _floatblock {
87 struct _floatblock *next;
88 PyFloatObject objects[N_FLOATOBJECTS];
89};
90
91typedef struct _floatblock PyFloatBlock;
92
93static PyFloatBlock *block_list = NULL;
94static PyFloatObject *free_list = NULL;
95
Guido van Rossum93ad0df1997-05-13 21:00:42 +000096static PyFloatObject *
97fill_free_list()
98{
99 PyFloatObject *p, *q;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000100 /* XXX Float blocks escape the object heap. Use PyObject_MALLOC ??? */
101 p = (PyFloatObject *) PyMem_MALLOC(sizeof(PyFloatBlock));
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000102 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000103 return (PyFloatObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +0000104 ((PyFloatBlock *)p)->next = block_list;
105 block_list = (PyFloatBlock *)p;
106 p = &((PyFloatBlock *)p)->objects[0];
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000107 q = p + N_FLOATOBJECTS;
108 while (--q > p)
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000109 q->ob_type = (struct _typeobject *)(q-1);
110 q->ob_type = NULL;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000111 return p + N_FLOATOBJECTS - 1;
112}
113
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114PyObject *
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000115#ifdef __SC__
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116PyFloat_FromDouble(double fval)
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000117#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118PyFloat_FromDouble(fval)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119 double fval;
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000120#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121{
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000122 register PyFloatObject *op;
123 if (free_list == NULL) {
124 if ((free_list = fill_free_list()) == NULL)
125 return NULL;
126 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000127 /* PyObject_New is inlined */
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000128 op = free_list;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000129 free_list = (PyFloatObject *)op->ob_type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000130 PyObject_INIT(op, &PyFloat_Type);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000131 op->ob_fval = fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133}
134
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000135PyObject *
136PyFloat_FromString(v, pend)
137 PyObject *v;
138 char **pend;
139{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000140 extern double strtod(const char *, char **);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000141 const char *s, *last, *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000142 double x;
143 char buffer[256]; /* For errors */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000144 int len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000145
Guido van Rossum4c08d552000-03-10 22:55:18 +0000146 if (PyString_Check(v)) {
147 s = PyString_AS_STRING(v);
148 len = PyString_GET_SIZE(v);
149 }
Guido van Rossum9e896b32000-04-05 20:11:21 +0000150 else if (PyUnicode_Check(v)) {
151 char s_buffer[256];
152
153 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
154 PyErr_SetString(PyExc_ValueError,
155 "float() literal too large to convert");
156 return NULL;
157 }
158 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
159 PyUnicode_GET_SIZE(v),
160 s_buffer,
161 NULL))
162 return NULL;
163 s = s_buffer;
164 len = strlen(s);
165 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000166 else if (PyObject_AsCharBuffer(v, &s, &len)) {
167 PyErr_SetString(PyExc_TypeError,
168 "float() needs a string argument");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000169 return NULL;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000170 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000171
Guido van Rossum4c08d552000-03-10 22:55:18 +0000172 last = s + len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000173 while (*s && isspace(Py_CHARMASK(*s)))
174 s++;
175 if (s[0] == '\0') {
176 PyErr_SetString(PyExc_ValueError, "empty string for float()");
177 return NULL;
178 }
179 errno = 0;
180 PyFPE_START_PROTECT("PyFloat_FromString", return 0)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000181 x = strtod((char *)s, (char **)&end);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000182 PyFPE_END_PROTECT(x)
183 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
184 byte at the end of the string, when the input is inf(inity) */
185 if (end > last)
186 end = last;
187 while (*end && isspace(Py_CHARMASK(*end)))
188 end++;
189 if (*end != '\0') {
190 sprintf(buffer, "invalid literal for float(): %.200s", s);
191 PyErr_SetString(PyExc_ValueError, buffer);
192 return NULL;
193 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000194 else if (end != last) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000195 PyErr_SetString(PyExc_ValueError,
196 "null byte in argument for float()");
197 return NULL;
198 }
199 else if (errno != 0) {
200 sprintf(buffer, "float() literal too large: %.200s", s);
201 PyErr_SetString(PyExc_ValueError, buffer);
202 return NULL;
203 }
204 if (pend)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000205 *pend = (char *)end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000206 return PyFloat_FromDouble(x);
207}
208
Guido van Rossum234f9421993-06-17 12:35:49 +0000209static void
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000210float_dealloc(op)
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000211 PyFloatObject *op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000212{
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000213 op->ob_type = (struct _typeobject *)free_list;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000214 free_list = op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000215}
216
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000217double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000218PyFloat_AsDouble(op)
219 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 PyNumberMethods *nb;
222 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000223 double val;
224
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 if (op && PyFloat_Check(op))
226 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000227
228 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
229 nb->nb_float == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231 return -1;
232 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000233
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000235 if (fo == NULL)
236 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 if (!PyFloat_Check(fo)) {
238 PyErr_SetString(PyExc_TypeError,
239 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000240 return -1;
241 }
242
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 val = PyFloat_AS_DOUBLE(fo);
244 Py_DECREF(fo);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000245
246 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247}
248
249/* Methods */
250
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000251void
Guido van Rossum57072eb1999-12-23 19:00:28 +0000252PyFloat_AsStringEx(buf, v, precision)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253 char *buf;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254 PyFloatObject *v;
Guido van Rossum57072eb1999-12-23 19:00:28 +0000255 int precision;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000256{
257 register char *cp;
258 /* Subroutine for float_repr and float_print.
259 We want float numbers to be recognizable as such,
260 i.e., they should contain a decimal point or an exponent.
261 However, %g may print the number as an integer;
262 in such cases, we append ".0" to the string. */
Guido van Rossum57072eb1999-12-23 19:00:28 +0000263 sprintf(buf, "%.*g", precision, v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264 cp = buf;
265 if (*cp == '-')
266 cp++;
267 for (; *cp != '\0'; cp++) {
268 /* Any non-digit means it's not an integer;
269 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000270 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271 break;
272 }
273 if (*cp == '\0') {
274 *cp++ = '.';
275 *cp++ = '0';
276 *cp++ = '\0';
277 }
278}
279
Guido van Rossum57072eb1999-12-23 19:00:28 +0000280/* Precisions used by repr() and str(), respectively.
281
282 The repr() precision (17 significant decimal digits) is the minimal number
283 that is guaranteed to have enough precision so that if the number is read
284 back in the exact same binary value is recreated. This is true for IEEE
285 floating point by design, and also happens to work for all other modern
286 hardware.
287
288 The str() precision is chosen so that in most cases, the rounding noise
289 created by various operations is suppressed, while giving plenty of
290 precision for practical use.
291
292*/
293
294#define PREC_REPR 17
295#define PREC_STR 12
296
297void
298PyFloat_AsString(buf, v)
299 char *buf;
300 PyFloatObject *v;
301{
302 PyFloat_AsStringEx(buf, v, PREC_STR);
303}
304
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000305/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000306static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307float_print(v, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309 FILE *fp;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000310 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311{
312 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000313 PyFloat_AsStringEx(buf, v, flags&Py_PRINT_RAW ? PREC_STR : PREC_REPR);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000315 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316}
317
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000318static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319float_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321{
322 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000323 PyFloat_AsStringEx(buf, v, PREC_REPR);
324 return PyString_FromString(buf);
325}
326
327static PyObject *
328float_str(v)
329 PyFloatObject *v;
330{
331 char buf[100];
332 PyFloat_AsStringEx(buf, v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000333 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334}
335
336static int
337float_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338 PyFloatObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339{
340 double i = v->ob_fval;
341 double j = w->ob_fval;
342 return (i < j) ? -1 : (i > j) ? 1 : 0;
343}
344
Fred Drake13634cf2000-06-29 19:17:04 +0000345
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;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000351 long x;
352 /* This is designed so that Python numbers with the same
353 value hash to the same value, otherwise comparisons
354 of mapping keys will turn out weird */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000355
356#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
357{
358 extended e;
359 fractpart = modf(v->ob_fval, &e);
360 intpart = e;
361}
362#else
Guido van Rossum9bfef441993-03-29 10:43:31 +0000363 fractpart = modf(v->ob_fval, &intpart);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000364#endif
365
Guido van Rossum9bfef441993-03-29 10:43:31 +0000366 if (fractpart == 0.0) {
Fred Drake13634cf2000-06-29 19:17:04 +0000367 if (intpart > LONG_MAX || -intpart > LONG_MAX) {
Guido van Rossum9bfef441993-03-29 10:43:31 +0000368 /* Convert to long int and use its hash... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 PyObject *w = PyLong_FromDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000370 if (w == NULL)
371 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 x = PyObject_Hash(w);
373 Py_DECREF(w);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000374 return x;
375 }
376 x = (long)intpart;
377 }
378 else {
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000379 /* Note -- if you change this code, also change the copy
380 in complexobject.c */
Fred Drake13634cf2000-06-29 19:17:04 +0000381 x = _Py_HashDouble(v->ob_fval);
382 if (x == -1)
383 return -1;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000384 }
385 if (x == -1)
386 x = -2;
387 return x;
388}
389
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391float_add(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 PyFloatObject *v;
393 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000395 double result;
396 PyFPE_START_PROTECT("add", return 0)
397 result = v->ob_fval + w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000398 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000400}
401
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403float_sub(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404 PyFloatObject *v;
405 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000407 double result;
408 PyFPE_START_PROTECT("subtract", return 0)
409 result = v->ob_fval - w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000410 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000411 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412}
413
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415float_mul(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 PyFloatObject *v;
417 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000419 double result;
420
421 PyFPE_START_PROTECT("multiply", return 0)
422 result = v->ob_fval * w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000423 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000425}
426
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428float_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429 PyFloatObject *v;
430 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000432 double result;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000433 if (w->ob_fval == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000435 return NULL;
436 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000437 PyFPE_START_PROTECT("divide", return 0)
438 result = v->ob_fval / w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000439 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441}
442
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444float_rem(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 PyFloatObject *v;
446 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000448 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000449 double mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000450 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000451 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453 return NULL;
454 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000455 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000456 vx = v->ob_fval;
457 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000458 /* note: checking mod*wx < 0 is incorrect -- underflows to
459 0 if wx < sqrt(smallest nonzero double) */
460 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000461 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000462 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000463 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000465}
466
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000468float_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469 PyFloatObject *v;
470 PyFloatObject *w;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000471{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000472 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000473 double div, mod, floordiv;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000474 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000475 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000477 return NULL;
478 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000479 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000480 vx = v->ob_fval;
481 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000482 /* fmod is typically exact, so vx-mod is *mathemtically* an
483 exact multiple of wx. But this is fp arithmetic, and fp
484 vx - mod is an approximation; the result is that div may
485 not be an exact integral value after the division, although
486 it will always be very close to one.
487 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000488 div = (vx - mod) / wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000489 /* note: checking mod*wx < 0 is incorrect -- underflows to
490 0 if wx < sqrt(smallest nonzero double) */
491 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum15ecff41991-10-20 20:16:45 +0000492 mod += wx;
493 div -= 1.0;
494 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000495 /* snap quotient to nearest integral value */
496 floordiv = floor(div);
497 if (div - floordiv > 0.5)
498 floordiv += 1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000499 PyFPE_END_PROTECT(div)
Guido van Rossum9263e781999-05-06 14:26:34 +0000500 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000501}
502
Guido van Rossum363078a1996-05-24 20:45:01 +0000503static double powu(x, n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000504 double x;
505 long n;
506{
507 double r = 1.;
508 double p = x;
509 long mask = 1;
510 while (mask > 0 && n >= mask) {
511 if (n & mask)
512 r *= p;
513 mask <<= 1;
514 p *= p;
515 }
516 return r;
517}
518
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519static PyObject *
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000520float_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 PyFloatObject *v;
522 PyObject *w;
523 PyFloatObject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000524{
525 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000526 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000527 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
528 * The z parameter is really only going to be useful for integers and
529 * long integers. Maybe something clever with logarithms could be done.
530 * [AMK]
531 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000532 iv = v->ob_fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533 iw = ((PyFloatObject *)w)->ob_fval;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000534 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000535 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000536 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000537 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000538 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 if ((PyObject *)z!=Py_None) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000540 ix=fmod(1.0, z->ob_fval);
541 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
542 }
543 else ix=1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000544 PyFPE_END_PROTECT(ix)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 return PyFloat_FromDouble(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000546 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000547 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000548 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000549 if (intw > 0)
550 ix = powu(iv, intw);
551 else
552 ix = 1./powu(iv, -intw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000553 PyFPE_END_PROTECT(ix)
Guido van Rossum86c04c21996-08-09 20:50:14 +0000554 }
555 else {
556 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000557 if (iv == 0.0) {
558 if (iw < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000560 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000561 return NULL;
562 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 return PyFloat_FromDouble(0.0);
Guido van Rossum39739ea1996-01-12 01:22:56 +0000564 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000565 if (iv < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000567 "negative number to a float power");
568 return NULL;
569 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000570 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000571 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000572 ix = pow(iv, iw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000573 PyFPE_END_PROTECT(ix)
Guido van Rossum70d93461991-05-28 21:57:39 +0000574 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000575 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000576 if (errno != 0) {
577 /* XXX could it be another type of error? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 PyErr_SetFromErrno(PyExc_OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000579 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000580 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 if ((PyObject *)z!=Py_None) {
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000582 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000583 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
584 if ( ix!=0 &&
585 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
586 ix+=z->ob_fval;
587 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000588 PyFPE_END_PROTECT(ix)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000589 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000591}
592
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000594float_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000596{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000598}
599
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000600static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000601float_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000603{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 Py_INCREF(v);
605 return (PyObject *)v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000606}
607
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000609float_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 PyFloatObject *v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000611{
612 if (v->ob_fval < 0)
613 return float_neg(v);
614 else
615 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000616}
617
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000618static int
619float_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620 PyFloatObject *v;
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000621{
622 return v->ob_fval != 0.0;
623}
624
Guido van Rossum234f9421993-06-17 12:35:49 +0000625static int
Guido van Rossume6eefc21992-08-14 12:06:52 +0000626float_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627 PyObject **pv;
628 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000629{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 if (PyInt_Check(*pw)) {
631 long x = PyInt_AsLong(*pw);
632 *pw = PyFloat_FromDouble((double)x);
633 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000634 return 0;
635 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636 else if (PyLong_Check(*pw)) {
637 *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
638 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000639 return 0;
640 }
641 return 1; /* Can't do it */
642}
643
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000645float_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000647{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 double x = PyFloat_AsDouble(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000649 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
650 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651 PyErr_SetString(PyExc_OverflowError,
652 "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000653 return NULL;
654 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655 return PyInt_FromLong((long)x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000656}
657
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000659float_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000661{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662 double x = PyFloat_AsDouble(v);
663 return PyLong_FromDouble(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000664}
665
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000667float_float(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 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000671 return v;
672}
673
674
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675static PyNumberMethods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000676 (binaryfunc)float_add, /*nb_add*/
677 (binaryfunc)float_sub, /*nb_subtract*/
678 (binaryfunc)float_mul, /*nb_multiply*/
679 (binaryfunc)float_div, /*nb_divide*/
680 (binaryfunc)float_rem, /*nb_remainder*/
681 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000682 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000683 (unaryfunc)float_neg, /*nb_negative*/
684 (unaryfunc)float_pos, /*nb_positive*/
685 (unaryfunc)float_abs, /*nb_absolute*/
686 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000687 0, /*nb_invert*/
688 0, /*nb_lshift*/
689 0, /*nb_rshift*/
690 0, /*nb_and*/
691 0, /*nb_xor*/
692 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000693 (coercion)float_coerce, /*nb_coerce*/
694 (unaryfunc)float_int, /*nb_int*/
695 (unaryfunc)float_long, /*nb_long*/
696 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000697 0, /*nb_oct*/
698 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000699};
700
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701PyTypeObject PyFloat_Type = {
702 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000703 0,
704 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000706 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000707 (destructor)float_dealloc, /*tp_dealloc*/
708 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000709 0, /*tp_getattr*/
710 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000711 (cmpfunc)float_compare, /*tp_compare*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000712 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000713 &float_as_number, /*tp_as_number*/
714 0, /*tp_as_sequence*/
715 0, /*tp_as_mapping*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000716 (hashfunc)float_hash, /*tp_hash*/
717 0, /*tp_call*/
718 (reprfunc)float_str, /*tp_str*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000719};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000720
721void
722PyFloat_Fini()
723{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000724 PyFloatObject *p;
725 PyFloatBlock *list, *next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000726 int i;
727 int bc, bf; /* block count, number of freed blocks */
728 int frem, fsum; /* remaining unfreed floats per block, total */
729
730 bc = 0;
731 bf = 0;
732 fsum = 0;
733 list = block_list;
734 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000735 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000736 while (list != NULL) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000737 bc++;
738 frem = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000739 for (i = 0, p = &list->objects[0];
740 i < N_FLOATOBJECTS;
741 i++, p++) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000742 if (PyFloat_Check(p) && p->ob_refcnt != 0)
743 frem++;
744 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000745 next = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000746 if (frem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000747 list->next = block_list;
748 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000749 for (i = 0, p = &list->objects[0];
750 i < N_FLOATOBJECTS;
751 i++, p++) {
752 if (!PyFloat_Check(p) || p->ob_refcnt == 0) {
753 p->ob_type = (struct _typeobject *)
754 free_list;
755 free_list = p;
756 }
757 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000758 }
759 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000760 PyMem_FREE(list); /* XXX PyObject_FREE ??? */
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000761 bf++;
762 }
763 fsum += frem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000764 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000765 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000766 if (!Py_VerboseFlag)
767 return;
768 fprintf(stderr, "# cleanup floats");
769 if (!fsum) {
770 fprintf(stderr, "\n");
771 }
772 else {
773 fprintf(stderr,
774 ": %d unfreed float%s in %d out of %d block%s\n",
775 fsum, fsum == 1 ? "" : "s",
776 bc - bf, bc, bc == 1 ? "" : "s");
777 }
778 if (Py_VerboseFlag > 1) {
779 list = block_list;
780 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000781 for (i = 0, p = &list->objects[0];
782 i < N_FLOATOBJECTS;
783 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000784 if (PyFloat_Check(p) && p->ob_refcnt != 0) {
785 char buf[100];
786 PyFloat_AsString(buf, p);
787 fprintf(stderr,
Fred Drakea44d3532000-06-30 15:01:00 +0000788 "# <float at %p, refcnt=%d, val=%s>\n",
789 p, p->ob_refcnt, buf);
Guido van Rossum3fce8831999-03-12 19:43:17 +0000790 }
791 }
792 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000793 }
794 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000795}