blob: 168cbcd0e8590719cad7e165068d0a2adc3cf0fa [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Float object implementation */
3
Guido van Rossum2a9096b1990-10-21 22:15:08 +00004/* XXX There should be overflow checks here, but it's hard to check
5 for any kind of float exception without losing portability. */
6
Guido van Rossumc0b618a1997-05-02 03:12:38 +00007#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008
Guido van Rossum3f5da241990-12-20 15:06:42 +00009#include <ctype.h>
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010
Guido van Rossum9575a441993-04-07 14:06:14 +000011#ifdef i860
12/* Cray APP has bogus definition of HUGE_VAL in <math.h> */
13#undef HUGE_VAL
14#endif
15
Guido van Rossum9d81b551996-06-26 18:27:19 +000016#if defined(HUGE_VAL) && !defined(CHECK)
Guido van Rossum7fa52f81991-12-16 15:43:14 +000017#define CHECK(x) if (errno != 0) ; \
18 else if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \
19 else errno = ERANGE
Guido van Rossum9d81b551996-06-26 18:27:19 +000020#endif
21
22#ifndef CHECK
Guido van Rossum7fa52f81991-12-16 15:43:14 +000023#define CHECK(x) /* Don't know how to check */
24#endif
25
Guido van Rossum03093a21994-09-28 15:51:32 +000026#ifdef HAVE_LIMITS_H
27#include <limits.h>
28#endif
29
30#ifndef LONG_MAX
Fred Drake13634cf2000-06-29 19:17:04 +000031#if SIZEOF_LONG == 4
Guido van Rossum03093a21994-09-28 15:51:32 +000032#define LONG_MAX 0X7FFFFFFFL
Fred Drake13634cf2000-06-29 19:17:04 +000033#elif SIZEOF_LONG == 8
34#define LONG_MAX 0X7FFFFFFFFFFFFFFFL
35#else
36#error "could not set LONG_MAX"
37#endif
Guido van Rossum03093a21994-09-28 15:51:32 +000038#endif
39
40#ifndef LONG_MIN
41#define LONG_MIN (-LONG_MAX-1)
42#endif
43
Guido van Rossum67ca7011995-02-13 16:38:41 +000044#ifdef __NeXT__
45#ifdef __sparc__
46/*
47 * This works around a bug in the NS/Sparc 3.3 pre-release
48 * limits.h header file.
49 * 10-Feb-1995 bwarsaw@cnri.reston.va.us
50 */
51#undef LONG_MIN
52#define LONG_MIN (-LONG_MAX-1)
53#endif
54#endif
55
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000056#if !defined(__STDC__) && !defined(macintosh)
Tim Petersdbd9ba62000-07-09 03:09:57 +000057extern double fmod(double, double);
58extern double pow(double, double);
Guido van Rossum6923e131990-11-02 17:50:43 +000059#endif
60
Guido van Rossum3c03fa81997-10-31 17:00:30 +000061#ifdef sun
62/* On SunOS4.1 only libm.a exists. Make sure that references to all
63 needed math functions exist in the executable, so that dynamic
64 loading of mathmodule does not fail. */
65double (*_Py_math_funcs_hack[])() = {
66 acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor,
67 fmod, log, log10, pow, sin, sinh, sqrt, tan, tanh
68};
69#endif
70
Guido van Rossum93ad0df1997-05-13 21:00:42 +000071/* Special free list -- see comments for same code in intobject.c. */
Guido van Rossum93ad0df1997-05-13 21:00:42 +000072#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000073#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
Guido van Rossumf61bbc81999-03-12 00:12:21 +000074#define N_FLOATOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyFloatObject))
Guido van Rossum3fce8831999-03-12 19:43:17 +000075
Guido van Rossum3fce8831999-03-12 19:43:17 +000076struct _floatblock {
77 struct _floatblock *next;
78 PyFloatObject objects[N_FLOATOBJECTS];
79};
80
81typedef struct _floatblock PyFloatBlock;
82
83static PyFloatBlock *block_list = NULL;
84static PyFloatObject *free_list = NULL;
85
Guido van Rossum93ad0df1997-05-13 21:00:42 +000086static PyFloatObject *
Fred Drakefd99de62000-07-09 05:02:18 +000087fill_free_list(void)
Guido van Rossum93ad0df1997-05-13 21:00:42 +000088{
89 PyFloatObject *p, *q;
Guido van Rossumb18618d2000-05-03 23:44:39 +000090 /* XXX Float blocks escape the object heap. Use PyObject_MALLOC ??? */
91 p = (PyFloatObject *) PyMem_MALLOC(sizeof(PyFloatBlock));
Guido van Rossum93ad0df1997-05-13 21:00:42 +000092 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +000093 return (PyFloatObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +000094 ((PyFloatBlock *)p)->next = block_list;
95 block_list = (PyFloatBlock *)p;
96 p = &((PyFloatBlock *)p)->objects[0];
Guido van Rossum93ad0df1997-05-13 21:00:42 +000097 q = p + N_FLOATOBJECTS;
98 while (--q > p)
Guido van Rossumf61bbc81999-03-12 00:12:21 +000099 q->ob_type = (struct _typeobject *)(q-1);
100 q->ob_type = NULL;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000101 return p + N_FLOATOBJECTS - 1;
102}
103
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000104PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105PyFloat_FromDouble(double fval)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106{
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000107 register PyFloatObject *op;
108 if (free_list == NULL) {
109 if ((free_list = fill_free_list()) == NULL)
110 return NULL;
111 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000112 /* PyObject_New is inlined */
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000113 op = free_list;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000114 free_list = (PyFloatObject *)op->ob_type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000115 PyObject_INIT(op, &PyFloat_Type);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000116 op->ob_fval = fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000117 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118}
119
Tim Petersef14d732000-09-23 03:39:17 +0000120/**************************************************************************
121RED_FLAG 22-Sep-2000 tim
122PyFloat_FromString's pend argument is braindead. Prior to this RED_FLAG,
123
1241. If v was a regular string, *pend was set to point to its terminating
125 null byte. That's useless (the caller can find that without any
126 help from this function!).
127
1282. If v was a Unicode string, or an object convertible to a character
129 buffer, *pend was set to point into stack trash (the auto temp
130 vector holding the character buffer). That was downright dangerous.
131
132Since we can't change the interface of a public API function, pend is
133still supported but now *officially* useless: if pend is not NULL,
134*pend is set to NULL.
135**************************************************************************/
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000136PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000137PyFloat_FromString(PyObject *v, char **pend)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000138{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000139 const char *s, *last, *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000140 double x;
Tim Petersef14d732000-09-23 03:39:17 +0000141 char buffer[256]; /* for errors */
142 char s_buffer[256]; /* for objects convertible to a char buffer */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000143 int len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000144
Tim Petersef14d732000-09-23 03:39:17 +0000145 if (pend)
146 *pend = NULL;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000147 if (PyString_Check(v)) {
148 s = PyString_AS_STRING(v);
149 len = PyString_GET_SIZE(v);
150 }
Guido van Rossum9e896b32000-04-05 20:11:21 +0000151 else if (PyUnicode_Check(v)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000152 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
153 PyErr_SetString(PyExc_ValueError,
Tim Petersef14d732000-09-23 03:39:17 +0000154 "Unicode float() literal too long to convert");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000155 return NULL;
156 }
Tim Petersef14d732000-09-23 03:39:17 +0000157 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000158 PyUnicode_GET_SIZE(v),
159 s_buffer,
160 NULL))
161 return NULL;
162 s = s_buffer;
Trent Micka248fb62000-08-12 21:37:39 +0000163 len = (int)strlen(s);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000164 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000165 else if (PyObject_AsCharBuffer(v, &s, &len)) {
166 PyErr_SetString(PyExc_TypeError,
167 "float() needs a string argument");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000168 return NULL;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000169 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000170
Guido van Rossum4c08d552000-03-10 22:55:18 +0000171 last = s + len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000172 while (*s && isspace(Py_CHARMASK(*s)))
173 s++;
Tim Petersef14d732000-09-23 03:39:17 +0000174 if (*s == '\0') {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000175 PyErr_SetString(PyExc_ValueError, "empty string for float()");
176 return NULL;
177 }
Tim Petersef14d732000-09-23 03:39:17 +0000178 /* We don't care about overflow or underflow. If the platform supports
179 * them, infinities and signed zeroes (on underflow) are fine.
180 * However, strtod can return 0 for denormalized numbers, where atof
181 * does not. So (alas!) we special-case a zero result. Note that
182 * whether strtod sets errno on underflow is not defined, so we can't
183 * key off errno.
184 */
185 x = strtod(s, (char **)&end);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000186 errno = 0;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000187 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
Tim Petersef14d732000-09-23 03:39:17 +0000188 byte at the end of the string, when the input is inf(inity). */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000189 if (end > last)
190 end = last;
Tim Petersef14d732000-09-23 03:39:17 +0000191 if (end == s) {
192 sprintf(buffer, "invalid literal for float(): %.200s", s);
193 PyErr_SetString(PyExc_ValueError, buffer);
194 return NULL;
195 }
196 /* Since end != s, the platform made *some* kind of sense out
197 of the input. Trust it. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000198 while (*end && isspace(Py_CHARMASK(*end)))
199 end++;
200 if (*end != '\0') {
201 sprintf(buffer, "invalid literal for float(): %.200s", s);
202 PyErr_SetString(PyExc_ValueError, buffer);
203 return NULL;
204 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000205 else if (end != last) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000206 PyErr_SetString(PyExc_ValueError,
207 "null byte in argument for float()");
208 return NULL;
209 }
Tim Petersef14d732000-09-23 03:39:17 +0000210 if (x == 0.0) {
211 /* See above -- may have been strtod being anal
212 about denorms. */
213 x = atof(s);
214 errno = 0; /* whether atof ever set errno is undefined */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000215 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000216 return PyFloat_FromDouble(x);
217}
218
Guido van Rossum234f9421993-06-17 12:35:49 +0000219static void
Fred Drakefd99de62000-07-09 05:02:18 +0000220float_dealloc(PyFloatObject *op)
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000221{
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000222 op->ob_type = (struct _typeobject *)free_list;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000223 free_list = op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000224}
225
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226double
Fred Drakefd99de62000-07-09 05:02:18 +0000227PyFloat_AsDouble(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000229 PyNumberMethods *nb;
230 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000231 double val;
232
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 if (op && PyFloat_Check(op))
234 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000235
236 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
237 nb->nb_float == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000238 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000239 return -1;
240 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000241
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000242 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000243 if (fo == NULL)
244 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000245 if (!PyFloat_Check(fo)) {
246 PyErr_SetString(PyExc_TypeError,
247 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000248 return -1;
249 }
250
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000251 val = PyFloat_AS_DOUBLE(fo);
252 Py_DECREF(fo);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000253
254 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000255}
256
257/* Methods */
258
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000259void
Fred Drakefd99de62000-07-09 05:02:18 +0000260PyFloat_AsStringEx(char *buf, PyFloatObject *v, int precision)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261{
262 register char *cp;
263 /* Subroutine for float_repr and float_print.
264 We want float numbers to be recognizable as such,
265 i.e., they should contain a decimal point or an exponent.
266 However, %g may print the number as an integer;
267 in such cases, we append ".0" to the string. */
Guido van Rossum57072eb1999-12-23 19:00:28 +0000268 sprintf(buf, "%.*g", precision, v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269 cp = buf;
270 if (*cp == '-')
271 cp++;
272 for (; *cp != '\0'; cp++) {
273 /* Any non-digit means it's not an integer;
274 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000275 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276 break;
277 }
278 if (*cp == '\0') {
279 *cp++ = '.';
280 *cp++ = '0';
281 *cp++ = '\0';
282 }
283}
284
Guido van Rossum57072eb1999-12-23 19:00:28 +0000285/* Precisions used by repr() and str(), respectively.
286
287 The repr() precision (17 significant decimal digits) is the minimal number
288 that is guaranteed to have enough precision so that if the number is read
289 back in the exact same binary value is recreated. This is true for IEEE
290 floating point by design, and also happens to work for all other modern
291 hardware.
292
293 The str() precision is chosen so that in most cases, the rounding noise
294 created by various operations is suppressed, while giving plenty of
295 precision for practical use.
296
297*/
298
299#define PREC_REPR 17
300#define PREC_STR 12
301
302void
Fred Drakefd99de62000-07-09 05:02:18 +0000303PyFloat_AsString(char *buf, PyFloatObject *v)
Guido van Rossum57072eb1999-12-23 19:00:28 +0000304{
305 PyFloat_AsStringEx(buf, v, PREC_STR);
306}
307
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000308/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000309static int
Fred Drakefd99de62000-07-09 05:02:18 +0000310float_print(PyFloatObject *v, FILE *fp, int flags)
311 /* 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 *
Fred Drakefd99de62000-07-09 05:02:18 +0000320float_repr(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 *
Fred Drakefd99de62000-07-09 05:02:18 +0000328float_str(PyFloatObject *v)
Guido van Rossum57072eb1999-12-23 19:00:28 +0000329{
330 char buf[100];
331 PyFloat_AsStringEx(buf, v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333}
334
335static int
Fred Drakefd99de62000-07-09 05:02:18 +0000336float_compare(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337{
338 double i = v->ob_fval;
339 double j = w->ob_fval;
340 return (i < j) ? -1 : (i > j) ? 1 : 0;
341}
342
Fred Drake13634cf2000-06-29 19:17:04 +0000343
Guido van Rossum9bfef441993-03-29 10:43:31 +0000344static long
Fred Drakefd99de62000-07-09 05:02:18 +0000345float_hash(PyFloatObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000346{
Tim Peters39dce292000-08-15 03:34:48 +0000347 return _Py_HashDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000348}
349
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000351float_add(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000352{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000353 double result;
354 PyFPE_START_PROTECT("add", return 0)
355 result = v->ob_fval + w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000356 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358}
359
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000361float_sub(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000363 double result;
364 PyFPE_START_PROTECT("subtract", return 0)
365 result = v->ob_fval - w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000366 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000367 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368}
369
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000371float_mul(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000372{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000373 double result;
374
375 PyFPE_START_PROTECT("multiply", return 0)
376 result = v->ob_fval * w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000377 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000378 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379}
380
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000381static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000382float_div(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000383{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000384 double result;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000385 if (w->ob_fval == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387 return NULL;
388 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000389 PyFPE_START_PROTECT("divide", return 0)
390 result = v->ob_fval / w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000391 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393}
394
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000395static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000396float_rem(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000398 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000399 double mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000400 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403 return NULL;
404 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000405 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000406 vx = v->ob_fval;
407 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000408 /* note: checking mod*wx < 0 is incorrect -- underflows to
409 0 if wx < sqrt(smallest nonzero double) */
410 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000411 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000412 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000413 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415}
416
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000418float_divmod(PyFloatObject *v, PyFloatObject *w)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000419{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000420 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000421 double div, mod, floordiv;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000422 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000423 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000425 return NULL;
426 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000427 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000428 vx = v->ob_fval;
429 mod = fmod(vx, wx);
Tim Peters78fc0b52000-09-16 03:54:24 +0000430 /* fmod is typically exact, so vx-mod is *mathematically* an
Guido van Rossum9263e781999-05-06 14:26:34 +0000431 exact multiple of wx. But this is fp arithmetic, and fp
432 vx - mod is an approximation; the result is that div may
433 not be an exact integral value after the division, although
434 it will always be very close to one.
435 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000436 div = (vx - mod) / wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000437 /* note: checking mod*wx < 0 is incorrect -- underflows to
438 0 if wx < sqrt(smallest nonzero double) */
439 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum15ecff41991-10-20 20:16:45 +0000440 mod += wx;
441 div -= 1.0;
442 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000443 /* snap quotient to nearest integral value */
444 floordiv = floor(div);
445 if (div - floordiv > 0.5)
446 floordiv += 1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000447 PyFPE_END_PROTECT(div)
Guido van Rossum9263e781999-05-06 14:26:34 +0000448 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000449}
450
Fred Drakefd99de62000-07-09 05:02:18 +0000451static double powu(double x, long n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000452{
453 double r = 1.;
454 double p = x;
455 long mask = 1;
456 while (mask > 0 && n >= mask) {
457 if (n & mask)
458 r *= p;
459 mask <<= 1;
460 p *= p;
461 }
462 return r;
463}
464
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000466float_pow(PyFloatObject *v, PyObject *w, PyFloatObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000467{
468 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000469 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000470 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
471 * The z parameter is really only going to be useful for integers and
472 * long integers. Maybe something clever with logarithms could be done.
473 * [AMK]
474 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000475 iv = v->ob_fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476 iw = ((PyFloatObject *)w)->ob_fval;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000477 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000478 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000479 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000480 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000481 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 if ((PyObject *)z!=Py_None) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000483 ix=fmod(1.0, z->ob_fval);
484 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
485 }
486 else ix=1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000487 PyFPE_END_PROTECT(ix)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 return PyFloat_FromDouble(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000489 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000490 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000491 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000492 if (intw > 0)
493 ix = powu(iv, intw);
494 else
495 ix = 1./powu(iv, -intw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000496 PyFPE_END_PROTECT(ix)
Guido van Rossum86c04c21996-08-09 20:50:14 +0000497 }
498 else {
499 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000500 if (iv == 0.0) {
501 if (iw < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000503 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000504 return NULL;
505 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 return PyFloat_FromDouble(0.0);
Guido van Rossum39739ea1996-01-12 01:22:56 +0000507 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000508 if (iv < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000509 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000510 "negative number to a float power");
511 return NULL;
512 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000513 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000514 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000515 ix = pow(iv, iw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000516 PyFPE_END_PROTECT(ix)
Guido van Rossum70d93461991-05-28 21:57:39 +0000517 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000518 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000519 if (errno != 0) {
520 /* XXX could it be another type of error? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 PyErr_SetFromErrno(PyExc_OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000523 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 if ((PyObject *)z!=Py_None) {
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000525 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000526 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
527 if ( ix!=0 &&
528 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
529 ix+=z->ob_fval;
530 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000531 PyFPE_END_PROTECT(ix)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000532 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000534}
535
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000536static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000537float_neg(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000538{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000540}
541
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000543float_pos(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000544{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 Py_INCREF(v);
546 return (PyObject *)v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000547}
548
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000550float_abs(PyFloatObject *v)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000551{
552 if (v->ob_fval < 0)
553 return float_neg(v);
554 else
555 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000556}
557
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000558static int
Fred Drakefd99de62000-07-09 05:02:18 +0000559float_nonzero(PyFloatObject *v)
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000560{
561 return v->ob_fval != 0.0;
562}
563
Guido van Rossum234f9421993-06-17 12:35:49 +0000564static int
Fred Drakefd99de62000-07-09 05:02:18 +0000565float_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +0000566{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 if (PyInt_Check(*pw)) {
568 long x = PyInt_AsLong(*pw);
569 *pw = PyFloat_FromDouble((double)x);
570 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000571 return 0;
572 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573 else if (PyLong_Check(*pw)) {
574 *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
575 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000576 return 0;
577 }
578 return 1; /* Can't do it */
579}
580
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000582float_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000583{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584 double x = PyFloat_AsDouble(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000585 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
586 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 PyErr_SetString(PyExc_OverflowError,
588 "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000589 return NULL;
590 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 return PyInt_FromLong((long)x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000592}
593
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000595float_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000596{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597 double x = PyFloat_AsDouble(v);
598 return PyLong_FromDouble(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000599}
600
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000602float_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000603{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000605 return v;
606}
607
608
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000609static PyNumberMethods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000610 (binaryfunc)float_add, /*nb_add*/
611 (binaryfunc)float_sub, /*nb_subtract*/
612 (binaryfunc)float_mul, /*nb_multiply*/
613 (binaryfunc)float_div, /*nb_divide*/
614 (binaryfunc)float_rem, /*nb_remainder*/
615 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000616 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000617 (unaryfunc)float_neg, /*nb_negative*/
618 (unaryfunc)float_pos, /*nb_positive*/
619 (unaryfunc)float_abs, /*nb_absolute*/
620 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000621 0, /*nb_invert*/
622 0, /*nb_lshift*/
623 0, /*nb_rshift*/
624 0, /*nb_and*/
625 0, /*nb_xor*/
626 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000627 (coercion)float_coerce, /*nb_coerce*/
628 (unaryfunc)float_int, /*nb_int*/
629 (unaryfunc)float_long, /*nb_long*/
630 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000631 0, /*nb_oct*/
632 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000633};
634
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635PyTypeObject PyFloat_Type = {
636 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000637 0,
638 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000640 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000641 (destructor)float_dealloc, /*tp_dealloc*/
642 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000643 0, /*tp_getattr*/
644 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000645 (cmpfunc)float_compare, /*tp_compare*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000646 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000647 &float_as_number, /*tp_as_number*/
648 0, /*tp_as_sequence*/
649 0, /*tp_as_mapping*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000650 (hashfunc)float_hash, /*tp_hash*/
651 0, /*tp_call*/
652 (reprfunc)float_str, /*tp_str*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000653};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000654
655void
Fred Drakefd99de62000-07-09 05:02:18 +0000656PyFloat_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000657{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000658 PyFloatObject *p;
659 PyFloatBlock *list, *next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000660 int i;
661 int bc, bf; /* block count, number of freed blocks */
662 int frem, fsum; /* remaining unfreed floats per block, total */
663
664 bc = 0;
665 bf = 0;
666 fsum = 0;
667 list = block_list;
668 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000669 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000670 while (list != NULL) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000671 bc++;
672 frem = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000673 for (i = 0, p = &list->objects[0];
674 i < N_FLOATOBJECTS;
675 i++, p++) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000676 if (PyFloat_Check(p) && p->ob_refcnt != 0)
677 frem++;
678 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000679 next = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000680 if (frem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000681 list->next = block_list;
682 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000683 for (i = 0, p = &list->objects[0];
684 i < N_FLOATOBJECTS;
685 i++, p++) {
686 if (!PyFloat_Check(p) || p->ob_refcnt == 0) {
687 p->ob_type = (struct _typeobject *)
688 free_list;
689 free_list = p;
690 }
691 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000692 }
693 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000694 PyMem_FREE(list); /* XXX PyObject_FREE ??? */
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000695 bf++;
696 }
697 fsum += frem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000698 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000699 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000700 if (!Py_VerboseFlag)
701 return;
702 fprintf(stderr, "# cleanup floats");
703 if (!fsum) {
704 fprintf(stderr, "\n");
705 }
706 else {
707 fprintf(stderr,
708 ": %d unfreed float%s in %d out of %d block%s\n",
709 fsum, fsum == 1 ? "" : "s",
710 bc - bf, bc, bc == 1 ? "" : "s");
711 }
712 if (Py_VerboseFlag > 1) {
713 list = block_list;
714 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000715 for (i = 0, p = &list->objects[0];
716 i < N_FLOATOBJECTS;
717 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000718 if (PyFloat_Check(p) && p->ob_refcnt != 0) {
719 char buf[100];
720 PyFloat_AsString(buf, p);
721 fprintf(stderr,
Fred Drakea44d3532000-06-30 15:01:00 +0000722 "# <float at %p, refcnt=%d, val=%s>\n",
723 p, p->ob_refcnt, buf);
Guido van Rossum3fce8831999-03-12 19:43:17 +0000724 }
725 }
726 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000727 }
728 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000729}