blob: 557a641761039b978c49058452eb801f1434540a [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Float object implementation */
33
Guido van Rossum2a9096b1990-10-21 22:15:08 +000034/* XXX There should be overflow checks here, but it's hard to check
35 for any kind of float exception without losing portability. */
36
Guido van Rossumc0b618a1997-05-02 03:12:38 +000037#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038
Guido van Rossum3f5da241990-12-20 15:06:42 +000039#include <ctype.h>
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000040#include "mymath.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041
Guido van Rossum9575a441993-04-07 14:06:14 +000042#ifdef i860
43/* Cray APP has bogus definition of HUGE_VAL in <math.h> */
44#undef HUGE_VAL
45#endif
46
Guido van Rossum9d81b551996-06-26 18:27:19 +000047#if defined(HUGE_VAL) && !defined(CHECK)
Guido van Rossum7fa52f81991-12-16 15:43:14 +000048#define CHECK(x) if (errno != 0) ; \
49 else if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \
50 else errno = ERANGE
Guido van Rossum9d81b551996-06-26 18:27:19 +000051#endif
52
53#ifndef CHECK
Guido van Rossum7fa52f81991-12-16 15:43:14 +000054#define CHECK(x) /* Don't know how to check */
55#endif
56
Guido van Rossum03093a21994-09-28 15:51:32 +000057#ifdef HAVE_LIMITS_H
58#include <limits.h>
59#endif
60
61#ifndef LONG_MAX
62#define LONG_MAX 0X7FFFFFFFL
63#endif
64
65#ifndef LONG_MIN
66#define LONG_MIN (-LONG_MAX-1)
67#endif
68
Guido van Rossum67ca7011995-02-13 16:38:41 +000069#ifdef __NeXT__
70#ifdef __sparc__
71/*
72 * This works around a bug in the NS/Sparc 3.3 pre-release
73 * limits.h header file.
74 * 10-Feb-1995 bwarsaw@cnri.reston.va.us
75 */
76#undef LONG_MIN
77#define LONG_MIN (-LONG_MAX-1)
78#endif
79#endif
80
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000081#if !defined(__STDC__) && !defined(macintosh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000082extern double fmod Py_PROTO((double, double));
83extern double pow Py_PROTO((double, double));
Guido van Rossum6923e131990-11-02 17:50:43 +000084#endif
85
Guido van Rossum3c03fa81997-10-31 17:00:30 +000086#ifdef sun
87/* On SunOS4.1 only libm.a exists. Make sure that references to all
88 needed math functions exist in the executable, so that dynamic
89 loading of mathmodule does not fail. */
90double (*_Py_math_funcs_hack[])() = {
91 acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor,
92 fmod, log, log10, pow, sin, sinh, sqrt, tan, tanh
93};
94#endif
95
Guido van Rossum93ad0df1997-05-13 21:00:42 +000096/* Special free list -- see comments for same code in intobject.c. */
Guido van Rossum93ad0df1997-05-13 21:00:42 +000097#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000098#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
Guido van Rossumf61bbc81999-03-12 00:12:21 +000099#define N_FLOATOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyFloatObject))
Guido van Rossum3fce8831999-03-12 19:43:17 +0000100
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000101#define PyMem_MALLOC malloc
102#define PyMem_FREE free
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000103
Guido van Rossum3fce8831999-03-12 19:43:17 +0000104struct _floatblock {
105 struct _floatblock *next;
106 PyFloatObject objects[N_FLOATOBJECTS];
107};
108
109typedef struct _floatblock PyFloatBlock;
110
111static PyFloatBlock *block_list = NULL;
112static PyFloatObject *free_list = NULL;
113
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000114static PyFloatObject *
115fill_free_list()
116{
117 PyFloatObject *p, *q;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000118 p = (PyFloatObject *)PyMem_MALLOC(sizeof(PyFloatBlock));
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000119 if (p == NULL)
120 return (PyFloatObject *)PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +0000121 ((PyFloatBlock *)p)->next = block_list;
122 block_list = (PyFloatBlock *)p;
123 p = &((PyFloatBlock *)p)->objects[0];
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000124 q = p + N_FLOATOBJECTS;
125 while (--q > p)
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000126 q->ob_type = (struct _typeobject *)(q-1);
127 q->ob_type = NULL;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000128 return p + N_FLOATOBJECTS - 1;
129}
130
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131PyObject *
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000132#ifdef __SC__
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133PyFloat_FromDouble(double fval)
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000134#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135PyFloat_FromDouble(fval)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136 double fval;
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000137#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138{
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000139 register PyFloatObject *op;
140 if (free_list == NULL) {
141 if ((free_list = fill_free_list()) == NULL)
142 return NULL;
143 }
144 op = free_list;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000145 free_list = (PyFloatObject *)op->ob_type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 op->ob_type = &PyFloat_Type;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000147 op->ob_fval = fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148 _Py_NewReference(op);
149 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150}
151
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000152PyObject *
153PyFloat_FromString(v, pend)
154 PyObject *v;
155 char **pend;
156{
157 extern double strtod Py_PROTO((const char *, char **));
158 char *s, *last, *end;
159 double x;
160 char buffer[256]; /* For errors */
161
162 if (!PyString_Check(v))
163 return NULL;
164 s = PyString_AS_STRING(v);
165
166 last = s + PyString_GET_SIZE(v);
167 while (*s && isspace(Py_CHARMASK(*s)))
168 s++;
169 if (s[0] == '\0') {
170 PyErr_SetString(PyExc_ValueError, "empty string for float()");
171 return NULL;
172 }
173 errno = 0;
174 PyFPE_START_PROTECT("PyFloat_FromString", return 0)
175 x = strtod(s, &end);
176 PyFPE_END_PROTECT(x)
177 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
178 byte at the end of the string, when the input is inf(inity) */
179 if (end > last)
180 end = last;
181 while (*end && isspace(Py_CHARMASK(*end)))
182 end++;
183 if (*end != '\0') {
184 sprintf(buffer, "invalid literal for float(): %.200s", s);
185 PyErr_SetString(PyExc_ValueError, buffer);
186 return NULL;
187 }
188 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
189 PyErr_SetString(PyExc_ValueError,
190 "null byte in argument for float()");
191 return NULL;
192 }
193 else if (errno != 0) {
194 sprintf(buffer, "float() literal too large: %.200s", s);
195 PyErr_SetString(PyExc_ValueError, buffer);
196 return NULL;
197 }
198 if (pend)
199 *pend = end;
200 return PyFloat_FromDouble(x);
201}
202
Guido van Rossum234f9421993-06-17 12:35:49 +0000203static void
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000204float_dealloc(op)
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000205 PyFloatObject *op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000206{
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000207 op->ob_type = (struct _typeobject *)free_list;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000208 free_list = op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000209}
210
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212PyFloat_AsDouble(op)
213 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 PyNumberMethods *nb;
216 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000217 double val;
218
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000219 if (op && PyFloat_Check(op))
220 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000221
222 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
223 nb->nb_float == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225 return -1;
226 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000227
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000229 if (fo == NULL)
230 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 if (!PyFloat_Check(fo)) {
232 PyErr_SetString(PyExc_TypeError,
233 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000234 return -1;
235 }
236
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 val = PyFloat_AS_DOUBLE(fo);
238 Py_DECREF(fo);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000239
240 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241}
242
243/* Methods */
244
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000245void
Guido van Rossum57072eb1999-12-23 19:00:28 +0000246PyFloat_AsStringEx(buf, v, precision)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247 char *buf;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000248 PyFloatObject *v;
Guido van Rossum57072eb1999-12-23 19:00:28 +0000249 int precision;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250{
251 register char *cp;
252 /* Subroutine for float_repr and float_print.
253 We want float numbers to be recognizable as such,
254 i.e., they should contain a decimal point or an exponent.
255 However, %g may print the number as an integer;
256 in such cases, we append ".0" to the string. */
Guido van Rossum57072eb1999-12-23 19:00:28 +0000257 sprintf(buf, "%.*g", precision, v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000258 cp = buf;
259 if (*cp == '-')
260 cp++;
261 for (; *cp != '\0'; cp++) {
262 /* Any non-digit means it's not an integer;
263 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000264 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265 break;
266 }
267 if (*cp == '\0') {
268 *cp++ = '.';
269 *cp++ = '0';
270 *cp++ = '\0';
271 }
272}
273
Guido van Rossum57072eb1999-12-23 19:00:28 +0000274/* Precisions used by repr() and str(), respectively.
275
276 The repr() precision (17 significant decimal digits) is the minimal number
277 that is guaranteed to have enough precision so that if the number is read
278 back in the exact same binary value is recreated. This is true for IEEE
279 floating point by design, and also happens to work for all other modern
280 hardware.
281
282 The str() precision is chosen so that in most cases, the rounding noise
283 created by various operations is suppressed, while giving plenty of
284 precision for practical use.
285
286*/
287
288#define PREC_REPR 17
289#define PREC_STR 12
290
291void
292PyFloat_AsString(buf, v)
293 char *buf;
294 PyFloatObject *v;
295{
296 PyFloat_AsStringEx(buf, v, PREC_STR);
297}
298
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000299/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000300static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301float_print(v, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303 FILE *fp;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000304 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305{
306 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000307 PyFloat_AsStringEx(buf, v, flags&Py_PRINT_RAW ? PREC_STR : PREC_REPR);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000309 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310}
311
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313float_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000314 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315{
316 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000317 PyFloat_AsStringEx(buf, v, PREC_REPR);
318 return PyString_FromString(buf);
319}
320
321static PyObject *
322float_str(v)
323 PyFloatObject *v;
324{
325 char buf[100];
326 PyFloat_AsStringEx(buf, v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000327 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328}
329
330static int
331float_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332 PyFloatObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333{
334 double i = v->ob_fval;
335 double j = w->ob_fval;
336 return (i < j) ? -1 : (i > j) ? 1 : 0;
337}
338
Guido van Rossum9bfef441993-03-29 10:43:31 +0000339static long
340float_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341 PyFloatObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000342{
343 double intpart, fractpart;
344 int expo;
345 long x;
346 /* This is designed so that Python numbers with the same
347 value hash to the same value, otherwise comparisons
348 of mapping keys will turn out weird */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000349
350#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
351{
352 extended e;
353 fractpart = modf(v->ob_fval, &e);
354 intpart = e;
355}
356#else
Guido van Rossum9bfef441993-03-29 10:43:31 +0000357 fractpart = modf(v->ob_fval, &intpart);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000358#endif
359
Guido van Rossum9bfef441993-03-29 10:43:31 +0000360 if (fractpart == 0.0) {
361 if (intpart > 0x7fffffffL || -intpart > 0x7fffffffL) {
362 /* Convert to long int and use its hash... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363 PyObject *w = PyLong_FromDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000364 if (w == NULL)
365 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 x = PyObject_Hash(w);
367 Py_DECREF(w);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000368 return x;
369 }
370 x = (long)intpart;
371 }
372 else {
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000373 /* Note -- if you change this code, also change the copy
374 in complexobject.c */
375 long hipart;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000376 fractpart = frexp(fractpart, &expo);
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000377 fractpart = fractpart * 2147483648.0; /* 2**31 */
378 hipart = (long)fractpart; /* Take the top 32 bits */
379 fractpart = (fractpart - (double)hipart) * 2147483648.0;
380 /* Get the next 32 bits */
381 x = hipart + (long)fractpart + (long)intpart + (expo << 15);
382 /* Combine everything */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000383 }
384 if (x == -1)
385 x = -2;
386 return x;
387}
388
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000389static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390float_add(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391 PyFloatObject *v;
392 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000394 double result;
395 PyFPE_START_PROTECT("add", return 0)
396 result = v->ob_fval + w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000397 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000399}
400
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000402float_sub(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 PyFloatObject *v;
404 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000405{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000406 double result;
407 PyFPE_START_PROTECT("subtract", return 0)
408 result = v->ob_fval - w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000409 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411}
412
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000414float_mul(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000415 PyFloatObject *v;
416 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000417{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000418 double result;
419
420 PyFPE_START_PROTECT("multiply", return 0)
421 result = v->ob_fval * w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000422 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424}
425
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000426static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427float_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428 PyFloatObject *v;
429 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000431 double result;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000432 if (w->ob_fval == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434 return NULL;
435 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000436 PyFPE_START_PROTECT("divide", return 0)
437 result = v->ob_fval / w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000438 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440}
441
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443float_rem(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 PyFloatObject *v;
445 PyFloatObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000447 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000448 double mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000449 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000450 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452 return NULL;
453 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000454 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000455 vx = v->ob_fval;
456 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000457 /* note: checking mod*wx < 0 is incorrect -- underflows to
458 0 if wx < sqrt(smallest nonzero double) */
459 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000460 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000461 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000462 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000463 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464}
465
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000467float_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000468 PyFloatObject *v;
469 PyFloatObject *w;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000470{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000471 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000472 double div, mod, floordiv;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000473 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000474 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000476 return NULL;
477 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000478 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000479 vx = v->ob_fval;
480 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000481 /* fmod is typically exact, so vx-mod is *mathemtically* an
482 exact multiple of wx. But this is fp arithmetic, and fp
483 vx - mod is an approximation; the result is that div may
484 not be an exact integral value after the division, although
485 it will always be very close to one.
486 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000487 div = (vx - mod) / wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000488 /* note: checking mod*wx < 0 is incorrect -- underflows to
489 0 if wx < sqrt(smallest nonzero double) */
490 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum15ecff41991-10-20 20:16:45 +0000491 mod += wx;
492 div -= 1.0;
493 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000494 /* snap quotient to nearest integral value */
495 floordiv = floor(div);
496 if (div - floordiv > 0.5)
497 floordiv += 1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000498 PyFPE_END_PROTECT(div)
Guido van Rossum9263e781999-05-06 14:26:34 +0000499 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000500}
501
Guido van Rossum363078a1996-05-24 20:45:01 +0000502static double powu(x, n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000503 double x;
504 long n;
505{
506 double r = 1.;
507 double p = x;
508 long mask = 1;
509 while (mask > 0 && n >= mask) {
510 if (n & mask)
511 r *= p;
512 mask <<= 1;
513 p *= p;
514 }
515 return r;
516}
517
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518static PyObject *
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000519float_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000520 PyFloatObject *v;
521 PyObject *w;
522 PyFloatObject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000523{
524 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000525 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000526 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
527 * The z parameter is really only going to be useful for integers and
528 * long integers. Maybe something clever with logarithms could be done.
529 * [AMK]
530 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000531 iv = v->ob_fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 iw = ((PyFloatObject *)w)->ob_fval;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000533 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000534 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000535 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000536 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000537 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538 if ((PyObject *)z!=Py_None) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000539 ix=fmod(1.0, z->ob_fval);
540 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
541 }
542 else ix=1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000543 PyFPE_END_PROTECT(ix)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544 return PyFloat_FromDouble(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000545 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000546 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000547 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000548 if (intw > 0)
549 ix = powu(iv, intw);
550 else
551 ix = 1./powu(iv, -intw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000552 PyFPE_END_PROTECT(ix)
Guido van Rossum86c04c21996-08-09 20:50:14 +0000553 }
554 else {
555 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000556 if (iv == 0.0) {
557 if (iw < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000559 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000560 return NULL;
561 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562 return PyFloat_FromDouble(0.0);
Guido van Rossum39739ea1996-01-12 01:22:56 +0000563 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000564 if (iv < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000565 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000566 "negative number to a float power");
567 return NULL;
568 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000569 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000570 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000571 ix = pow(iv, iw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000572 PyFPE_END_PROTECT(ix)
Guido van Rossum70d93461991-05-28 21:57:39 +0000573 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000574 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000575 if (errno != 0) {
576 /* XXX could it be another type of error? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 PyErr_SetFromErrno(PyExc_OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000578 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000579 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580 if ((PyObject *)z!=Py_None) {
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000581 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000582 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
583 if ( ix!=0 &&
584 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
585 ix+=z->ob_fval;
586 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000587 PyFPE_END_PROTECT(ix)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000588 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000590}
591
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000593float_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000595{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000597}
598
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000600float_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 PyFloatObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000602{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 Py_INCREF(v);
604 return (PyObject *)v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000605}
606
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607static PyObject *
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000608float_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000609 PyFloatObject *v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000610{
611 if (v->ob_fval < 0)
612 return float_neg(v);
613 else
614 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000615}
616
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000617static int
618float_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 PyFloatObject *v;
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000620{
621 return v->ob_fval != 0.0;
622}
623
Guido van Rossum234f9421993-06-17 12:35:49 +0000624static int
Guido van Rossume6eefc21992-08-14 12:06:52 +0000625float_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 PyObject **pv;
627 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000628{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 if (PyInt_Check(*pw)) {
630 long x = PyInt_AsLong(*pw);
631 *pw = PyFloat_FromDouble((double)x);
632 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000633 return 0;
634 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 else if (PyLong_Check(*pw)) {
636 *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
637 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000638 return 0;
639 }
640 return 1; /* Can't do it */
641}
642
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000644float_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000645 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000646{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647 double x = PyFloat_AsDouble(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000648 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
649 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650 PyErr_SetString(PyExc_OverflowError,
651 "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000652 return NULL;
653 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654 return PyInt_FromLong((long)x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000655}
656
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000657static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000658float_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000660{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 double x = PyFloat_AsDouble(v);
662 return PyLong_FromDouble(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000663}
664
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000666float_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000668{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000669 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000670 return v;
671}
672
673
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674static PyNumberMethods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000675 (binaryfunc)float_add, /*nb_add*/
676 (binaryfunc)float_sub, /*nb_subtract*/
677 (binaryfunc)float_mul, /*nb_multiply*/
678 (binaryfunc)float_div, /*nb_divide*/
679 (binaryfunc)float_rem, /*nb_remainder*/
680 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000681 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000682 (unaryfunc)float_neg, /*nb_negative*/
683 (unaryfunc)float_pos, /*nb_positive*/
684 (unaryfunc)float_abs, /*nb_absolute*/
685 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000686 0, /*nb_invert*/
687 0, /*nb_lshift*/
688 0, /*nb_rshift*/
689 0, /*nb_and*/
690 0, /*nb_xor*/
691 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000692 (coercion)float_coerce, /*nb_coerce*/
693 (unaryfunc)float_int, /*nb_int*/
694 (unaryfunc)float_long, /*nb_long*/
695 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000696 0, /*nb_oct*/
697 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000698};
699
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700PyTypeObject PyFloat_Type = {
701 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000702 0,
703 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000704 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000705 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000706 (destructor)float_dealloc, /*tp_dealloc*/
707 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000708 0, /*tp_getattr*/
709 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000710 (cmpfunc)float_compare, /*tp_compare*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000711 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000712 &float_as_number, /*tp_as_number*/
713 0, /*tp_as_sequence*/
714 0, /*tp_as_mapping*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000715 (hashfunc)float_hash, /*tp_hash*/
716 0, /*tp_call*/
717 (reprfunc)float_str, /*tp_str*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000718};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000719
720void
721PyFloat_Fini()
722{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000723 PyFloatObject *p;
724 PyFloatBlock *list, *next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000725 int i;
726 int bc, bf; /* block count, number of freed blocks */
727 int frem, fsum; /* remaining unfreed floats per block, total */
728
729 bc = 0;
730 bf = 0;
731 fsum = 0;
732 list = block_list;
733 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000734 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000735 while (list != NULL) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000736 bc++;
737 frem = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000738 for (i = 0, p = &list->objects[0];
739 i < N_FLOATOBJECTS;
740 i++, p++) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000741 if (PyFloat_Check(p) && p->ob_refcnt != 0)
742 frem++;
743 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000744 next = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000745 if (frem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000746 list->next = block_list;
747 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000748 for (i = 0, p = &list->objects[0];
749 i < N_FLOATOBJECTS;
750 i++, p++) {
751 if (!PyFloat_Check(p) || p->ob_refcnt == 0) {
752 p->ob_type = (struct _typeobject *)
753 free_list;
754 free_list = p;
755 }
756 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000757 }
758 else {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000759 PyMem_FREE(list);
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000760 bf++;
761 }
762 fsum += frem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000763 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000764 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000765 if (!Py_VerboseFlag)
766 return;
767 fprintf(stderr, "# cleanup floats");
768 if (!fsum) {
769 fprintf(stderr, "\n");
770 }
771 else {
772 fprintf(stderr,
773 ": %d unfreed float%s in %d out of %d block%s\n",
774 fsum, fsum == 1 ? "" : "s",
775 bc - bf, bc, bc == 1 ? "" : "s");
776 }
777 if (Py_VerboseFlag > 1) {
778 list = block_list;
779 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000780 for (i = 0, p = &list->objects[0];
781 i < N_FLOATOBJECTS;
782 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000783 if (PyFloat_Check(p) && p->ob_refcnt != 0) {
784 char buf[100];
785 PyFloat_AsString(buf, p);
786 fprintf(stderr,
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000787 "# <float at %lx, refcnt=%d, val=%s>\n",
Guido van Rossum3fce8831999-03-12 19:43:17 +0000788 p, p->ob_refcnt, buf);
789 }
790 }
791 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000792 }
793 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000794}