blob: 8182ae2ad8b05da54abb2293041044aab97c2639 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Float object implementation */
12
Guido van Rossum2a9096b1990-10-21 22:15:08 +000013/* XXX There should be overflow checks here, but it's hard to check
14 for any kind of float exception without losing portability. */
15
Guido van Rossumc0b618a1997-05-02 03:12:38 +000016#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017
Guido van Rossum3f5da241990-12-20 15:06:42 +000018#include <ctype.h>
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000019
Guido van Rossum9575a441993-04-07 14:06:14 +000020#ifdef i860
21/* Cray APP has bogus definition of HUGE_VAL in <math.h> */
22#undef HUGE_VAL
23#endif
24
Guido van Rossum9d81b551996-06-26 18:27:19 +000025#if defined(HUGE_VAL) && !defined(CHECK)
Guido van Rossum7fa52f81991-12-16 15:43:14 +000026#define CHECK(x) if (errno != 0) ; \
27 else if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \
28 else errno = ERANGE
Guido van Rossum9d81b551996-06-26 18:27:19 +000029#endif
30
31#ifndef CHECK
Guido van Rossum7fa52f81991-12-16 15:43:14 +000032#define CHECK(x) /* Don't know how to check */
33#endif
34
Guido van Rossum03093a21994-09-28 15:51:32 +000035#ifdef HAVE_LIMITS_H
36#include <limits.h>
37#endif
38
39#ifndef LONG_MAX
Fred Drake13634cf2000-06-29 19:17:04 +000040#if SIZEOF_LONG == 4
Guido van Rossum03093a21994-09-28 15:51:32 +000041#define LONG_MAX 0X7FFFFFFFL
Fred Drake13634cf2000-06-29 19:17:04 +000042#elif SIZEOF_LONG == 8
43#define LONG_MAX 0X7FFFFFFFFFFFFFFFL
44#else
45#error "could not set LONG_MAX"
46#endif
Guido van Rossum03093a21994-09-28 15:51:32 +000047#endif
48
49#ifndef LONG_MIN
50#define LONG_MIN (-LONG_MAX-1)
51#endif
52
Guido van Rossum67ca7011995-02-13 16:38:41 +000053#ifdef __NeXT__
54#ifdef __sparc__
55/*
56 * This works around a bug in the NS/Sparc 3.3 pre-release
57 * limits.h header file.
58 * 10-Feb-1995 bwarsaw@cnri.reston.va.us
59 */
60#undef LONG_MIN
61#define LONG_MIN (-LONG_MAX-1)
62#endif
63#endif
64
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000065#if !defined(__STDC__) && !defined(macintosh)
Tim Petersdbd9ba62000-07-09 03:09:57 +000066extern double fmod(double, double);
67extern double pow(double, double);
Guido van Rossum6923e131990-11-02 17:50:43 +000068#endif
69
Guido van Rossum3c03fa81997-10-31 17:00:30 +000070#ifdef sun
71/* On SunOS4.1 only libm.a exists. Make sure that references to all
72 needed math functions exist in the executable, so that dynamic
73 loading of mathmodule does not fail. */
74double (*_Py_math_funcs_hack[])() = {
75 acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor,
76 fmod, log, log10, pow, sin, sinh, sqrt, tan, tanh
77};
78#endif
79
Guido van Rossum93ad0df1997-05-13 21:00:42 +000080/* Special free list -- see comments for same code in intobject.c. */
Guido van Rossum93ad0df1997-05-13 21:00:42 +000081#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000082#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
Guido van Rossumf61bbc81999-03-12 00:12:21 +000083#define N_FLOATOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyFloatObject))
Guido van Rossum3fce8831999-03-12 19:43:17 +000084
Guido van Rossum3fce8831999-03-12 19:43:17 +000085struct _floatblock {
86 struct _floatblock *next;
87 PyFloatObject objects[N_FLOATOBJECTS];
88};
89
90typedef struct _floatblock PyFloatBlock;
91
92static PyFloatBlock *block_list = NULL;
93static PyFloatObject *free_list = NULL;
94
Guido van Rossum93ad0df1997-05-13 21:00:42 +000095static PyFloatObject *
Fred Drakefd99de62000-07-09 05:02:18 +000096fill_free_list(void)
Guido van Rossum93ad0df1997-05-13 21:00:42 +000097{
98 PyFloatObject *p, *q;
Guido van Rossumb18618d2000-05-03 23:44:39 +000099 /* XXX Float blocks escape the object heap. Use PyObject_MALLOC ??? */
100 p = (PyFloatObject *) PyMem_MALLOC(sizeof(PyFloatBlock));
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000101 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000102 return (PyFloatObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +0000103 ((PyFloatBlock *)p)->next = block_list;
104 block_list = (PyFloatBlock *)p;
105 p = &((PyFloatBlock *)p)->objects[0];
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000106 q = p + N_FLOATOBJECTS;
107 while (--q > p)
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000108 q->ob_type = (struct _typeobject *)(q-1);
109 q->ob_type = NULL;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000110 return p + N_FLOATOBJECTS - 1;
111}
112
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114PyFloat_FromDouble(double fval)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115{
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000116 register PyFloatObject *op;
117 if (free_list == NULL) {
118 if ((free_list = fill_free_list()) == NULL)
119 return NULL;
120 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000121 /* PyObject_New is inlined */
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000122 op = free_list;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000123 free_list = (PyFloatObject *)op->ob_type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000124 PyObject_INIT(op, &PyFloat_Type);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000125 op->ob_fval = fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127}
128
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000129PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000130PyFloat_FromString(PyObject *v, char **pend)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000131{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000132 extern double strtod(const char *, char **);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000133 const char *s, *last, *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000134 double x;
135 char buffer[256]; /* For errors */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000136 int len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000137
Guido van Rossum4c08d552000-03-10 22:55:18 +0000138 if (PyString_Check(v)) {
139 s = PyString_AS_STRING(v);
140 len = PyString_GET_SIZE(v);
141 }
Guido van Rossum9e896b32000-04-05 20:11:21 +0000142 else if (PyUnicode_Check(v)) {
143 char s_buffer[256];
144
145 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
146 PyErr_SetString(PyExc_ValueError,
147 "float() literal too large to convert");
148 return NULL;
149 }
150 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
151 PyUnicode_GET_SIZE(v),
152 s_buffer,
153 NULL))
154 return NULL;
155 s = s_buffer;
Trent Micka248fb62000-08-12 21:37:39 +0000156 len = (int)strlen(s);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000157 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000158 else if (PyObject_AsCharBuffer(v, &s, &len)) {
159 PyErr_SetString(PyExc_TypeError,
160 "float() needs a string argument");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000161 return NULL;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000162 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000163
Guido van Rossum4c08d552000-03-10 22:55:18 +0000164 last = s + len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000165 while (*s && isspace(Py_CHARMASK(*s)))
166 s++;
167 if (s[0] == '\0') {
168 PyErr_SetString(PyExc_ValueError, "empty string for float()");
169 return NULL;
170 }
171 errno = 0;
172 PyFPE_START_PROTECT("PyFloat_FromString", return 0)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000173 x = strtod((char *)s, (char **)&end);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000174 PyFPE_END_PROTECT(x)
175 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
176 byte at the end of the string, when the input is inf(inity) */
177 if (end > last)
178 end = last;
179 while (*end && isspace(Py_CHARMASK(*end)))
180 end++;
181 if (*end != '\0') {
182 sprintf(buffer, "invalid literal for float(): %.200s", s);
183 PyErr_SetString(PyExc_ValueError, buffer);
184 return NULL;
185 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000186 else if (end != last) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000187 PyErr_SetString(PyExc_ValueError,
188 "null byte in argument for float()");
189 return NULL;
190 }
191 else if (errno != 0) {
192 sprintf(buffer, "float() literal too large: %.200s", s);
193 PyErr_SetString(PyExc_ValueError, buffer);
194 return NULL;
195 }
196 if (pend)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000197 *pend = (char *)end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000198 return PyFloat_FromDouble(x);
199}
200
Guido van Rossum234f9421993-06-17 12:35:49 +0000201static void
Fred Drakefd99de62000-07-09 05:02:18 +0000202float_dealloc(PyFloatObject *op)
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000203{
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000204 op->ob_type = (struct _typeobject *)free_list;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000205 free_list = op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000206}
207
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208double
Fred Drakefd99de62000-07-09 05:02:18 +0000209PyFloat_AsDouble(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000211 PyNumberMethods *nb;
212 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000213 double val;
214
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 if (op && PyFloat_Check(op))
216 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000217
218 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
219 nb->nb_float == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000220 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221 return -1;
222 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000223
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000225 if (fo == NULL)
226 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 if (!PyFloat_Check(fo)) {
228 PyErr_SetString(PyExc_TypeError,
229 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000230 return -1;
231 }
232
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 val = PyFloat_AS_DOUBLE(fo);
234 Py_DECREF(fo);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000235
236 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237}
238
239/* Methods */
240
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000241void
Fred Drakefd99de62000-07-09 05:02:18 +0000242PyFloat_AsStringEx(char *buf, PyFloatObject *v, int precision)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243{
244 register char *cp;
245 /* Subroutine for float_repr and float_print.
246 We want float numbers to be recognizable as such,
247 i.e., they should contain a decimal point or an exponent.
248 However, %g may print the number as an integer;
249 in such cases, we append ".0" to the string. */
Guido van Rossum57072eb1999-12-23 19:00:28 +0000250 sprintf(buf, "%.*g", precision, v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251 cp = buf;
252 if (*cp == '-')
253 cp++;
254 for (; *cp != '\0'; cp++) {
255 /* Any non-digit means it's not an integer;
256 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000257 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000258 break;
259 }
260 if (*cp == '\0') {
261 *cp++ = '.';
262 *cp++ = '0';
263 *cp++ = '\0';
264 }
265}
266
Guido van Rossum57072eb1999-12-23 19:00:28 +0000267/* Precisions used by repr() and str(), respectively.
268
269 The repr() precision (17 significant decimal digits) is the minimal number
270 that is guaranteed to have enough precision so that if the number is read
271 back in the exact same binary value is recreated. This is true for IEEE
272 floating point by design, and also happens to work for all other modern
273 hardware.
274
275 The str() precision is chosen so that in most cases, the rounding noise
276 created by various operations is suppressed, while giving plenty of
277 precision for practical use.
278
279*/
280
281#define PREC_REPR 17
282#define PREC_STR 12
283
284void
Fred Drakefd99de62000-07-09 05:02:18 +0000285PyFloat_AsString(char *buf, PyFloatObject *v)
Guido van Rossum57072eb1999-12-23 19:00:28 +0000286{
287 PyFloat_AsStringEx(buf, v, PREC_STR);
288}
289
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000290/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000291static int
Fred Drakefd99de62000-07-09 05:02:18 +0000292float_print(PyFloatObject *v, FILE *fp, int flags)
293 /* flags -- not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294{
295 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000296 PyFloat_AsStringEx(buf, v, flags&Py_PRINT_RAW ? PREC_STR : PREC_REPR);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000298 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299}
300
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000302float_repr(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303{
304 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000305 PyFloat_AsStringEx(buf, v, PREC_REPR);
306 return PyString_FromString(buf);
307}
308
309static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000310float_str(PyFloatObject *v)
Guido van Rossum57072eb1999-12-23 19:00:28 +0000311{
312 char buf[100];
313 PyFloat_AsStringEx(buf, v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000314 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315}
316
317static int
Fred Drakefd99de62000-07-09 05:02:18 +0000318float_compare(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319{
320 double i = v->ob_fval;
321 double j = w->ob_fval;
322 return (i < j) ? -1 : (i > j) ? 1 : 0;
323}
324
Fred Drake13634cf2000-06-29 19:17:04 +0000325
Guido van Rossum9bfef441993-03-29 10:43:31 +0000326static long
Fred Drakefd99de62000-07-09 05:02:18 +0000327float_hash(PyFloatObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000328{
329 double intpart, fractpart;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000330 long x;
331 /* This is designed so that Python numbers with the same
332 value hash to the same value, otherwise comparisons
333 of mapping keys will turn out weird */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000334
335#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
336{
337 extended e;
338 fractpart = modf(v->ob_fval, &e);
339 intpart = e;
340}
341#else
Guido van Rossum9bfef441993-03-29 10:43:31 +0000342 fractpart = modf(v->ob_fval, &intpart);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000343#endif
344
Guido van Rossum9bfef441993-03-29 10:43:31 +0000345 if (fractpart == 0.0) {
Fred Drake13634cf2000-06-29 19:17:04 +0000346 if (intpart > LONG_MAX || -intpart > LONG_MAX) {
Guido van Rossum9bfef441993-03-29 10:43:31 +0000347 /* Convert to long int and use its hash... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 PyObject *w = PyLong_FromDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000349 if (w == NULL)
350 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351 x = PyObject_Hash(w);
352 Py_DECREF(w);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000353 return x;
354 }
355 x = (long)intpart;
356 }
357 else {
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000358 /* Note -- if you change this code, also change the copy
359 in complexobject.c */
Fred Drake13634cf2000-06-29 19:17:04 +0000360 x = _Py_HashDouble(v->ob_fval);
361 if (x == -1)
362 return -1;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000363 }
364 if (x == -1)
365 x = -2;
366 return x;
367}
368
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000370float_add(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000372 double result;
373 PyFPE_START_PROTECT("add", return 0)
374 result = v->ob_fval + w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000375 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000376 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000377}
378
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000379static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000380float_sub(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000381{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000382 double result;
383 PyFPE_START_PROTECT("subtract", return 0)
384 result = v->ob_fval - w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000385 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 return PyFloat_FromDouble(result);
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_mul(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000392 double result;
393
394 PyFPE_START_PROTECT("multiply", return 0)
395 result = v->ob_fval * w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000396 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000397 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398}
399
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000401float_div(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000402{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000403 double result;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000404 if (w->ob_fval == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000405 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406 return NULL;
407 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000408 PyFPE_START_PROTECT("divide", return 0)
409 result = v->ob_fval / w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000410 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000411 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412}
413
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000415float_rem(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000417 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000418 double mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000419 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422 return NULL;
423 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000424 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000425 vx = v->ob_fval;
426 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000427 /* note: checking mod*wx < 0 is incorrect -- underflows to
428 0 if wx < sqrt(smallest nonzero double) */
429 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000430 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000431 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000432 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434}
435
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000437float_divmod(PyFloatObject *v, PyFloatObject *w)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000438{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000439 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000440 double div, mod, floordiv;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000441 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000442 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000444 return NULL;
445 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000446 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000447 vx = v->ob_fval;
448 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000449 /* fmod is typically exact, so vx-mod is *mathemtically* an
450 exact multiple of wx. But this is fp arithmetic, and fp
451 vx - mod is an approximation; the result is that div may
452 not be an exact integral value after the division, although
453 it will always be very close to one.
454 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000455 div = (vx - mod) / wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000456 /* note: checking mod*wx < 0 is incorrect -- underflows to
457 0 if wx < sqrt(smallest nonzero double) */
458 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum15ecff41991-10-20 20:16:45 +0000459 mod += wx;
460 div -= 1.0;
461 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000462 /* snap quotient to nearest integral value */
463 floordiv = floor(div);
464 if (div - floordiv > 0.5)
465 floordiv += 1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000466 PyFPE_END_PROTECT(div)
Guido van Rossum9263e781999-05-06 14:26:34 +0000467 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000468}
469
Fred Drakefd99de62000-07-09 05:02:18 +0000470static double powu(double x, long n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000471{
472 double r = 1.;
473 double p = x;
474 long mask = 1;
475 while (mask > 0 && n >= mask) {
476 if (n & mask)
477 r *= p;
478 mask <<= 1;
479 p *= p;
480 }
481 return r;
482}
483
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000485float_pow(PyFloatObject *v, PyObject *w, PyFloatObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486{
487 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000488 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000489 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
490 * The z parameter is really only going to be useful for integers and
491 * long integers. Maybe something clever with logarithms could be done.
492 * [AMK]
493 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000494 iv = v->ob_fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495 iw = ((PyFloatObject *)w)->ob_fval;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000496 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000497 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000498 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000499 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000500 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000501 if ((PyObject *)z!=Py_None) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000502 ix=fmod(1.0, z->ob_fval);
503 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
504 }
505 else ix=1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000506 PyFPE_END_PROTECT(ix)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507 return PyFloat_FromDouble(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000508 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000509 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000510 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000511 if (intw > 0)
512 ix = powu(iv, intw);
513 else
514 ix = 1./powu(iv, -intw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000515 PyFPE_END_PROTECT(ix)
Guido van Rossum86c04c21996-08-09 20:50:14 +0000516 }
517 else {
518 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000519 if (iv == 0.0) {
520 if (iw < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000522 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000523 return NULL;
524 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 return PyFloat_FromDouble(0.0);
Guido van Rossum39739ea1996-01-12 01:22:56 +0000526 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000527 if (iv < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000529 "negative number to a float power");
530 return NULL;
531 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000532 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000533 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000534 ix = pow(iv, iw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000535 PyFPE_END_PROTECT(ix)
Guido van Rossum70d93461991-05-28 21:57:39 +0000536 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000537 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000538 if (errno != 0) {
539 /* XXX could it be another type of error? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540 PyErr_SetFromErrno(PyExc_OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000541 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000542 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 if ((PyObject *)z!=Py_None) {
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000544 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000545 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
546 if ( ix!=0 &&
547 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
548 ix+=z->ob_fval;
549 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000550 PyFPE_END_PROTECT(ix)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000551 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000552 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000553}
554
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000556float_neg(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000557{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000559}
560
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000562float_pos(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000564 Py_INCREF(v);
565 return (PyObject *)v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000566}
567
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000569float_abs(PyFloatObject *v)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000570{
571 if (v->ob_fval < 0)
572 return float_neg(v);
573 else
574 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000575}
576
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000577static int
Fred Drakefd99de62000-07-09 05:02:18 +0000578float_nonzero(PyFloatObject *v)
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000579{
580 return v->ob_fval != 0.0;
581}
582
Guido van Rossum234f9421993-06-17 12:35:49 +0000583static int
Fred Drakefd99de62000-07-09 05:02:18 +0000584float_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +0000585{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586 if (PyInt_Check(*pw)) {
587 long x = PyInt_AsLong(*pw);
588 *pw = PyFloat_FromDouble((double)x);
589 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000590 return 0;
591 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592 else if (PyLong_Check(*pw)) {
593 *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
594 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000595 return 0;
596 }
597 return 1; /* Can't do it */
598}
599
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000600static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000601float_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000602{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 double x = PyFloat_AsDouble(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000604 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
605 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 PyErr_SetString(PyExc_OverflowError,
607 "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000608 return NULL;
609 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 return PyInt_FromLong((long)x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000611}
612
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000614float_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000615{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 double x = PyFloat_AsDouble(v);
617 return PyLong_FromDouble(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000618}
619
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000621float_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000622{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000624 return v;
625}
626
627
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628static PyNumberMethods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000629 (binaryfunc)float_add, /*nb_add*/
630 (binaryfunc)float_sub, /*nb_subtract*/
631 (binaryfunc)float_mul, /*nb_multiply*/
632 (binaryfunc)float_div, /*nb_divide*/
633 (binaryfunc)float_rem, /*nb_remainder*/
634 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000635 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000636 (unaryfunc)float_neg, /*nb_negative*/
637 (unaryfunc)float_pos, /*nb_positive*/
638 (unaryfunc)float_abs, /*nb_absolute*/
639 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000640 0, /*nb_invert*/
641 0, /*nb_lshift*/
642 0, /*nb_rshift*/
643 0, /*nb_and*/
644 0, /*nb_xor*/
645 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000646 (coercion)float_coerce, /*nb_coerce*/
647 (unaryfunc)float_int, /*nb_int*/
648 (unaryfunc)float_long, /*nb_long*/
649 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000650 0, /*nb_oct*/
651 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000652};
653
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654PyTypeObject PyFloat_Type = {
655 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000656 0,
657 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000659 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000660 (destructor)float_dealloc, /*tp_dealloc*/
661 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000662 0, /*tp_getattr*/
663 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000664 (cmpfunc)float_compare, /*tp_compare*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000665 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000666 &float_as_number, /*tp_as_number*/
667 0, /*tp_as_sequence*/
668 0, /*tp_as_mapping*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000669 (hashfunc)float_hash, /*tp_hash*/
670 0, /*tp_call*/
671 (reprfunc)float_str, /*tp_str*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000672};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000673
674void
Fred Drakefd99de62000-07-09 05:02:18 +0000675PyFloat_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000676{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000677 PyFloatObject *p;
678 PyFloatBlock *list, *next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000679 int i;
680 int bc, bf; /* block count, number of freed blocks */
681 int frem, fsum; /* remaining unfreed floats per block, total */
682
683 bc = 0;
684 bf = 0;
685 fsum = 0;
686 list = block_list;
687 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000688 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000689 while (list != NULL) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000690 bc++;
691 frem = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000692 for (i = 0, p = &list->objects[0];
693 i < N_FLOATOBJECTS;
694 i++, p++) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000695 if (PyFloat_Check(p) && p->ob_refcnt != 0)
696 frem++;
697 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000698 next = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000699 if (frem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000700 list->next = block_list;
701 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000702 for (i = 0, p = &list->objects[0];
703 i < N_FLOATOBJECTS;
704 i++, p++) {
705 if (!PyFloat_Check(p) || p->ob_refcnt == 0) {
706 p->ob_type = (struct _typeobject *)
707 free_list;
708 free_list = p;
709 }
710 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000711 }
712 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000713 PyMem_FREE(list); /* XXX PyObject_FREE ??? */
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000714 bf++;
715 }
716 fsum += frem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000717 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000718 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000719 if (!Py_VerboseFlag)
720 return;
721 fprintf(stderr, "# cleanup floats");
722 if (!fsum) {
723 fprintf(stderr, "\n");
724 }
725 else {
726 fprintf(stderr,
727 ": %d unfreed float%s in %d out of %d block%s\n",
728 fsum, fsum == 1 ? "" : "s",
729 bc - bf, bc, bc == 1 ? "" : "s");
730 }
731 if (Py_VerboseFlag > 1) {
732 list = block_list;
733 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000734 for (i = 0, p = &list->objects[0];
735 i < N_FLOATOBJECTS;
736 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000737 if (PyFloat_Check(p) && p->ob_refcnt != 0) {
738 char buf[100];
739 PyFloat_AsString(buf, p);
740 fprintf(stderr,
Fred Drakea44d3532000-06-30 15:01:00 +0000741 "# <float at %p, refcnt=%d, val=%s>\n",
742 p, p->ob_refcnt, buf);
Guido van Rossum3fce8831999-03-12 19:43:17 +0000743 }
744 }
745 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000746 }
747 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000748}