blob: 0e837f711bcddf3ed68db351a4457be4172df309 [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 Rossum07e3a7e1995-02-27 10:13:37 +000019#include "mymath.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000020
Guido van Rossum9575a441993-04-07 14:06:14 +000021#ifdef i860
22/* Cray APP has bogus definition of HUGE_VAL in <math.h> */
23#undef HUGE_VAL
24#endif
25
Guido van Rossum9d81b551996-06-26 18:27:19 +000026#if defined(HUGE_VAL) && !defined(CHECK)
Guido van Rossum7fa52f81991-12-16 15:43:14 +000027#define CHECK(x) if (errno != 0) ; \
28 else if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \
29 else errno = ERANGE
Guido van Rossum9d81b551996-06-26 18:27:19 +000030#endif
31
32#ifndef CHECK
Guido van Rossum7fa52f81991-12-16 15:43:14 +000033#define CHECK(x) /* Don't know how to check */
34#endif
35
Guido van Rossum03093a21994-09-28 15:51:32 +000036#ifdef HAVE_LIMITS_H
37#include <limits.h>
38#endif
39
40#ifndef LONG_MAX
Fred Drake13634cf2000-06-29 19:17:04 +000041#if SIZEOF_LONG == 4
Guido van Rossum03093a21994-09-28 15:51:32 +000042#define LONG_MAX 0X7FFFFFFFL
Fred Drake13634cf2000-06-29 19:17:04 +000043#elif SIZEOF_LONG == 8
44#define LONG_MAX 0X7FFFFFFFFFFFFFFFL
45#else
46#error "could not set LONG_MAX"
47#endif
Guido van Rossum03093a21994-09-28 15:51:32 +000048#endif
49
50#ifndef LONG_MIN
51#define LONG_MIN (-LONG_MAX-1)
52#endif
53
Guido van Rossum67ca7011995-02-13 16:38:41 +000054#ifdef __NeXT__
55#ifdef __sparc__
56/*
57 * This works around a bug in the NS/Sparc 3.3 pre-release
58 * limits.h header file.
59 * 10-Feb-1995 bwarsaw@cnri.reston.va.us
60 */
61#undef LONG_MIN
62#define LONG_MIN (-LONG_MAX-1)
63#endif
64#endif
65
Guido van Rossum07e3a7e1995-02-27 10:13:37 +000066#if !defined(__STDC__) && !defined(macintosh)
Tim Petersdbd9ba62000-07-09 03:09:57 +000067extern double fmod(double, double);
68extern double pow(double, double);
Guido van Rossum6923e131990-11-02 17:50:43 +000069#endif
70
Guido van Rossum3c03fa81997-10-31 17:00:30 +000071#ifdef sun
72/* On SunOS4.1 only libm.a exists. Make sure that references to all
73 needed math functions exist in the executable, so that dynamic
74 loading of mathmodule does not fail. */
75double (*_Py_math_funcs_hack[])() = {
76 acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor,
77 fmod, log, log10, pow, sin, sinh, sqrt, tan, tanh
78};
79#endif
80
Guido van Rossum93ad0df1997-05-13 21:00:42 +000081/* Special free list -- see comments for same code in intobject.c. */
Guido van Rossum93ad0df1997-05-13 21:00:42 +000082#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000083#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
Guido van Rossumf61bbc81999-03-12 00:12:21 +000084#define N_FLOATOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyFloatObject))
Guido van Rossum3fce8831999-03-12 19:43:17 +000085
Guido van Rossum3fce8831999-03-12 19:43:17 +000086struct _floatblock {
87 struct _floatblock *next;
88 PyFloatObject objects[N_FLOATOBJECTS];
89};
90
91typedef struct _floatblock PyFloatBlock;
92
93static PyFloatBlock *block_list = NULL;
94static PyFloatObject *free_list = NULL;
95
Guido van Rossum93ad0df1997-05-13 21:00:42 +000096static PyFloatObject *
Fred Drakefd99de62000-07-09 05:02:18 +000097fill_free_list(void)
Guido van Rossum93ad0df1997-05-13 21:00:42 +000098{
99 PyFloatObject *p, *q;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000100 /* XXX Float blocks escape the object heap. Use PyObject_MALLOC ??? */
101 p = (PyFloatObject *) PyMem_MALLOC(sizeof(PyFloatBlock));
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000102 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000103 return (PyFloatObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +0000104 ((PyFloatBlock *)p)->next = block_list;
105 block_list = (PyFloatBlock *)p;
106 p = &((PyFloatBlock *)p)->objects[0];
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000107 q = p + N_FLOATOBJECTS;
108 while (--q > p)
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000109 q->ob_type = (struct _typeobject *)(q-1);
110 q->ob_type = NULL;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000111 return p + N_FLOATOBJECTS - 1;
112}
113
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114PyObject *
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000115#ifdef __SC__
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116PyFloat_FromDouble(double fval)
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000117#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118PyFloat_FromDouble(fval)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119 double fval;
Guido van Rossum07e3a7e1995-02-27 10:13:37 +0000120#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121{
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000122 register PyFloatObject *op;
123 if (free_list == NULL) {
124 if ((free_list = fill_free_list()) == NULL)
125 return NULL;
126 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000127 /* PyObject_New is inlined */
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000128 op = free_list;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000129 free_list = (PyFloatObject *)op->ob_type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000130 PyObject_INIT(op, &PyFloat_Type);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000131 op->ob_fval = fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133}
134
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000135PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000136PyFloat_FromString(PyObject *v, char **pend)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000137{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000138 extern double strtod(const char *, char **);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000139 const char *s, *last, *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000140 double x;
141 char buffer[256]; /* For errors */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000142 int len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000143
Guido van Rossum4c08d552000-03-10 22:55:18 +0000144 if (PyString_Check(v)) {
145 s = PyString_AS_STRING(v);
146 len = PyString_GET_SIZE(v);
147 }
Guido van Rossum9e896b32000-04-05 20:11:21 +0000148 else if (PyUnicode_Check(v)) {
149 char s_buffer[256];
150
151 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
152 PyErr_SetString(PyExc_ValueError,
153 "float() literal too large to convert");
154 return NULL;
155 }
156 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
157 PyUnicode_GET_SIZE(v),
158 s_buffer,
159 NULL))
160 return NULL;
161 s = s_buffer;
162 len = strlen(s);
163 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000164 else if (PyObject_AsCharBuffer(v, &s, &len)) {
165 PyErr_SetString(PyExc_TypeError,
166 "float() needs a string argument");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000167 return NULL;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000168 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000169
Guido van Rossum4c08d552000-03-10 22:55:18 +0000170 last = s + len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000171 while (*s && isspace(Py_CHARMASK(*s)))
172 s++;
173 if (s[0] == '\0') {
174 PyErr_SetString(PyExc_ValueError, "empty string for float()");
175 return NULL;
176 }
177 errno = 0;
178 PyFPE_START_PROTECT("PyFloat_FromString", return 0)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000179 x = strtod((char *)s, (char **)&end);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000180 PyFPE_END_PROTECT(x)
181 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
182 byte at the end of the string, when the input is inf(inity) */
183 if (end > last)
184 end = last;
185 while (*end && isspace(Py_CHARMASK(*end)))
186 end++;
187 if (*end != '\0') {
188 sprintf(buffer, "invalid literal for float(): %.200s", s);
189 PyErr_SetString(PyExc_ValueError, buffer);
190 return NULL;
191 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000192 else if (end != last) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000193 PyErr_SetString(PyExc_ValueError,
194 "null byte in argument for float()");
195 return NULL;
196 }
197 else if (errno != 0) {
198 sprintf(buffer, "float() literal too large: %.200s", s);
199 PyErr_SetString(PyExc_ValueError, buffer);
200 return NULL;
201 }
202 if (pend)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000203 *pend = (char *)end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000204 return PyFloat_FromDouble(x);
205}
206
Guido van Rossum234f9421993-06-17 12:35:49 +0000207static void
Fred Drakefd99de62000-07-09 05:02:18 +0000208float_dealloc(PyFloatObject *op)
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000209{
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000210 op->ob_type = (struct _typeobject *)free_list;
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000211 free_list = op;
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000212}
213
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214double
Fred Drakefd99de62000-07-09 05:02:18 +0000215PyFloat_AsDouble(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 PyNumberMethods *nb;
218 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000219 double val;
220
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 if (op && PyFloat_Check(op))
222 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000223
224 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
225 nb->nb_float == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227 return -1;
228 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000229
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000231 if (fo == NULL)
232 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 if (!PyFloat_Check(fo)) {
234 PyErr_SetString(PyExc_TypeError,
235 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000236 return -1;
237 }
238
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239 val = PyFloat_AS_DOUBLE(fo);
240 Py_DECREF(fo);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000241
242 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243}
244
245/* Methods */
246
Guido van Rossum27dec7e1991-06-04 19:42:53 +0000247void
Fred Drakefd99de62000-07-09 05:02:18 +0000248PyFloat_AsStringEx(char *buf, PyFloatObject *v, int precision)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249{
250 register char *cp;
251 /* Subroutine for float_repr and float_print.
252 We want float numbers to be recognizable as such,
253 i.e., they should contain a decimal point or an exponent.
254 However, %g may print the number as an integer;
255 in such cases, we append ".0" to the string. */
Guido van Rossum57072eb1999-12-23 19:00:28 +0000256 sprintf(buf, "%.*g", precision, v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257 cp = buf;
258 if (*cp == '-')
259 cp++;
260 for (; *cp != '\0'; cp++) {
261 /* Any non-digit means it's not an integer;
262 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000263 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264 break;
265 }
266 if (*cp == '\0') {
267 *cp++ = '.';
268 *cp++ = '0';
269 *cp++ = '\0';
270 }
271}
272
Guido van Rossum57072eb1999-12-23 19:00:28 +0000273/* Precisions used by repr() and str(), respectively.
274
275 The repr() precision (17 significant decimal digits) is the minimal number
276 that is guaranteed to have enough precision so that if the number is read
277 back in the exact same binary value is recreated. This is true for IEEE
278 floating point by design, and also happens to work for all other modern
279 hardware.
280
281 The str() precision is chosen so that in most cases, the rounding noise
282 created by various operations is suppressed, while giving plenty of
283 precision for practical use.
284
285*/
286
287#define PREC_REPR 17
288#define PREC_STR 12
289
290void
Fred Drakefd99de62000-07-09 05:02:18 +0000291PyFloat_AsString(char *buf, PyFloatObject *v)
Guido van Rossum57072eb1999-12-23 19:00:28 +0000292{
293 PyFloat_AsStringEx(buf, v, PREC_STR);
294}
295
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000296/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000297static int
Fred Drakefd99de62000-07-09 05:02:18 +0000298float_print(PyFloatObject *v, FILE *fp, int flags)
299 /* flags -- not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300{
301 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000302 PyFloat_AsStringEx(buf, v, flags&Py_PRINT_RAW ? PREC_STR : PREC_REPR);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303 fputs(buf, fp);
Guido van Rossum90933611991-06-07 16:10:43 +0000304 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305}
306
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000307static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000308float_repr(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309{
310 char buf[100];
Guido van Rossum57072eb1999-12-23 19:00:28 +0000311 PyFloat_AsStringEx(buf, v, PREC_REPR);
312 return PyString_FromString(buf);
313}
314
315static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000316float_str(PyFloatObject *v)
Guido van Rossum57072eb1999-12-23 19:00:28 +0000317{
318 char buf[100];
319 PyFloat_AsStringEx(buf, v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321}
322
323static int
Fred Drakefd99de62000-07-09 05:02:18 +0000324float_compare(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325{
326 double i = v->ob_fval;
327 double j = w->ob_fval;
328 return (i < j) ? -1 : (i > j) ? 1 : 0;
329}
330
Fred Drake13634cf2000-06-29 19:17:04 +0000331
Guido van Rossum9bfef441993-03-29 10:43:31 +0000332static long
Fred Drakefd99de62000-07-09 05:02:18 +0000333float_hash(PyFloatObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000334{
335 double intpart, fractpart;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000336 long x;
337 /* This is designed so that Python numbers with the same
338 value hash to the same value, otherwise comparisons
339 of mapping keys will turn out weird */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000340
341#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
342{
343 extended e;
344 fractpart = modf(v->ob_fval, &e);
345 intpart = e;
346}
347#else
Guido van Rossum9bfef441993-03-29 10:43:31 +0000348 fractpart = modf(v->ob_fval, &intpart);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000349#endif
350
Guido van Rossum9bfef441993-03-29 10:43:31 +0000351 if (fractpart == 0.0) {
Fred Drake13634cf2000-06-29 19:17:04 +0000352 if (intpart > LONG_MAX || -intpart > LONG_MAX) {
Guido van Rossum9bfef441993-03-29 10:43:31 +0000353 /* Convert to long int and use its hash... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 PyObject *w = PyLong_FromDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000355 if (w == NULL)
356 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357 x = PyObject_Hash(w);
358 Py_DECREF(w);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000359 return x;
360 }
361 x = (long)intpart;
362 }
363 else {
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000364 /* Note -- if you change this code, also change the copy
365 in complexobject.c */
Fred Drake13634cf2000-06-29 19:17:04 +0000366 x = _Py_HashDouble(v->ob_fval);
367 if (x == -1)
368 return -1;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000369 }
370 if (x == -1)
371 x = -2;
372 return x;
373}
374
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000376float_add(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000377{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000378 double result;
379 PyFPE_START_PROTECT("add", return 0)
380 result = v->ob_fval + w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000381 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000383}
384
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000385static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000386float_sub(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000388 double result;
389 PyFPE_START_PROTECT("subtract", return 0)
390 result = v->ob_fval - w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000391 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393}
394
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000395static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000396float_mul(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000398 double result;
399
400 PyFPE_START_PROTECT("multiply", return 0)
401 result = v->ob_fval * w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000402 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000404}
405
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000407float_div(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000408{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000409 double result;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000410 if (w->ob_fval == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000411 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412 return NULL;
413 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000414 PyFPE_START_PROTECT("divide", return 0)
415 result = v->ob_fval / w->ob_fval;
Guido van Rossum45b83911997-03-14 04:32:50 +0000416 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417 return PyFloat_FromDouble(result);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418}
419
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000420static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000421float_rem(PyFloatObject *v, PyFloatObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000423 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000424 double mod;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000425 wx = w->ob_fval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428 return NULL;
429 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000430 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000431 vx = v->ob_fval;
432 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000433 /* note: checking mod*wx < 0 is incorrect -- underflows to
434 0 if wx < sqrt(smallest nonzero double) */
435 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000436 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000437 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000438 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440}
441
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000443float_divmod(PyFloatObject *v, PyFloatObject *w)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000444{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000445 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000446 double div, mod, floordiv;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000447 wx = w->ob_fval;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000448 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000450 return NULL;
451 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000452 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000453 vx = v->ob_fval;
454 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000455 /* fmod is typically exact, so vx-mod is *mathemtically* an
456 exact multiple of wx. But this is fp arithmetic, and fp
457 vx - mod is an approximation; the result is that div may
458 not be an exact integral value after the division, although
459 it will always be very close to one.
460 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000461 div = (vx - mod) / wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000462 /* note: checking mod*wx < 0 is incorrect -- underflows to
463 0 if wx < sqrt(smallest nonzero double) */
464 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum15ecff41991-10-20 20:16:45 +0000465 mod += wx;
466 div -= 1.0;
467 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000468 /* snap quotient to nearest integral value */
469 floordiv = floor(div);
470 if (div - floordiv > 0.5)
471 floordiv += 1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000472 PyFPE_END_PROTECT(div)
Guido van Rossum9263e781999-05-06 14:26:34 +0000473 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000474}
475
Fred Drakefd99de62000-07-09 05:02:18 +0000476static double powu(double x, long n)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000477{
478 double r = 1.;
479 double p = x;
480 long mask = 1;
481 while (mask > 0 && n >= mask) {
482 if (n & mask)
483 r *= p;
484 mask <<= 1;
485 p *= p;
486 }
487 return r;
488}
489
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000491float_pow(PyFloatObject *v, PyObject *w, PyFloatObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000492{
493 double iv, iw, ix;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000494 long intw;
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000495 /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
496 * The z parameter is really only going to be useful for integers and
497 * long integers. Maybe something clever with logarithms could be done.
498 * [AMK]
499 */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000500 iv = v->ob_fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000501 iw = ((PyFloatObject *)w)->ob_fval;
Guido van Rossum39739ea1996-01-12 01:22:56 +0000502 intw = (long)iw;
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000503 if (iw == intw && -10000 < intw && intw < 10000) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000504 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000505 if (intw == 0) { /* x**0 is 1, even 0**0 */
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000506 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507 if ((PyObject *)z!=Py_None) {
Guido van Rossum39739ea1996-01-12 01:22:56 +0000508 ix=fmod(1.0, z->ob_fval);
509 if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
510 }
511 else ix=1.0;
Guido van Rossum45b83911997-03-14 04:32:50 +0000512 PyFPE_END_PROTECT(ix)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 return PyFloat_FromDouble(ix);
Guido van Rossum70d93461991-05-28 21:57:39 +0000514 }
Guido van Rossum86c04c21996-08-09 20:50:14 +0000515 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000516 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000517 if (intw > 0)
518 ix = powu(iv, intw);
519 else
520 ix = 1./powu(iv, -intw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000521 PyFPE_END_PROTECT(ix)
Guido van Rossum86c04c21996-08-09 20:50:14 +0000522 }
523 else {
524 /* Sort out special cases here instead of relying on pow() */
Guido van Rossum39739ea1996-01-12 01:22:56 +0000525 if (iv == 0.0) {
526 if (iw < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000528 "0.0 to a negative power");
Guido van Rossum39739ea1996-01-12 01:22:56 +0000529 return NULL;
530 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 return PyFloat_FromDouble(0.0);
Guido van Rossum39739ea1996-01-12 01:22:56 +0000532 }
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000533 if (iv < 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 PyErr_SetString(PyExc_ValueError,
Guido van Rossumc13bcca1996-08-16 20:42:57 +0000535 "negative number to a float power");
536 return NULL;
537 }
Guido van Rossum39739ea1996-01-12 01:22:56 +0000538 errno = 0;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000539 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum39739ea1996-01-12 01:22:56 +0000540 ix = pow(iv, iw);
Guido van Rossum45b83911997-03-14 04:32:50 +0000541 PyFPE_END_PROTECT(ix)
Guido van Rossum70d93461991-05-28 21:57:39 +0000542 }
Guido van Rossum7fa52f81991-12-16 15:43:14 +0000543 CHECK(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000544 if (errno != 0) {
545 /* XXX could it be another type of error? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 PyErr_SetFromErrno(PyExc_OverflowError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000547 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000548 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 if ((PyObject *)z!=Py_None) {
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000550 PyFPE_START_PROTECT("pow", return 0)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000551 ix=fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
552 if ( ix!=0 &&
553 ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
554 ix+=z->ob_fval;
555 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000556 PyFPE_END_PROTECT(ix)
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000557 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 return PyFloat_FromDouble(ix);
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_neg(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000564 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565}
566
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000568float_pos(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000569{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 Py_INCREF(v);
571 return (PyObject *)v;
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000572}
573
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000575float_abs(PyFloatObject *v)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000576{
577 if (v->ob_fval < 0)
578 return float_neg(v);
579 else
580 return float_pos(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000581}
582
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000583static int
Fred Drakefd99de62000-07-09 05:02:18 +0000584float_nonzero(PyFloatObject *v)
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000585{
586 return v->ob_fval != 0.0;
587}
588
Guido van Rossum234f9421993-06-17 12:35:49 +0000589static int
Fred Drakefd99de62000-07-09 05:02:18 +0000590float_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +0000591{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592 if (PyInt_Check(*pw)) {
593 long x = PyInt_AsLong(*pw);
594 *pw = PyFloat_FromDouble((double)x);
595 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000596 return 0;
597 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 else if (PyLong_Check(*pw)) {
599 *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
600 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000601 return 0;
602 }
603 return 1; /* Can't do it */
604}
605
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000607float_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000608{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000609 double x = PyFloat_AsDouble(v);
Guido van Rossum03093a21994-09-28 15:51:32 +0000610 if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
611 : (x = floor(x)) > (double)LONG_MAX) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 PyErr_SetString(PyExc_OverflowError,
613 "float too large to convert");
Guido van Rossum03093a21994-09-28 15:51:32 +0000614 return NULL;
615 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 return PyInt_FromLong((long)x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000617}
618
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000620float_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000621{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 double x = PyFloat_AsDouble(v);
623 return PyLong_FromDouble(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000624}
625
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000627float_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000628{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000630 return v;
631}
632
633
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000634static PyNumberMethods float_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000635 (binaryfunc)float_add, /*nb_add*/
636 (binaryfunc)float_sub, /*nb_subtract*/
637 (binaryfunc)float_mul, /*nb_multiply*/
638 (binaryfunc)float_div, /*nb_divide*/
639 (binaryfunc)float_rem, /*nb_remainder*/
640 (binaryfunc)float_divmod, /*nb_divmod*/
Guido van Rossum0b7d02a1994-08-12 12:52:35 +0000641 (ternaryfunc)float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000642 (unaryfunc)float_neg, /*nb_negative*/
643 (unaryfunc)float_pos, /*nb_positive*/
644 (unaryfunc)float_abs, /*nb_absolute*/
645 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +0000646 0, /*nb_invert*/
647 0, /*nb_lshift*/
648 0, /*nb_rshift*/
649 0, /*nb_and*/
650 0, /*nb_xor*/
651 0, /*nb_or*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000652 (coercion)float_coerce, /*nb_coerce*/
653 (unaryfunc)float_int, /*nb_int*/
654 (unaryfunc)float_long, /*nb_long*/
655 (unaryfunc)float_float, /*nb_float*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000656 0, /*nb_oct*/
657 0, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000658};
659
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660PyTypeObject PyFloat_Type = {
661 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000662 0,
663 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000665 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000666 (destructor)float_dealloc, /*tp_dealloc*/
667 (printfunc)float_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000668 0, /*tp_getattr*/
669 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000670 (cmpfunc)float_compare, /*tp_compare*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000671 (reprfunc)float_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000672 &float_as_number, /*tp_as_number*/
673 0, /*tp_as_sequence*/
674 0, /*tp_as_mapping*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000675 (hashfunc)float_hash, /*tp_hash*/
676 0, /*tp_call*/
677 (reprfunc)float_str, /*tp_str*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000678};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000679
680void
Fred Drakefd99de62000-07-09 05:02:18 +0000681PyFloat_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000682{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000683 PyFloatObject *p;
684 PyFloatBlock *list, *next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000685 int i;
686 int bc, bf; /* block count, number of freed blocks */
687 int frem, fsum; /* remaining unfreed floats per block, total */
688
689 bc = 0;
690 bf = 0;
691 fsum = 0;
692 list = block_list;
693 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000694 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000695 while (list != NULL) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000696 bc++;
697 frem = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000698 for (i = 0, p = &list->objects[0];
699 i < N_FLOATOBJECTS;
700 i++, p++) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000701 if (PyFloat_Check(p) && p->ob_refcnt != 0)
702 frem++;
703 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000704 next = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000705 if (frem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000706 list->next = block_list;
707 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000708 for (i = 0, p = &list->objects[0];
709 i < N_FLOATOBJECTS;
710 i++, p++) {
711 if (!PyFloat_Check(p) || p->ob_refcnt == 0) {
712 p->ob_type = (struct _typeobject *)
713 free_list;
714 free_list = p;
715 }
716 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000717 }
718 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000719 PyMem_FREE(list); /* XXX PyObject_FREE ??? */
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000720 bf++;
721 }
722 fsum += frem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000723 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000724 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000725 if (!Py_VerboseFlag)
726 return;
727 fprintf(stderr, "# cleanup floats");
728 if (!fsum) {
729 fprintf(stderr, "\n");
730 }
731 else {
732 fprintf(stderr,
733 ": %d unfreed float%s in %d out of %d block%s\n",
734 fsum, fsum == 1 ? "" : "s",
735 bc - bf, bc, bc == 1 ? "" : "s");
736 }
737 if (Py_VerboseFlag > 1) {
738 list = block_list;
739 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +0000740 for (i = 0, p = &list->objects[0];
741 i < N_FLOATOBJECTS;
742 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000743 if (PyFloat_Check(p) && p->ob_refcnt != 0) {
744 char buf[100];
745 PyFloat_AsString(buf, p);
746 fprintf(stderr,
Fred Drakea44d3532000-06-30 15:01:00 +0000747 "# <float at %p, refcnt=%d, val=%s>\n",
748 p, p->ob_refcnt, buf);
Guido van Rossum3fce8831999-03-12 19:43:17 +0000749 }
750 }
751 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +0000752 }
753 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000754}