blob: 774996f35787c55d3e8b1b252aa1078507a1f178 [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
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000120PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000121PyFloat_FromString(PyObject *v, char **pend)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000122{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000123 extern double strtod(const char *, char **);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000124 const char *s, *last, *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000125 double x;
126 char buffer[256]; /* For errors */
Barry Warsaw67c1a042000-08-18 05:00:03 +0000127 char s_buffer[256];
Guido van Rossum4c08d552000-03-10 22:55:18 +0000128 int len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000129
Guido van Rossum4c08d552000-03-10 22:55:18 +0000130 if (PyString_Check(v)) {
131 s = PyString_AS_STRING(v);
132 len = PyString_GET_SIZE(v);
133 }
Guido van Rossum9e896b32000-04-05 20:11:21 +0000134 else if (PyUnicode_Check(v)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000135 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
136 PyErr_SetString(PyExc_ValueError,
137 "float() literal too large to convert");
138 return NULL;
139 }
140 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
141 PyUnicode_GET_SIZE(v),
142 s_buffer,
143 NULL))
144 return NULL;
145 s = s_buffer;
Trent Micka248fb62000-08-12 21:37:39 +0000146 len = (int)strlen(s);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000147 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000148 else if (PyObject_AsCharBuffer(v, &s, &len)) {
149 PyErr_SetString(PyExc_TypeError,
150 "float() needs a string argument");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000151 return NULL;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000152 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000153
Guido van Rossum4c08d552000-03-10 22:55:18 +0000154 last = s + len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000155 while (*s && isspace(Py_CHARMASK(*s)))
156 s++;
157 if (s[0] == '\0') {
158 PyErr_SetString(PyExc_ValueError, "empty string for float()");
159 return NULL;
160 }
161 errno = 0;
162 PyFPE_START_PROTECT("PyFloat_FromString", return 0)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000163 x = strtod((char *)s, (char **)&end);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000164 PyFPE_END_PROTECT(x)
165 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
166 byte at the end of the string, when the input is inf(inity) */
167 if (end > last)
168 end = last;
169 while (*end && isspace(Py_CHARMASK(*end)))
170 end++;
171 if (*end != '\0') {
172 sprintf(buffer, "invalid literal for float(): %.200s", s);
173 PyErr_SetString(PyExc_ValueError, buffer);
174 return NULL;
175 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000176 else if (end != last) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000177 PyErr_SetString(PyExc_ValueError,
178 "null byte in argument for float()");
179 return NULL;
180 }
181 else if (errno != 0) {
182 sprintf(buffer, "float() literal too large: %.200s", s);
183 PyErr_SetString(PyExc_ValueError, buffer);
184 return NULL;
185 }
186 if (pend)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000187 *pend = (char *)end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000188 return PyFloat_FromDouble(x);
189}
190
Guido van Rossum234f9421993-06-17 12:35:49 +0000191static void
Fred Drakefd99de62000-07-09 05:02:18 +0000192float_dealloc(PyFloatObject *op)
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000193{
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000194 op->ob_type = (struct _typeobject *)free_list;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000195 free_list = op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000196}
197
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000198double
Fred Drakefd99de62000-07-09 05:02:18 +0000199PyFloat_AsDouble(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000201 PyNumberMethods *nb;
202 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000203 double val;
204
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 if (op && PyFloat_Check(op))
206 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000207
208 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
209 nb->nb_float == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211 return -1;
212 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000213
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000215 if (fo == NULL)
216 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 if (!PyFloat_Check(fo)) {
218 PyErr_SetString(PyExc_TypeError,
219 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000220 return -1;
221 }
222
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223 val = PyFloat_AS_DOUBLE(fo);
224 Py_DECREF(fo);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000225
226 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227}
228
229/* Methods */
230
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000231void
Fred Drakefd99de62000-07-09 05:02:18 +0000232PyFloat_AsStringEx(char *buf, PyFloatObject *v, int precision)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233{
234 register char *cp;
235 /* Subroutine for float_repr and float_print.
236 We want float numbers to be recognizable as such,
237 i.e., they should contain a decimal point or an exponent.
238 However, %g may print the number as an integer;
239 in such cases, we append ".0" to the string. */
Guido van Rossum57072eb1999-12-23 19:00:28 +0000240 sprintf(buf, "%.*g", precision, v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241 cp = buf;
242 if (*cp == '-')
243 cp++;
244 for (; *cp != '\0'; cp++) {
245 /* Any non-digit means it's not an integer;
246 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000247 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248 break;
249 }
250 if (*cp == '\0') {
251 *cp++ = '.';
252 *cp++ = '0';
253 *cp++ = '\0';
254 }
255}
256
Guido van Rossum57072eb1999-12-23 19:00:28 +0000257/* Precisions used by repr() and str(), respectively.
258
259 The repr() precision (17 significant decimal digits) is the minimal number
260 that is guaranteed to have enough precision so that if the number is read
261 back in the exact same binary value is recreated. This is true for IEEE
262 floating point by design, and also happens to work for all other modern
263 hardware.
264
265 The str() precision is chosen so that in most cases, the rounding noise
266 created by various operations is suppressed, while giving plenty of
267 precision for practical use.
268
269*/
270
271#define PREC_REPR 17
272#define PREC_STR 12
273
274void
Fred Drakefd99de62000-07-09 05:02:18 +0000275PyFloat_AsString(char *buf, PyFloatObject *v)
Guido van Rossum57072eb1999-12-23 19:00:28 +0000276{
277 PyFloat_AsStringEx(buf, v, PREC_STR);
278}
279
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000280/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000281static int
Fred Drakefd99de62000-07-09 05:02:18 +0000282float_print(PyFloatObject *v, FILE *fp, int flags)
283 /* flags -- not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284{
285 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000286 PyFloat_AsStringEx(buf, v, flags&Py_PRINT_RAW ? PREC_STR : PREC_REPR);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000288 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289}
290
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000291static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000292float_repr(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293{
294 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000295 PyFloat_AsStringEx(buf, v, PREC_REPR);
296 return PyString_FromString(buf);
297}
298
299static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000300float_str(PyFloatObject *v)
Guido van Rossum57072eb1999-12-23 19:00:28 +0000301{
302 char buf[100];
303 PyFloat_AsStringEx(buf, v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000304 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305}
306
307static int
Fred Drakefd99de62000-07-09 05:02:18 +0000308float_compare(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309{
310 double i = v->ob_fval;
311 double j = w->ob_fval;
312 return (i < j) ? -1 : (i > j) ? 1 : 0;
313}
314
Fred Drake13634cf2000-06-29 19:17:04 +0000315
Guido van Rossum9bfef441993-03-29 10:43:31 +0000316static long
Fred Drakefd99de62000-07-09 05:02:18 +0000317float_hash(PyFloatObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000318{
Tim Peters39dce292000-08-15 03:34:48 +0000319 return _Py_HashDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000320}
321
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000323float_add(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000325 double result;
326 PyFPE_START_PROTECT("add", return 0)
327 result = v->ob_fval + w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000328 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000329 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330}
331
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000333float_sub(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000335 double result;
336 PyFPE_START_PROTECT("subtract", return 0)
337 result = v->ob_fval - w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000338 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340}
341
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000343float_mul(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000344{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000345 double result;
346
347 PyFPE_START_PROTECT("multiply", return 0)
348 result = v->ob_fval * w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000349 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000351}
352
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000353static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000354float_div(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000356 double result;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000357 if (w->ob_fval == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000359 return NULL;
360 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000361 PyFPE_START_PROTECT("divide", return 0)
362 result = v->ob_fval / w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000363 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365}
366
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000367static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000368float_rem(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000369{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000370 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000371 double mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000372 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375 return NULL;
376 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000377 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000378 vx = v->ob_fval;
379 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000380 /* note: checking mod*wx < 0 is incorrect -- underflows to
381 0 if wx < sqrt(smallest nonzero double) */
382 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000383 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000384 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000385 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387}
388
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000389static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000390float_divmod(PyFloatObject *v, PyFloatObject *w)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000391{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000392 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000393 double div, mod, floordiv;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000394 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000395 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000397 return NULL;
398 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000399 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000400 vx = v->ob_fval;
401 mod = fmod(vx, wx);
Tim Peters78fc0b52000-09-16 03:54:24 +0000402 /* fmod is typically exact, so vx-mod is *mathematically* an
Guido van Rossum9263e781999-05-06 14:26:34 +0000403 exact multiple of wx. But this is fp arithmetic, and fp
404 vx - mod is an approximation; the result is that div may
405 not be an exact integral value after the division, although
406 it will always be very close to one.
407 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000408 div = (vx - mod) / wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000409 /* note: checking mod*wx < 0 is incorrect -- underflows to
410 0 if wx < sqrt(smallest nonzero double) */
411 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum15ecff41991-10-20 20:16:45 +0000412 mod += wx;
413 div -= 1.0;
414 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000415 /* snap quotient to nearest integral value */
416 floordiv = floor(div);
417 if (div - floordiv > 0.5)
418 floordiv += 1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000419 PyFPE_END_PROTECT(div)
Guido van Rossum9263e781999-05-06 14:26:34 +0000420 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000421}
422
Fred Drakefd99de62000-07-09 05:02:18 +0000423static double powu(double x, long n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000424{
425 double r = 1.;
426 double p = x;
427 long mask = 1;
428 while (mask > 0 && n >= mask) {
429 if (n & mask)
430 r *= p;
431 mask <<= 1;
432 p *= p;
433 }
434 return r;
435}
436
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000437static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000438float_pow(PyFloatObject *v, PyObject *w, PyFloatObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439{
440 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000441 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000442 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
443 * The z parameter is really only going to be useful for integers and
444 * long integers. Maybe something clever with logarithms could be done.
445 * [AMK]
446 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000447 iv = v->ob_fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 iw = ((PyFloatObject *)w)->ob_fval;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000449 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000450 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000451 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000452 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000453 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454 if ((PyObject *)z!=Py_None) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000455 ix=fmod(1.0, z->ob_fval);
456 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
457 }
458 else ix=1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000459 PyFPE_END_PROTECT(ix)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 return PyFloat_FromDouble(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000461 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000462 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000463 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000464 if (intw > 0)
465 ix = powu(iv, intw);
466 else
467 ix = 1./powu(iv, -intw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000468 PyFPE_END_PROTECT(ix)
Guido van Rossum86c04c21996-08-09 20:50:14 +0000469 }
470 else {
471 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000472 if (iv == 0.0) {
473 if (iw < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000475 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000476 return NULL;
477 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000478 return PyFloat_FromDouble(0.0);
Guido van Rossum39739ea1996-01-12 01:22:56 +0000479 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000480 if (iv < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000481 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000482 "negative number to a float power");
483 return NULL;
484 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000485 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000486 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000487 ix = pow(iv, iw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000488 PyFPE_END_PROTECT(ix)
Guido van Rossum70d93461991-05-28 21:57:39 +0000489 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000490 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000491 if (errno != 0) {
492 /* XXX could it be another type of error? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000493 PyErr_SetFromErrno(PyExc_OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000494 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000495 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 if ((PyObject *)z!=Py_None) {
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000497 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000498 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
499 if ( ix!=0 &&
500 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
501 ix+=z->ob_fval;
502 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000503 PyFPE_END_PROTECT(ix)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000504 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000505 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000506}
507
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000509float_neg(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000510{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512}
513
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000515float_pos(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000516{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 Py_INCREF(v);
518 return (PyObject *)v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000519}
520
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000522float_abs(PyFloatObject *v)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000523{
524 if (v->ob_fval < 0)
525 return float_neg(v);
526 else
527 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000528}
529
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000530static int
Fred Drakefd99de62000-07-09 05:02:18 +0000531float_nonzero(PyFloatObject *v)
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000532{
533 return v->ob_fval != 0.0;
534}
535
Guido van Rossum234f9421993-06-17 12:35:49 +0000536static int
Fred Drakefd99de62000-07-09 05:02:18 +0000537float_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +0000538{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 if (PyInt_Check(*pw)) {
540 long x = PyInt_AsLong(*pw);
541 *pw = PyFloat_FromDouble((double)x);
542 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000543 return 0;
544 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 else if (PyLong_Check(*pw)) {
546 *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
547 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000548 return 0;
549 }
550 return 1; /* Can't do it */
551}
552
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000554float_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000555{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 double x = PyFloat_AsDouble(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000557 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
558 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 PyErr_SetString(PyExc_OverflowError,
560 "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000561 return NULL;
562 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 return PyInt_FromLong((long)x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000564}
565
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000567float_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000568{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 double x = PyFloat_AsDouble(v);
570 return PyLong_FromDouble(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000571}
572
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000574float_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000575{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000577 return v;
578}
579
580
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581static PyNumberMethods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000582 (binaryfunc)float_add, /*nb_add*/
583 (binaryfunc)float_sub, /*nb_subtract*/
584 (binaryfunc)float_mul, /*nb_multiply*/
585 (binaryfunc)float_div, /*nb_divide*/
586 (binaryfunc)float_rem, /*nb_remainder*/
587 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000588 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000589 (unaryfunc)float_neg, /*nb_negative*/
590 (unaryfunc)float_pos, /*nb_positive*/
591 (unaryfunc)float_abs, /*nb_absolute*/
592 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000593 0, /*nb_invert*/
594 0, /*nb_lshift*/
595 0, /*nb_rshift*/
596 0, /*nb_and*/
597 0, /*nb_xor*/
598 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000599 (coercion)float_coerce, /*nb_coerce*/
600 (unaryfunc)float_int, /*nb_int*/
601 (unaryfunc)float_long, /*nb_long*/
602 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000603 0, /*nb_oct*/
604 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000605};
606
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607PyTypeObject PyFloat_Type = {
608 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000609 0,
610 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000612 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000613 (destructor)float_dealloc, /*tp_dealloc*/
614 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000615 0, /*tp_getattr*/
616 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000617 (cmpfunc)float_compare, /*tp_compare*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000618 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000619 &float_as_number, /*tp_as_number*/
620 0, /*tp_as_sequence*/
621 0, /*tp_as_mapping*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000622 (hashfunc)float_hash, /*tp_hash*/
623 0, /*tp_call*/
624 (reprfunc)float_str, /*tp_str*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000625};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000626
627void
Fred Drakefd99de62000-07-09 05:02:18 +0000628PyFloat_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000629{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000630 PyFloatObject *p;
631 PyFloatBlock *list, *next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000632 int i;
633 int bc, bf; /* block count, number of freed blocks */
634 int frem, fsum; /* remaining unfreed floats per block, total */
635
636 bc = 0;
637 bf = 0;
638 fsum = 0;
639 list = block_list;
640 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000641 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000642 while (list != NULL) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000643 bc++;
644 frem = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000645 for (i = 0, p = &list->objects[0];
646 i < N_FLOATOBJECTS;
647 i++, p++) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000648 if (PyFloat_Check(p) && p->ob_refcnt != 0)
649 frem++;
650 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000651 next = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000652 if (frem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000653 list->next = block_list;
654 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000655 for (i = 0, p = &list->objects[0];
656 i < N_FLOATOBJECTS;
657 i++, p++) {
658 if (!PyFloat_Check(p) || p->ob_refcnt == 0) {
659 p->ob_type = (struct _typeobject *)
660 free_list;
661 free_list = p;
662 }
663 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000664 }
665 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000666 PyMem_FREE(list); /* XXX PyObject_FREE ??? */
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000667 bf++;
668 }
669 fsum += frem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000670 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000671 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000672 if (!Py_VerboseFlag)
673 return;
674 fprintf(stderr, "# cleanup floats");
675 if (!fsum) {
676 fprintf(stderr, "\n");
677 }
678 else {
679 fprintf(stderr,
680 ": %d unfreed float%s in %d out of %d block%s\n",
681 fsum, fsum == 1 ? "" : "s",
682 bc - bf, bc, bc == 1 ? "" : "s");
683 }
684 if (Py_VerboseFlag > 1) {
685 list = block_list;
686 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000687 for (i = 0, p = &list->objects[0];
688 i < N_FLOATOBJECTS;
689 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000690 if (PyFloat_Check(p) && p->ob_refcnt != 0) {
691 char buf[100];
692 PyFloat_AsString(buf, p);
693 fprintf(stderr,
Fred Drakea44d3532000-06-30 15:01:00 +0000694 "# <float at %p, refcnt=%d, val=%s>\n",
695 p, p->ob_refcnt, buf);
Guido van Rossum3fce8831999-03-12 19:43:17 +0000696 }
697 }
698 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000699 }
700 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000701}