blob: 004cf5747aade49b06f8ab5fe7f576dbb48e84d8 [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 */
Tim Peters858346e2000-09-25 21:01:28 +0000185 PyFPE_START_PROTECT("strtod", return NULL)
Tim Petersef14d732000-09-23 03:39:17 +0000186 x = strtod(s, (char **)&end);
Tim Peters858346e2000-09-25 21:01:28 +0000187 PyFPE_END_PROTECT(x)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000188 errno = 0;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000189 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
Tim Petersef14d732000-09-23 03:39:17 +0000190 byte at the end of the string, when the input is inf(inity). */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000191 if (end > last)
192 end = last;
Tim Petersef14d732000-09-23 03:39:17 +0000193 if (end == s) {
194 sprintf(buffer, "invalid literal for float(): %.200s", s);
195 PyErr_SetString(PyExc_ValueError, buffer);
196 return NULL;
197 }
198 /* Since end != s, the platform made *some* kind of sense out
199 of the input. Trust it. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000200 while (*end && isspace(Py_CHARMASK(*end)))
201 end++;
202 if (*end != '\0') {
203 sprintf(buffer, "invalid literal for float(): %.200s", s);
204 PyErr_SetString(PyExc_ValueError, buffer);
205 return NULL;
206 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000207 else if (end != last) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000208 PyErr_SetString(PyExc_ValueError,
209 "null byte in argument for float()");
210 return NULL;
211 }
Tim Petersef14d732000-09-23 03:39:17 +0000212 if (x == 0.0) {
213 /* See above -- may have been strtod being anal
214 about denorms. */
Tim Peters858346e2000-09-25 21:01:28 +0000215 PyFPE_START_PROTECT("atof", return NULL)
Tim Petersef14d732000-09-23 03:39:17 +0000216 x = atof(s);
Tim Peters858346e2000-09-25 21:01:28 +0000217 PyFPE_END_PROTECT(x)
Tim Petersef14d732000-09-23 03:39:17 +0000218 errno = 0; /* whether atof ever set errno is undefined */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000219 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000220 return PyFloat_FromDouble(x);
221}
222
Guido van Rossum234f9421993-06-17 12:35:49 +0000223static void
Fred Drakefd99de62000-07-09 05:02:18 +0000224float_dealloc(PyFloatObject *op)
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000225{
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000226 op->ob_type = (struct _typeobject *)free_list;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000227 free_list = op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000228}
229
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230double
Fred Drakefd99de62000-07-09 05:02:18 +0000231PyFloat_AsDouble(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 PyNumberMethods *nb;
234 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000235 double val;
236
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 if (op && PyFloat_Check(op))
238 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000239
240 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
241 nb->nb_float == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000242 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243 return -1;
244 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000245
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000247 if (fo == NULL)
248 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000249 if (!PyFloat_Check(fo)) {
250 PyErr_SetString(PyExc_TypeError,
251 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252 return -1;
253 }
254
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000255 val = PyFloat_AS_DOUBLE(fo);
256 Py_DECREF(fo);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000257
258 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259}
260
261/* Methods */
262
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000263void
Fred Drakefd99de62000-07-09 05:02:18 +0000264PyFloat_AsStringEx(char *buf, PyFloatObject *v, int precision)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265{
266 register char *cp;
267 /* Subroutine for float_repr and float_print.
268 We want float numbers to be recognizable as such,
269 i.e., they should contain a decimal point or an exponent.
270 However, %g may print the number as an integer;
271 in such cases, we append ".0" to the string. */
Guido van Rossum57072eb1999-12-23 19:00:28 +0000272 sprintf(buf, "%.*g", precision, v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273 cp = buf;
274 if (*cp == '-')
275 cp++;
276 for (; *cp != '\0'; cp++) {
277 /* Any non-digit means it's not an integer;
278 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000279 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000280 break;
281 }
282 if (*cp == '\0') {
283 *cp++ = '.';
284 *cp++ = '0';
285 *cp++ = '\0';
286 }
287}
288
Guido van Rossum57072eb1999-12-23 19:00:28 +0000289/* Precisions used by repr() and str(), respectively.
290
291 The repr() precision (17 significant decimal digits) is the minimal number
292 that is guaranteed to have enough precision so that if the number is read
293 back in the exact same binary value is recreated. This is true for IEEE
294 floating point by design, and also happens to work for all other modern
295 hardware.
296
297 The str() precision is chosen so that in most cases, the rounding noise
298 created by various operations is suppressed, while giving plenty of
299 precision for practical use.
300
301*/
302
303#define PREC_REPR 17
304#define PREC_STR 12
305
306void
Fred Drakefd99de62000-07-09 05:02:18 +0000307PyFloat_AsString(char *buf, PyFloatObject *v)
Guido van Rossum57072eb1999-12-23 19:00:28 +0000308{
309 PyFloat_AsStringEx(buf, v, PREC_STR);
310}
311
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000312/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000313static int
Fred Drakefd99de62000-07-09 05:02:18 +0000314float_print(PyFloatObject *v, FILE *fp, int flags)
315 /* flags -- not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316{
317 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000318 PyFloat_AsStringEx(buf, v, flags&Py_PRINT_RAW ? PREC_STR : PREC_REPR);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000320 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321}
322
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000324float_repr(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325{
326 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000327 PyFloat_AsStringEx(buf, v, PREC_REPR);
328 return PyString_FromString(buf);
329}
330
331static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000332float_str(PyFloatObject *v)
Guido van Rossum57072eb1999-12-23 19:00:28 +0000333{
334 char buf[100];
335 PyFloat_AsStringEx(buf, v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000336 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337}
338
339static int
Fred Drakefd99de62000-07-09 05:02:18 +0000340float_compare(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341{
342 double i = v->ob_fval;
343 double j = w->ob_fval;
344 return (i < j) ? -1 : (i > j) ? 1 : 0;
345}
346
Fred Drake13634cf2000-06-29 19:17:04 +0000347
Guido van Rossum9bfef441993-03-29 10:43:31 +0000348static long
Fred Drakefd99de62000-07-09 05:02:18 +0000349float_hash(PyFloatObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000350{
Tim Peters39dce292000-08-15 03:34:48 +0000351 return _Py_HashDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000352}
353
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000355float_add(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000356{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000357 double result;
358 PyFPE_START_PROTECT("add", return 0)
359 result = v->ob_fval + w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000360 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362}
363
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000365float_sub(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000367 double result;
368 PyFPE_START_PROTECT("subtract", return 0)
369 result = v->ob_fval - w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000370 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000372}
373
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000375float_mul(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000377 double result;
378
379 PyFPE_START_PROTECT("multiply", return 0)
380 result = v->ob_fval * w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000381 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000383}
384
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000385static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000386float_div(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000388 double result;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000389 if (w->ob_fval == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391 return NULL;
392 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000393 PyFPE_START_PROTECT("divide", return 0)
394 result = v->ob_fval / w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000395 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397}
398
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000400float_rem(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000402 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000403 double mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000404 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000405 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407 return NULL;
408 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000409 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000410 vx = v->ob_fval;
411 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000412 /* note: checking mod*wx < 0 is incorrect -- underflows to
413 0 if wx < sqrt(smallest nonzero double) */
414 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000415 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000416 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000417 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000419}
420
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000422float_divmod(PyFloatObject *v, PyFloatObject *w)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000423{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000424 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000425 double div, mod, floordiv;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000426 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000427 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000429 return NULL;
430 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000431 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000432 vx = v->ob_fval;
433 mod = fmod(vx, wx);
Tim Peters78fc0b52000-09-16 03:54:24 +0000434 /* fmod is typically exact, so vx-mod is *mathematically* an
Guido van Rossum9263e781999-05-06 14:26:34 +0000435 exact multiple of wx. But this is fp arithmetic, and fp
436 vx - mod is an approximation; the result is that div may
437 not be an exact integral value after the division, although
438 it will always be very close to one.
439 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000440 div = (vx - mod) / wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000441 /* note: checking mod*wx < 0 is incorrect -- underflows to
442 0 if wx < sqrt(smallest nonzero double) */
443 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum15ecff41991-10-20 20:16:45 +0000444 mod += wx;
445 div -= 1.0;
446 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000447 /* snap quotient to nearest integral value */
448 floordiv = floor(div);
449 if (div - floordiv > 0.5)
450 floordiv += 1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000451 PyFPE_END_PROTECT(div)
Guido van Rossum9263e781999-05-06 14:26:34 +0000452 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000453}
454
Fred Drakefd99de62000-07-09 05:02:18 +0000455static double powu(double x, long n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000456{
457 double r = 1.;
458 double p = x;
459 long mask = 1;
460 while (mask > 0 && n >= mask) {
461 if (n & mask)
462 r *= p;
463 mask <<= 1;
464 p *= p;
465 }
466 return r;
467}
468
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000470float_pow(PyFloatObject *v, PyObject *w, PyFloatObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471{
472 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000473 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000474 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
475 * The z parameter is really only going to be useful for integers and
476 * long integers. Maybe something clever with logarithms could be done.
477 * [AMK]
478 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000479 iv = v->ob_fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 iw = ((PyFloatObject *)w)->ob_fval;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000481 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000482 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000483 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000484 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000485 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 if ((PyObject *)z!=Py_None) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000487 ix=fmod(1.0, z->ob_fval);
488 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
489 }
490 else ix=1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000491 PyFPE_END_PROTECT(ix)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 return PyFloat_FromDouble(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000493 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000494 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000495 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000496 if (intw > 0)
497 ix = powu(iv, intw);
498 else
499 ix = 1./powu(iv, -intw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000500 PyFPE_END_PROTECT(ix)
Guido van Rossum86c04c21996-08-09 20:50:14 +0000501 }
502 else {
503 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000504 if (iv == 0.0) {
505 if (iw < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000507 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000508 return NULL;
509 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 return PyFloat_FromDouble(0.0);
Guido van Rossum39739ea1996-01-12 01:22:56 +0000511 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000512 if (iv < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000514 "negative number to a float power");
515 return NULL;
516 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000517 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000518 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000519 ix = pow(iv, iw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000520 PyFPE_END_PROTECT(ix)
Guido van Rossum70d93461991-05-28 21:57:39 +0000521 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000522 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000523 if (errno != 0) {
524 /* XXX could it be another type of error? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 PyErr_SetFromErrno(PyExc_OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000526 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000527 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 if ((PyObject *)z!=Py_None) {
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000529 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000530 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
531 if ( ix!=0 &&
532 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
533 ix+=z->ob_fval;
534 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000535 PyFPE_END_PROTECT(ix)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000536 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000538}
539
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000541float_neg(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000542{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000544}
545
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000547float_pos(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000548{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 Py_INCREF(v);
550 return (PyObject *)v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000551}
552
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000554float_abs(PyFloatObject *v)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000555{
556 if (v->ob_fval < 0)
557 return float_neg(v);
558 else
559 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000560}
561
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000562static int
Fred Drakefd99de62000-07-09 05:02:18 +0000563float_nonzero(PyFloatObject *v)
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000564{
565 return v->ob_fval != 0.0;
566}
567
Guido van Rossum234f9421993-06-17 12:35:49 +0000568static int
Fred Drakefd99de62000-07-09 05:02:18 +0000569float_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +0000570{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000571 if (PyInt_Check(*pw)) {
572 long x = PyInt_AsLong(*pw);
573 *pw = PyFloat_FromDouble((double)x);
574 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000575 return 0;
576 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 else if (PyLong_Check(*pw)) {
578 *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
579 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000580 return 0;
581 }
582 return 1; /* Can't do it */
583}
584
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000586float_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000587{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 double x = PyFloat_AsDouble(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000589 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
590 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 PyErr_SetString(PyExc_OverflowError,
592 "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000593 return NULL;
594 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 return PyInt_FromLong((long)x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000596}
597
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000599float_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000600{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 double x = PyFloat_AsDouble(v);
602 return PyLong_FromDouble(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000603}
604
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000606float_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000607{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000609 return v;
610}
611
612
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613static PyNumberMethods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000614 (binaryfunc)float_add, /*nb_add*/
615 (binaryfunc)float_sub, /*nb_subtract*/
616 (binaryfunc)float_mul, /*nb_multiply*/
617 (binaryfunc)float_div, /*nb_divide*/
618 (binaryfunc)float_rem, /*nb_remainder*/
619 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000620 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000621 (unaryfunc)float_neg, /*nb_negative*/
622 (unaryfunc)float_pos, /*nb_positive*/
623 (unaryfunc)float_abs, /*nb_absolute*/
624 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000625 0, /*nb_invert*/
626 0, /*nb_lshift*/
627 0, /*nb_rshift*/
628 0, /*nb_and*/
629 0, /*nb_xor*/
630 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000631 (coercion)float_coerce, /*nb_coerce*/
632 (unaryfunc)float_int, /*nb_int*/
633 (unaryfunc)float_long, /*nb_long*/
634 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000635 0, /*nb_oct*/
636 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000637};
638
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639PyTypeObject PyFloat_Type = {
640 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000641 0,
642 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000644 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000645 (destructor)float_dealloc, /*tp_dealloc*/
646 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000647 0, /*tp_getattr*/
648 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000649 (cmpfunc)float_compare, /*tp_compare*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000650 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000651 &float_as_number, /*tp_as_number*/
652 0, /*tp_as_sequence*/
653 0, /*tp_as_mapping*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000654 (hashfunc)float_hash, /*tp_hash*/
655 0, /*tp_call*/
656 (reprfunc)float_str, /*tp_str*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000657};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000658
659void
Fred Drakefd99de62000-07-09 05:02:18 +0000660PyFloat_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000661{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000662 PyFloatObject *p;
663 PyFloatBlock *list, *next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000664 int i;
665 int bc, bf; /* block count, number of freed blocks */
666 int frem, fsum; /* remaining unfreed floats per block, total */
667
668 bc = 0;
669 bf = 0;
670 fsum = 0;
671 list = block_list;
672 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000673 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000674 while (list != NULL) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000675 bc++;
676 frem = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000677 for (i = 0, p = &list->objects[0];
678 i < N_FLOATOBJECTS;
679 i++, p++) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000680 if (PyFloat_Check(p) && p->ob_refcnt != 0)
681 frem++;
682 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000683 next = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000684 if (frem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000685 list->next = block_list;
686 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000687 for (i = 0, p = &list->objects[0];
688 i < N_FLOATOBJECTS;
689 i++, p++) {
690 if (!PyFloat_Check(p) || p->ob_refcnt == 0) {
691 p->ob_type = (struct _typeobject *)
692 free_list;
693 free_list = p;
694 }
695 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000696 }
697 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000698 PyMem_FREE(list); /* XXX PyObject_FREE ??? */
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000699 bf++;
700 }
701 fsum += frem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000702 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000703 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000704 if (!Py_VerboseFlag)
705 return;
706 fprintf(stderr, "# cleanup floats");
707 if (!fsum) {
708 fprintf(stderr, "\n");
709 }
710 else {
711 fprintf(stderr,
712 ": %d unfreed float%s in %d out of %d block%s\n",
713 fsum, fsum == 1 ? "" : "s",
714 bc - bf, bc, bc == 1 ? "" : "s");
715 }
716 if (Py_VerboseFlag > 1) {
717 list = block_list;
718 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000719 for (i = 0, p = &list->objects[0];
720 i < N_FLOATOBJECTS;
721 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000722 if (PyFloat_Check(p) && p->ob_refcnt != 0) {
723 char buf[100];
724 PyFloat_AsString(buf, p);
725 fprintf(stderr,
Fred Drakea44d3532000-06-30 15:01:00 +0000726 "# <float at %p, refcnt=%d, val=%s>\n",
727 p, p->ob_refcnt, buf);
Guido van Rossum3fce8831999-03-12 19:43:17 +0000728 }
729 }
730 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000731 }
732 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000733}