blob: 26b39e89212e11a9d6bb2a2bbfeb1a428ee3e8f8 [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{
Tim Peters39dce292000-08-15 03:34:48 +0000329 return _Py_HashDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000330}
331
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000333float_add(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("add", 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_sub(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 PyFPE_START_PROTECT("subtract", return 0)
347 result = v->ob_fval - w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000348 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000350}
351
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000353float_mul(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000354{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000355 double result;
356
357 PyFPE_START_PROTECT("multiply", return 0)
358 result = v->ob_fval * w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000359 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000361}
362
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000364float_div(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000366 double result;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000367 if (w->ob_fval == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000369 return NULL;
370 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000371 PyFPE_START_PROTECT("divide", return 0)
372 result = v->ob_fval / w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000373 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375}
376
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000378float_rem(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000380 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000381 double mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000382 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000383 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 return NULL;
386 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000387 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000388 vx = v->ob_fval;
389 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000390 /* note: checking mod*wx < 0 is incorrect -- underflows to
391 0 if wx < sqrt(smallest nonzero double) */
392 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000393 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000394 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000395 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 return PyFloat_FromDouble(mod);
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_divmod(PyFloatObject *v, PyFloatObject *w)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000401{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000402 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000403 double div, mod, floordiv;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000404 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000405 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000407 return NULL;
408 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000409 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000410 vx = v->ob_fval;
411 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000412 /* fmod is typically exact, so vx-mod is *mathemtically* an
413 exact multiple of wx. But this is fp arithmetic, and fp
414 vx - mod is an approximation; the result is that div may
415 not be an exact integral value after the division, although
416 it will always be very close to one.
417 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000418 div = (vx - mod) / wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000419 /* note: checking mod*wx < 0 is incorrect -- underflows to
420 0 if wx < sqrt(smallest nonzero double) */
421 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum15ecff41991-10-20 20:16:45 +0000422 mod += wx;
423 div -= 1.0;
424 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000425 /* snap quotient to nearest integral value */
426 floordiv = floor(div);
427 if (div - floordiv > 0.5)
428 floordiv += 1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000429 PyFPE_END_PROTECT(div)
Guido van Rossum9263e781999-05-06 14:26:34 +0000430 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000431}
432
Fred Drakefd99de62000-07-09 05:02:18 +0000433static double powu(double x, long n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000434{
435 double r = 1.;
436 double p = x;
437 long mask = 1;
438 while (mask > 0 && n >= mask) {
439 if (n & mask)
440 r *= p;
441 mask <<= 1;
442 p *= p;
443 }
444 return r;
445}
446
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000448float_pow(PyFloatObject *v, PyObject *w, PyFloatObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449{
450 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000451 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000452 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
453 * The z parameter is really only going to be useful for integers and
454 * long integers. Maybe something clever with logarithms could be done.
455 * [AMK]
456 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000457 iv = v->ob_fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 iw = ((PyFloatObject *)w)->ob_fval;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000459 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000460 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000461 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000462 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000463 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464 if ((PyObject *)z!=Py_None) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000465 ix=fmod(1.0, z->ob_fval);
466 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
467 }
468 else ix=1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000469 PyFPE_END_PROTECT(ix)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 return PyFloat_FromDouble(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000471 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000472 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000473 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000474 if (intw > 0)
475 ix = powu(iv, intw);
476 else
477 ix = 1./powu(iv, -intw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000478 PyFPE_END_PROTECT(ix)
Guido van Rossum86c04c21996-08-09 20:50:14 +0000479 }
480 else {
481 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000482 if (iv == 0.0) {
483 if (iw < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000485 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000486 return NULL;
487 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 return PyFloat_FromDouble(0.0);
Guido van Rossum39739ea1996-01-12 01:22:56 +0000489 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000490 if (iv < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000492 "negative number to a float power");
493 return NULL;
494 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000495 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000496 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000497 ix = pow(iv, iw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000498 PyFPE_END_PROTECT(ix)
Guido van Rossum70d93461991-05-28 21:57:39 +0000499 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000500 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000501 if (errno != 0) {
502 /* XXX could it be another type of error? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503 PyErr_SetFromErrno(PyExc_OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000504 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000505 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 if ((PyObject *)z!=Py_None) {
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000507 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000508 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
509 if ( ix!=0 &&
510 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
511 ix+=z->ob_fval;
512 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000513 PyFPE_END_PROTECT(ix)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000514 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000516}
517
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000519float_neg(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000520{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522}
523
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000525float_pos(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000526{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 Py_INCREF(v);
528 return (PyObject *)v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000529}
530
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000532float_abs(PyFloatObject *v)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000533{
534 if (v->ob_fval < 0)
535 return float_neg(v);
536 else
537 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000538}
539
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000540static int
Fred Drakefd99de62000-07-09 05:02:18 +0000541float_nonzero(PyFloatObject *v)
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000542{
543 return v->ob_fval != 0.0;
544}
545
Guido van Rossum234f9421993-06-17 12:35:49 +0000546static int
Fred Drakefd99de62000-07-09 05:02:18 +0000547float_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +0000548{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 if (PyInt_Check(*pw)) {
550 long x = PyInt_AsLong(*pw);
551 *pw = PyFloat_FromDouble((double)x);
552 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000553 return 0;
554 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 else if (PyLong_Check(*pw)) {
556 *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
557 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000558 return 0;
559 }
560 return 1; /* Can't do it */
561}
562
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000564float_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000565{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 double x = PyFloat_AsDouble(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000567 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
568 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 PyErr_SetString(PyExc_OverflowError,
570 "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000571 return NULL;
572 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573 return PyInt_FromLong((long)x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000574}
575
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000577float_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000578{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 double x = PyFloat_AsDouble(v);
580 return PyLong_FromDouble(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000581}
582
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000583static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000584float_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000585{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000587 return v;
588}
589
590
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591static PyNumberMethods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000592 (binaryfunc)float_add, /*nb_add*/
593 (binaryfunc)float_sub, /*nb_subtract*/
594 (binaryfunc)float_mul, /*nb_multiply*/
595 (binaryfunc)float_div, /*nb_divide*/
596 (binaryfunc)float_rem, /*nb_remainder*/
597 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000598 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000599 (unaryfunc)float_neg, /*nb_negative*/
600 (unaryfunc)float_pos, /*nb_positive*/
601 (unaryfunc)float_abs, /*nb_absolute*/
602 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000603 0, /*nb_invert*/
604 0, /*nb_lshift*/
605 0, /*nb_rshift*/
606 0, /*nb_and*/
607 0, /*nb_xor*/
608 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000609 (coercion)float_coerce, /*nb_coerce*/
610 (unaryfunc)float_int, /*nb_int*/
611 (unaryfunc)float_long, /*nb_long*/
612 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000613 0, /*nb_oct*/
614 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000615};
616
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617PyTypeObject PyFloat_Type = {
618 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000619 0,
620 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000622 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000623 (destructor)float_dealloc, /*tp_dealloc*/
624 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000625 0, /*tp_getattr*/
626 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000627 (cmpfunc)float_compare, /*tp_compare*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000628 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000629 &float_as_number, /*tp_as_number*/
630 0, /*tp_as_sequence*/
631 0, /*tp_as_mapping*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000632 (hashfunc)float_hash, /*tp_hash*/
633 0, /*tp_call*/
634 (reprfunc)float_str, /*tp_str*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000635};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000636
637void
Fred Drakefd99de62000-07-09 05:02:18 +0000638PyFloat_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000639{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000640 PyFloatObject *p;
641 PyFloatBlock *list, *next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000642 int i;
643 int bc, bf; /* block count, number of freed blocks */
644 int frem, fsum; /* remaining unfreed floats per block, total */
645
646 bc = 0;
647 bf = 0;
648 fsum = 0;
649 list = block_list;
650 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000651 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000652 while (list != NULL) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000653 bc++;
654 frem = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000655 for (i = 0, p = &list->objects[0];
656 i < N_FLOATOBJECTS;
657 i++, p++) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000658 if (PyFloat_Check(p) && p->ob_refcnt != 0)
659 frem++;
660 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000661 next = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000662 if (frem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000663 list->next = block_list;
664 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000665 for (i = 0, p = &list->objects[0];
666 i < N_FLOATOBJECTS;
667 i++, p++) {
668 if (!PyFloat_Check(p) || p->ob_refcnt == 0) {
669 p->ob_type = (struct _typeobject *)
670 free_list;
671 free_list = p;
672 }
673 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000674 }
675 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000676 PyMem_FREE(list); /* XXX PyObject_FREE ??? */
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000677 bf++;
678 }
679 fsum += frem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000680 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000681 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000682 if (!Py_VerboseFlag)
683 return;
684 fprintf(stderr, "# cleanup floats");
685 if (!fsum) {
686 fprintf(stderr, "\n");
687 }
688 else {
689 fprintf(stderr,
690 ": %d unfreed float%s in %d out of %d block%s\n",
691 fsum, fsum == 1 ? "" : "s",
692 bc - bf, bc, bc == 1 ? "" : "s");
693 }
694 if (Py_VerboseFlag > 1) {
695 list = block_list;
696 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000697 for (i = 0, p = &list->objects[0];
698 i < N_FLOATOBJECTS;
699 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000700 if (PyFloat_Check(p) && p->ob_refcnt != 0) {
701 char buf[100];
702 PyFloat_AsString(buf, p);
703 fprintf(stderr,
Fred Drakea44d3532000-06-30 15:01:00 +0000704 "# <float at %p, refcnt=%d, val=%s>\n",
705 p, p->ob_refcnt, buf);
Guido van Rossum3fce8831999-03-12 19:43:17 +0000706 }
707 }
708 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000709 }
710 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000711}