blob: 3ef44f63955e886694f6e29914ed50029786e25c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Float object implementation */
3
Guido van Rossum2a9096b1990-10-21 22:15:08 +00004/* XXX There should be overflow checks here, but it's hard to check
5 for any kind of float exception without losing portability. */
6
Guido van Rossumc0b618a1997-05-02 03:12:38 +00007#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008
Eric Smith8c663262007-08-25 02:26:07 +00009#include "formatter_unicode.h"
10
Guido van Rossum3f5da241990-12-20 15:06:42 +000011#include <ctype.h>
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000012
Jack Janseneddc1442003-11-20 01:44:59 +000013#if !defined(__STDC__)
Tim Petersdbd9ba62000-07-09 03:09:57 +000014extern double fmod(double, double);
15extern double pow(double, double);
Guido van Rossum6923e131990-11-02 17:50:43 +000016#endif
17
Guido van Rossum93ad0df1997-05-13 21:00:42 +000018/* Special free list -- see comments for same code in intobject.c. */
Guido van Rossum93ad0df1997-05-13 21:00:42 +000019#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000020#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
Guido van Rossumf61bbc81999-03-12 00:12:21 +000021#define N_FLOATOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyFloatObject))
Guido van Rossum3fce8831999-03-12 19:43:17 +000022
Guido van Rossum3fce8831999-03-12 19:43:17 +000023struct _floatblock {
24 struct _floatblock *next;
25 PyFloatObject objects[N_FLOATOBJECTS];
26};
27
28typedef struct _floatblock PyFloatBlock;
29
30static PyFloatBlock *block_list = NULL;
31static PyFloatObject *free_list = NULL;
32
Guido van Rossum93ad0df1997-05-13 21:00:42 +000033static PyFloatObject *
Fred Drakefd99de62000-07-09 05:02:18 +000034fill_free_list(void)
Guido van Rossum93ad0df1997-05-13 21:00:42 +000035{
36 PyFloatObject *p, *q;
Guido van Rossumb18618d2000-05-03 23:44:39 +000037 /* XXX Float blocks escape the object heap. Use PyObject_MALLOC ??? */
38 p = (PyFloatObject *) PyMem_MALLOC(sizeof(PyFloatBlock));
Guido van Rossum93ad0df1997-05-13 21:00:42 +000039 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +000040 return (PyFloatObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +000041 ((PyFloatBlock *)p)->next = block_list;
42 block_list = (PyFloatBlock *)p;
43 p = &((PyFloatBlock *)p)->objects[0];
Guido van Rossum93ad0df1997-05-13 21:00:42 +000044 q = p + N_FLOATOBJECTS;
45 while (--q > p)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +000046 Py_Type(q) = (struct _typeobject *)(q-1);
47 Py_Type(q) = NULL;
Guido van Rossum93ad0df1997-05-13 21:00:42 +000048 return p + N_FLOATOBJECTS - 1;
49}
50
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052PyFloat_FromDouble(double fval)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053{
Guido van Rossum93ad0df1997-05-13 21:00:42 +000054 register PyFloatObject *op;
55 if (free_list == NULL) {
56 if ((free_list = fill_free_list()) == NULL)
57 return NULL;
58 }
Guido van Rossume3a8e7e2002-08-19 19:26:42 +000059 /* Inline PyObject_New */
Guido van Rossum93ad0df1997-05-13 21:00:42 +000060 op = free_list;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +000061 free_list = (PyFloatObject *)Py_Type(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +000062 PyObject_INIT(op, &PyFloat_Type);
Guido van Rossum2a9096b1990-10-21 22:15:08 +000063 op->ob_fval = fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000065}
66
Barry Warsaw226ae6c1999-10-12 19:54:53 +000067PyObject *
Georg Brandl428f0642007-03-18 18:35:15 +000068PyFloat_FromString(PyObject *v)
Barry Warsaw226ae6c1999-10-12 19:54:53 +000069{
Guido van Rossum4c08d552000-03-10 22:55:18 +000070 const char *s, *last, *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +000071 double x;
Tim Petersef14d732000-09-23 03:39:17 +000072 char buffer[256]; /* for errors */
Guido van Rossum2be161d2007-05-15 20:43:51 +000073 char *s_buffer = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +000074 Py_ssize_t len;
Guido van Rossum2be161d2007-05-15 20:43:51 +000075 PyObject *result = NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +000076
Neal Norwitz6ea45d32007-08-26 04:19:43 +000077 if (PyUnicode_Check(v)) {
Guido van Rossum2be161d2007-05-15 20:43:51 +000078 s_buffer = (char *)PyMem_MALLOC(PyUnicode_GET_SIZE(v)+1);
79 if (s_buffer == NULL)
80 return PyErr_NoMemory();
Tim Petersef14d732000-09-23 03:39:17 +000081 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
Guido van Rossum9e896b32000-04-05 20:11:21 +000082 PyUnicode_GET_SIZE(v),
Tim Petersd2364e82001-11-01 20:09:42 +000083 s_buffer,
Guido van Rossum9e896b32000-04-05 20:11:21 +000084 NULL))
Neal Norwitz447e7c32007-08-12 07:11:25 +000085 goto error;
Guido van Rossum9e896b32000-04-05 20:11:21 +000086 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +000087 len = strlen(s);
Guido van Rossum9e896b32000-04-05 20:11:21 +000088 }
Guido van Rossum4c08d552000-03-10 22:55:18 +000089 else if (PyObject_AsCharBuffer(v, &s, &len)) {
90 PyErr_SetString(PyExc_TypeError,
Skip Montanaro71390a92002-05-02 13:03:22 +000091 "float() argument must be a string or a number");
Barry Warsaw226ae6c1999-10-12 19:54:53 +000092 return NULL;
Guido van Rossum4c08d552000-03-10 22:55:18 +000093 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +000094
Guido van Rossum4c08d552000-03-10 22:55:18 +000095 last = s + len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +000096 while (*s && isspace(Py_CHARMASK(*s)))
97 s++;
Tim Petersef14d732000-09-23 03:39:17 +000098 if (*s == '\0') {
Barry Warsaw226ae6c1999-10-12 19:54:53 +000099 PyErr_SetString(PyExc_ValueError, "empty string for float()");
Guido van Rossum2be161d2007-05-15 20:43:51 +0000100 goto error;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000101 }
Tim Petersef14d732000-09-23 03:39:17 +0000102 /* We don't care about overflow or underflow. If the platform supports
103 * them, infinities and signed zeroes (on underflow) are fine.
104 * However, strtod can return 0 for denormalized numbers, where atof
105 * does not. So (alas!) we special-case a zero result. Note that
106 * whether strtod sets errno on underflow is not defined, so we can't
107 * key off errno.
108 */
Guido van Rossum2be161d2007-05-15 20:43:51 +0000109 PyFPE_START_PROTECT("strtod", goto error)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000110 x = PyOS_ascii_strtod(s, (char **)&end);
Tim Peters858346e2000-09-25 21:01:28 +0000111 PyFPE_END_PROTECT(x)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000112 errno = 0;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000113 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
Tim Petersef14d732000-09-23 03:39:17 +0000114 byte at the end of the string, when the input is inf(inity). */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000115 if (end > last)
116 end = last;
Tim Petersef14d732000-09-23 03:39:17 +0000117 if (end == s) {
Barry Warsawaf8aef92001-11-28 20:52:21 +0000118 PyOS_snprintf(buffer, sizeof(buffer),
119 "invalid literal for float(): %.200s", s);
Tim Petersef14d732000-09-23 03:39:17 +0000120 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossum2be161d2007-05-15 20:43:51 +0000121 goto error;
Tim Petersef14d732000-09-23 03:39:17 +0000122 }
123 /* Since end != s, the platform made *some* kind of sense out
124 of the input. Trust it. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000125 while (*end && isspace(Py_CHARMASK(*end)))
126 end++;
127 if (*end != '\0') {
Barry Warsawaf8aef92001-11-28 20:52:21 +0000128 PyOS_snprintf(buffer, sizeof(buffer),
129 "invalid literal for float(): %.200s", s);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000130 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossum2be161d2007-05-15 20:43:51 +0000131 goto error;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000132 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000133 else if (end != last) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000134 PyErr_SetString(PyExc_ValueError,
135 "null byte in argument for float()");
Guido van Rossum2be161d2007-05-15 20:43:51 +0000136 goto error;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000137 }
Tim Petersef14d732000-09-23 03:39:17 +0000138 if (x == 0.0) {
139 /* See above -- may have been strtod being anal
140 about denorms. */
Guido van Rossum2be161d2007-05-15 20:43:51 +0000141 PyFPE_START_PROTECT("atof", goto error)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000142 x = PyOS_ascii_atof(s);
Tim Peters858346e2000-09-25 21:01:28 +0000143 PyFPE_END_PROTECT(x)
Tim Petersef14d732000-09-23 03:39:17 +0000144 errno = 0; /* whether atof ever set errno is undefined */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000145 }
Guido van Rossum2be161d2007-05-15 20:43:51 +0000146 result = PyFloat_FromDouble(x);
147 error:
148 if (s_buffer)
149 PyMem_FREE(s_buffer);
150 return result;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000151}
152
Guido van Rossum234f9421993-06-17 12:35:49 +0000153static void
Fred Drakefd99de62000-07-09 05:02:18 +0000154float_dealloc(PyFloatObject *op)
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000155{
Guido van Rossum9475a232001-10-05 20:51:39 +0000156 if (PyFloat_CheckExact(op)) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000157 Py_Type(op) = (struct _typeobject *)free_list;
Guido van Rossum9475a232001-10-05 20:51:39 +0000158 free_list = op;
159 }
160 else
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000161 Py_Type(op)->tp_free((PyObject *)op);
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000162}
163
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000164double
Fred Drakefd99de62000-07-09 05:02:18 +0000165PyFloat_AsDouble(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 PyNumberMethods *nb;
168 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000169 double val;
Tim Petersd2364e82001-11-01 20:09:42 +0000170
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 if (op && PyFloat_Check(op))
172 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Tim Petersd2364e82001-11-01 20:09:42 +0000173
Neil Schemenauer2c77e902002-11-18 16:06:21 +0000174 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000176 return -1;
177 }
Tim Petersd2364e82001-11-01 20:09:42 +0000178
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000179 if ((nb = Py_Type(op)->tp_as_number) == NULL || nb->nb_float == NULL) {
Neil Schemenauer2c77e902002-11-18 16:06:21 +0000180 PyErr_SetString(PyExc_TypeError, "a float is required");
181 return -1;
182 }
183
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000185 if (fo == NULL)
186 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187 if (!PyFloat_Check(fo)) {
188 PyErr_SetString(PyExc_TypeError,
189 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000190 return -1;
191 }
Tim Petersd2364e82001-11-01 20:09:42 +0000192
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193 val = PyFloat_AS_DOUBLE(fo);
194 Py_DECREF(fo);
Tim Petersd2364e82001-11-01 20:09:42 +0000195
Guido van Rossumb6775db1994-08-01 11:34:53 +0000196 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197}
198
199/* Methods */
200
Tim Peters97019e42001-11-28 22:43:45 +0000201static void
Neal Norwitz545686b2006-12-28 04:45:06 +0000202format_double(char *buf, size_t buflen, double ob_fval, int precision)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203{
204 register char *cp;
Martin v. Löwis737ea822004-06-08 18:52:54 +0000205 char format[32];
Guido van Rossum04dbf3b2007-08-07 19:51:00 +0000206 /* Subroutine for float_repr, float_str, and others.
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000207 We want float numbers to be recognizable as such,
208 i.e., they should contain a decimal point or an exponent.
209 However, %g may print the number as an integer;
210 in such cases, we append ".0" to the string. */
Tim Peters97019e42001-11-28 22:43:45 +0000211
Martin v. Löwis737ea822004-06-08 18:52:54 +0000212 PyOS_snprintf(format, 32, "%%.%ig", precision);
Neal Norwitz545686b2006-12-28 04:45:06 +0000213 PyOS_ascii_formatd(buf, buflen, format, ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214 cp = buf;
215 if (*cp == '-')
216 cp++;
217 for (; *cp != '\0'; cp++) {
218 /* Any non-digit means it's not an integer;
219 this takes care of NAN and INF as well. */
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000220 if (!isdigit(Py_CHARMASK(*cp)))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221 break;
222 }
223 if (*cp == '\0') {
224 *cp++ = '.';
225 *cp++ = '0';
226 *cp++ = '\0';
227 }
228}
229
Neal Norwitz545686b2006-12-28 04:45:06 +0000230static void
231format_float(char *buf, size_t buflen, PyFloatObject *v, int precision)
Tim Peters97019e42001-11-28 22:43:45 +0000232{
Neal Norwitz545686b2006-12-28 04:45:06 +0000233 assert(PyFloat_Check(v));
234 format_double(buf, buflen, PyFloat_AS_DOUBLE(v), precision);
Tim Peters97019e42001-11-28 22:43:45 +0000235}
236
Neil Schemenauer32117e52001-01-04 01:44:34 +0000237/* Macro and helper that convert PyObject obj to a C double and store
Neil Schemenauer16c70752007-09-21 20:19:23 +0000238 the value in dbl. If conversion to double raises an exception, obj is
Tim Peters77d8a4f2001-12-11 20:31:34 +0000239 set to NULL, and the function invoking this macro returns NULL. If
240 obj is not of float, int or long type, Py_NotImplemented is incref'ed,
241 stored in obj, and returned from the function invoking this macro.
242*/
Neil Schemenauer32117e52001-01-04 01:44:34 +0000243#define CONVERT_TO_DOUBLE(obj, dbl) \
244 if (PyFloat_Check(obj)) \
245 dbl = PyFloat_AS_DOUBLE(obj); \
246 else if (convert_to_double(&(obj), &(dbl)) < 0) \
247 return obj;
248
249static int
Tim Peters9fffa3e2001-09-04 05:14:19 +0000250convert_to_double(PyObject **v, double *dbl)
Neil Schemenauer32117e52001-01-04 01:44:34 +0000251{
252 register PyObject *obj = *v;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000253
Guido van Rossumddefaf32007-01-14 03:31:43 +0000254 if (PyLong_Check(obj)) {
Neil Schemenauer32117e52001-01-04 01:44:34 +0000255 *dbl = PyLong_AsDouble(obj);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000256 if (*dbl == -1.0 && PyErr_Occurred()) {
257 *v = NULL;
258 return -1;
259 }
Neil Schemenauer32117e52001-01-04 01:44:34 +0000260 }
261 else {
262 Py_INCREF(Py_NotImplemented);
263 *v = Py_NotImplemented;
264 return -1;
265 }
266 return 0;
267}
268
Guido van Rossum57072eb1999-12-23 19:00:28 +0000269/* Precisions used by repr() and str(), respectively.
270
271 The repr() precision (17 significant decimal digits) is the minimal number
272 that is guaranteed to have enough precision so that if the number is read
273 back in the exact same binary value is recreated. This is true for IEEE
274 floating point by design, and also happens to work for all other modern
275 hardware.
276
277 The str() precision is chosen so that in most cases, the rounding noise
278 created by various operations is suppressed, while giving plenty of
279 precision for practical use.
280
281*/
282
283#define PREC_REPR 17
284#define PREC_STR 12
285
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000286static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000287float_repr(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288{
289 char buf[100];
Tim Peters97019e42001-11-28 22:43:45 +0000290 format_float(buf, sizeof(buf), v, PREC_REPR);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000291 return PyUnicode_FromString(buf);
Guido van Rossum57072eb1999-12-23 19:00:28 +0000292}
293
294static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000295float_str(PyFloatObject *v)
Guido van Rossum57072eb1999-12-23 19:00:28 +0000296{
297 char buf[100];
Tim Peters97019e42001-11-28 22:43:45 +0000298 format_float(buf, sizeof(buf), v, PREC_STR);
Walter Dörwald7696ed72007-05-31 15:51:35 +0000299 return PyUnicode_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300}
301
Tim Peters307fa782004-09-23 08:06:40 +0000302/* Comparison is pretty much a nightmare. When comparing float to float,
303 * we do it as straightforwardly (and long-windedly) as conceivable, so
304 * that, e.g., Python x == y delivers the same result as the platform
305 * C x == y when x and/or y is a NaN.
306 * When mixing float with an integer type, there's no good *uniform* approach.
307 * Converting the double to an integer obviously doesn't work, since we
308 * may lose info from fractional bits. Converting the integer to a double
309 * also has two failure modes: (1) a long int may trigger overflow (too
310 * large to fit in the dynamic range of a C double); (2) even a C long may have
311 * more bits than fit in a C double (e.g., on a a 64-bit box long may have
312 * 63 bits of precision, but a C double probably has only 53), and then
313 * we can falsely claim equality when low-order integer bits are lost by
314 * coercion to double. So this part is painful too.
315 */
316
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000317static PyObject*
318float_richcompare(PyObject *v, PyObject *w, int op)
319{
320 double i, j;
321 int r = 0;
322
Tim Peters307fa782004-09-23 08:06:40 +0000323 assert(PyFloat_Check(v));
324 i = PyFloat_AS_DOUBLE(v);
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000325
Tim Peters307fa782004-09-23 08:06:40 +0000326 /* Switch on the type of w. Set i and j to doubles to be compared,
327 * and op to the richcomp to use.
328 */
329 if (PyFloat_Check(w))
330 j = PyFloat_AS_DOUBLE(w);
331
Thomas Wouters477c8d52006-05-27 19:21:47 +0000332 else if (!Py_IS_FINITE(i)) {
Neal Norwitz1fe5f382007-08-31 04:32:55 +0000333 if (PyLong_Check(w))
Tim Peterse1c69b32004-09-23 19:22:41 +0000334 /* If i is an infinity, its magnitude exceeds any
335 * finite integer, so it doesn't matter which int we
336 * compare i with. If i is a NaN, similarly.
Tim Peters307fa782004-09-23 08:06:40 +0000337 */
338 j = 0.0;
339 else
340 goto Unimplemented;
341 }
342
Tim Peters307fa782004-09-23 08:06:40 +0000343 else if (PyLong_Check(w)) {
344 int vsign = i == 0.0 ? 0 : i < 0.0 ? -1 : 1;
345 int wsign = _PyLong_Sign(w);
346 size_t nbits;
Tim Peters307fa782004-09-23 08:06:40 +0000347 int exponent;
348
349 if (vsign != wsign) {
350 /* Magnitudes are irrelevant -- the signs alone
351 * determine the outcome.
352 */
353 i = (double)vsign;
354 j = (double)wsign;
355 goto Compare;
356 }
357 /* The signs are the same. */
358 /* Convert w to a double if it fits. In particular, 0 fits. */
359 nbits = _PyLong_NumBits(w);
360 if (nbits == (size_t)-1 && PyErr_Occurred()) {
361 /* This long is so large that size_t isn't big enough
Tim Peterse1c69b32004-09-23 19:22:41 +0000362 * to hold the # of bits. Replace with little doubles
363 * that give the same outcome -- w is so large that
364 * its magnitude must exceed the magnitude of any
365 * finite float.
Tim Peters307fa782004-09-23 08:06:40 +0000366 */
367 PyErr_Clear();
368 i = (double)vsign;
369 assert(wsign != 0);
370 j = wsign * 2.0;
371 goto Compare;
372 }
373 if (nbits <= 48) {
374 j = PyLong_AsDouble(w);
375 /* It's impossible that <= 48 bits overflowed. */
376 assert(j != -1.0 || ! PyErr_Occurred());
377 goto Compare;
378 }
379 assert(wsign != 0); /* else nbits was 0 */
380 assert(vsign != 0); /* if vsign were 0, then since wsign is
381 * not 0, we would have taken the
382 * vsign != wsign branch at the start */
383 /* We want to work with non-negative numbers. */
384 if (vsign < 0) {
385 /* "Multiply both sides" by -1; this also swaps the
386 * comparator.
387 */
388 i = -i;
389 op = _Py_SwappedOp[op];
390 }
391 assert(i > 0.0);
Neal Norwitzb2da01b2006-01-08 01:11:25 +0000392 (void) frexp(i, &exponent);
Tim Peters307fa782004-09-23 08:06:40 +0000393 /* exponent is the # of bits in v before the radix point;
394 * we know that nbits (the # of bits in w) > 48 at this point
395 */
396 if (exponent < 0 || (size_t)exponent < nbits) {
397 i = 1.0;
398 j = 2.0;
399 goto Compare;
400 }
401 if ((size_t)exponent > nbits) {
402 i = 2.0;
403 j = 1.0;
404 goto Compare;
405 }
406 /* v and w have the same number of bits before the radix
407 * point. Construct two longs that have the same comparison
408 * outcome.
409 */
410 {
411 double fracpart;
412 double intpart;
413 PyObject *result = NULL;
414 PyObject *one = NULL;
415 PyObject *vv = NULL;
416 PyObject *ww = w;
417
418 if (wsign < 0) {
419 ww = PyNumber_Negative(w);
420 if (ww == NULL)
421 goto Error;
422 }
423 else
424 Py_INCREF(ww);
425
426 fracpart = modf(i, &intpart);
427 vv = PyLong_FromDouble(intpart);
428 if (vv == NULL)
429 goto Error;
430
431 if (fracpart != 0.0) {
432 /* Shift left, and or a 1 bit into vv
433 * to represent the lost fraction.
434 */
435 PyObject *temp;
436
437 one = PyInt_FromLong(1);
438 if (one == NULL)
439 goto Error;
440
441 temp = PyNumber_Lshift(ww, one);
442 if (temp == NULL)
443 goto Error;
444 Py_DECREF(ww);
445 ww = temp;
446
447 temp = PyNumber_Lshift(vv, one);
448 if (temp == NULL)
449 goto Error;
450 Py_DECREF(vv);
451 vv = temp;
452
453 temp = PyNumber_Or(vv, one);
454 if (temp == NULL)
455 goto Error;
456 Py_DECREF(vv);
457 vv = temp;
458 }
459
460 r = PyObject_RichCompareBool(vv, ww, op);
461 if (r < 0)
462 goto Error;
463 result = PyBool_FromLong(r);
464 Error:
465 Py_XDECREF(vv);
466 Py_XDECREF(ww);
467 Py_XDECREF(one);
468 return result;
469 }
470 } /* else if (PyLong_Check(w)) */
471
472 else /* w isn't float, int, or long */
473 goto Unimplemented;
474
475 Compare:
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000476 PyFPE_START_PROTECT("richcompare", return NULL)
477 switch (op) {
478 case Py_EQ:
Tim Peters307fa782004-09-23 08:06:40 +0000479 r = i == j;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000480 break;
481 case Py_NE:
Tim Peters307fa782004-09-23 08:06:40 +0000482 r = i != j;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000483 break;
484 case Py_LE:
Tim Peters307fa782004-09-23 08:06:40 +0000485 r = i <= j;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000486 break;
487 case Py_GE:
Tim Peters307fa782004-09-23 08:06:40 +0000488 r = i >= j;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000489 break;
490 case Py_LT:
Tim Peters307fa782004-09-23 08:06:40 +0000491 r = i < j;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000492 break;
493 case Py_GT:
Tim Peters307fa782004-09-23 08:06:40 +0000494 r = i > j;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000495 break;
496 }
Michael W. Hudson957f9772004-02-26 12:33:09 +0000497 PyFPE_END_PROTECT(r)
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000498 return PyBool_FromLong(r);
Tim Peters307fa782004-09-23 08:06:40 +0000499
500 Unimplemented:
501 Py_INCREF(Py_NotImplemented);
502 return Py_NotImplemented;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000503}
504
Guido van Rossum9bfef441993-03-29 10:43:31 +0000505static long
Fred Drakefd99de62000-07-09 05:02:18 +0000506float_hash(PyFloatObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000507{
Tim Peters39dce292000-08-15 03:34:48 +0000508 return _Py_HashDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000509}
510
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000512float_add(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000513{
Neil Schemenauer32117e52001-01-04 01:44:34 +0000514 double a,b;
515 CONVERT_TO_DOUBLE(v, a);
516 CONVERT_TO_DOUBLE(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000517 PyFPE_START_PROTECT("add", return 0)
Neil Schemenauer32117e52001-01-04 01:44:34 +0000518 a = a + b;
519 PyFPE_END_PROTECT(a)
520 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000521}
522
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000524float_sub(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000525{
Neil Schemenauer32117e52001-01-04 01:44:34 +0000526 double a,b;
527 CONVERT_TO_DOUBLE(v, a);
528 CONVERT_TO_DOUBLE(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000529 PyFPE_START_PROTECT("subtract", return 0)
Neil Schemenauer32117e52001-01-04 01:44:34 +0000530 a = a - b;
531 PyFPE_END_PROTECT(a)
532 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000533}
534
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000536float_mul(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000537{
Neil Schemenauer32117e52001-01-04 01:44:34 +0000538 double a,b;
539 CONVERT_TO_DOUBLE(v, a);
540 CONVERT_TO_DOUBLE(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000541 PyFPE_START_PROTECT("multiply", return 0)
Neil Schemenauer32117e52001-01-04 01:44:34 +0000542 a = a * b;
543 PyFPE_END_PROTECT(a)
544 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545}
546
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000548float_div(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000549{
Neil Schemenauer32117e52001-01-04 01:44:34 +0000550 double a,b;
551 CONVERT_TO_DOUBLE(v, a);
552 CONVERT_TO_DOUBLE(w, b);
553 if (b == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 PyErr_SetString(PyExc_ZeroDivisionError, "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000555 return NULL;
556 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000557 PyFPE_START_PROTECT("divide", return 0)
Neil Schemenauer32117e52001-01-04 01:44:34 +0000558 a = a / b;
559 PyFPE_END_PROTECT(a)
560 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000561}
562
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000564float_rem(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000566 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000567 double mod;
Neil Schemenauer32117e52001-01-04 01:44:34 +0000568 CONVERT_TO_DOUBLE(v, vx);
569 CONVERT_TO_DOUBLE(w, wx);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000570 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000571 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000572 return NULL;
573 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000574 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000575 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000576 /* note: checking mod*wx < 0 is incorrect -- underflows to
577 0 if wx < sqrt(smallest nonzero double) */
578 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000579 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000580 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000581 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000583}
584
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000586float_divmod(PyObject *v, PyObject *w)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000587{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000588 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000589 double div, mod, floordiv;
Neil Schemenauer32117e52001-01-04 01:44:34 +0000590 CONVERT_TO_DOUBLE(v, vx);
591 CONVERT_TO_DOUBLE(w, wx);
Guido van Rossum15ecff41991-10-20 20:16:45 +0000592 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000594 return NULL;
595 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000596 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000597 mod = fmod(vx, wx);
Tim Peters78fc0b52000-09-16 03:54:24 +0000598 /* fmod is typically exact, so vx-mod is *mathematically* an
Guido van Rossum9263e781999-05-06 14:26:34 +0000599 exact multiple of wx. But this is fp arithmetic, and fp
600 vx - mod is an approximation; the result is that div may
601 not be an exact integral value after the division, although
602 it will always be very close to one.
603 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000604 div = (vx - mod) / wx;
Tim Petersd2e40d62001-11-01 23:12:27 +0000605 if (mod) {
606 /* ensure the remainder has the same sign as the denominator */
607 if ((wx < 0) != (mod < 0)) {
608 mod += wx;
609 div -= 1.0;
610 }
611 }
612 else {
613 /* the remainder is zero, and in the presence of signed zeroes
614 fmod returns different results across platforms; ensure
615 it has the same sign as the denominator; we'd like to do
616 "mod = wx * 0.0", but that may get optimized away */
Tim Peters4e8ab5d2001-11-01 23:59:56 +0000617 mod *= mod; /* hide "mod = +0" from optimizer */
Tim Petersd2e40d62001-11-01 23:12:27 +0000618 if (wx < 0.0)
619 mod = -mod;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000620 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000621 /* snap quotient to nearest integral value */
Tim Petersd2e40d62001-11-01 23:12:27 +0000622 if (div) {
623 floordiv = floor(div);
624 if (div - floordiv > 0.5)
625 floordiv += 1.0;
626 }
627 else {
628 /* div is zero - get the same sign as the true quotient */
629 div *= div; /* hide "div = +0" from optimizers */
630 floordiv = div * vx / wx; /* zero w/ sign of vx/wx */
631 }
632 PyFPE_END_PROTECT(floordiv)
Guido van Rossum9263e781999-05-06 14:26:34 +0000633 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000634}
635
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636static PyObject *
Tim Peters63a35712001-12-11 19:57:24 +0000637float_floor_div(PyObject *v, PyObject *w)
638{
639 PyObject *t, *r;
640
641 t = float_divmod(v, w);
Tim Peters77d8a4f2001-12-11 20:31:34 +0000642 if (t == NULL || t == Py_NotImplemented)
643 return t;
644 assert(PyTuple_CheckExact(t));
645 r = PyTuple_GET_ITEM(t, 0);
646 Py_INCREF(r);
647 Py_DECREF(t);
648 return r;
Tim Peters63a35712001-12-11 19:57:24 +0000649}
650
651static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000652float_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000653{
654 double iv, iw, ix;
Tim Peters32f453e2001-09-03 08:35:41 +0000655
656 if ((PyObject *)z != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +0000657 PyErr_SetString(PyExc_TypeError, "pow() 3rd argument not "
Tim Peters97f4a332001-09-05 23:49:24 +0000658 "allowed unless all arguments are integers");
Tim Peters32f453e2001-09-03 08:35:41 +0000659 return NULL;
660 }
661
Neil Schemenauer32117e52001-01-04 01:44:34 +0000662 CONVERT_TO_DOUBLE(v, iv);
663 CONVERT_TO_DOUBLE(w, iw);
Tim Petersc54d1902000-10-06 00:36:09 +0000664
665 /* Sort out special cases here instead of relying on pow() */
Tim Peters96685bf2001-08-23 22:31:37 +0000666 if (iw == 0) { /* v**0 is 1, even 0**0 */
Guido van Rossum360e4b82007-05-14 22:51:27 +0000667 return PyFloat_FromDouble(1.0);
Tim Petersc54d1902000-10-06 00:36:09 +0000668 }
Tim Peters96685bf2001-08-23 22:31:37 +0000669 if (iv == 0.0) { /* 0**w is error if w<0, else 1 */
Tim Petersc54d1902000-10-06 00:36:09 +0000670 if (iw < 0.0) {
671 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000672 "0.0 cannot be raised to a negative power");
Tim Petersc54d1902000-10-06 00:36:09 +0000673 return NULL;
674 }
675 return PyFloat_FromDouble(0.0);
676 }
Tim Peterse87568d2003-05-24 20:18:24 +0000677 if (iv < 0.0) {
678 /* Whether this is an error is a mess, and bumps into libm
679 * bugs so we have to figure it out ourselves.
680 */
681 if (iw != floor(iw)) {
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000682 /* Negative numbers raised to fractional powers
683 * become complex.
684 */
685 return PyComplex_Type.tp_as_number->nb_power(v, w, z);
Tim Peterse87568d2003-05-24 20:18:24 +0000686 }
687 /* iw is an exact integer, albeit perhaps a very large one.
688 * -1 raised to an exact integer should never be exceptional.
689 * Alas, some libms (chiefly glibc as of early 2003) return
690 * NaN and set EDOM on pow(-1, large_int) if the int doesn't
691 * happen to be representable in a *C* integer. That's a
692 * bug; we let that slide in math.pow() (which currently
693 * reflects all platform accidents), but not for Python's **.
694 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000695 if (iv == -1.0 && Py_IS_FINITE(iw)) {
Tim Peterse87568d2003-05-24 20:18:24 +0000696 /* Return 1 if iw is even, -1 if iw is odd; there's
697 * no guarantee that any C integral type is big
698 * enough to hold iw, so we have to check this
699 * indirectly.
700 */
701 ix = floor(iw * 0.5) * 2.0;
702 return PyFloat_FromDouble(ix == iw ? 1.0 : -1.0);
703 }
704 /* Else iv != -1.0, and overflow or underflow are possible.
705 * Unless we're to write pow() ourselves, we have to trust
706 * the platform to do this correctly.
707 */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000708 }
Tim Peters96685bf2001-08-23 22:31:37 +0000709 errno = 0;
710 PyFPE_START_PROTECT("pow", return NULL)
711 ix = pow(iv, iw);
712 PyFPE_END_PROTECT(ix)
Tim Petersdc5a5082002-03-09 04:58:24 +0000713 Py_ADJUST_ERANGE1(ix);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000714 if (errno != 0) {
Tim Peterse87568d2003-05-24 20:18:24 +0000715 /* We don't expect any errno value other than ERANGE, but
716 * the range of libm bugs appears unbounded.
717 */
718 PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError :
719 PyExc_ValueError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000720 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000721 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000723}
724
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000726float_neg(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000727{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000729}
730
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000732float_abs(PyFloatObject *v)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000733{
Tim Petersfaf0cd22001-11-01 21:51:15 +0000734 return PyFloat_FromDouble(fabs(v->ob_fval));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000735}
736
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000737static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000738float_bool(PyFloatObject *v)
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000739{
740 return v->ob_fval != 0.0;
741}
742
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000743static PyObject *
Guido van Rossum2fa33db2007-08-23 22:07:24 +0000744float_trunc(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000745{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000746 double x = PyFloat_AsDouble(v);
Tim Peters7321ec42001-07-26 20:02:17 +0000747 double wholepart; /* integral portion of x, rounded toward 0 */
Tim Peters7321ec42001-07-26 20:02:17 +0000748
749 (void)modf(x, &wholepart);
Tim Peters7d791242002-11-21 22:26:37 +0000750 /* Try to get out cheap if this fits in a Python int. The attempt
751 * to cast to long must be protected, as C doesn't define what
752 * happens if the double is too big to fit in a long. Some rare
753 * systems raise an exception then (RISCOS was mentioned as one,
754 * and someone using a non-default option on Sun also bumped into
755 * that). Note that checking for >= and <= LONG_{MIN,MAX} would
756 * still be vulnerable: if a long has more bits of precision than
757 * a double, casting MIN/MAX to double may yield an approximation,
758 * and if that's rounded up, then, e.g., wholepart=LONG_MAX+1 would
759 * yield true from the C expression wholepart<=LONG_MAX, despite
760 * that wholepart is actually greater than LONG_MAX.
761 */
762 if (LONG_MIN < wholepart && wholepart < LONG_MAX) {
763 const long aslong = (long)wholepart;
Tim Peters7321ec42001-07-26 20:02:17 +0000764 return PyInt_FromLong(aslong);
Tim Peters7d791242002-11-21 22:26:37 +0000765 }
766 return PyLong_FromDouble(wholepart);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000767}
768
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769static PyObject *
Guido van Rossum2fa33db2007-08-23 22:07:24 +0000770float_round(PyObject *v, PyObject *args)
771{
772#define UNDEF_NDIGITS (-0x7fffffff) /* Unlikely ndigits value */
773 double x;
Guido van Rossum6deb1bf2007-08-31 00:27:03 +0000774 double f = 1.0;
Guido van Rossum2fa33db2007-08-23 22:07:24 +0000775 double flr, cil;
776 double rounded;
Guido van Rossum2fa33db2007-08-23 22:07:24 +0000777 int ndigits = UNDEF_NDIGITS;
778
779 if (!PyArg_ParseTuple(args, "|i", &ndigits))
780 return NULL;
781
782 x = PyFloat_AsDouble(v);
783
784 if (ndigits != UNDEF_NDIGITS) {
Guido van Rossum6deb1bf2007-08-31 00:27:03 +0000785 f = pow(10.0, ndigits);
786 x *= f;
Guido van Rossum2fa33db2007-08-23 22:07:24 +0000787 }
788
789 flr = floor(x);
790 cil = ceil(x);
791
792 if (x-flr > 0.5)
793 rounded = cil;
Guido van Rossum6deb1bf2007-08-31 00:27:03 +0000794 else if (x-flr == 0.5)
Guido van Rossum2fa33db2007-08-23 22:07:24 +0000795 rounded = fmod(flr, 2) == 0 ? flr : cil;
796 else
797 rounded = flr;
798
799 if (ndigits != UNDEF_NDIGITS) {
Guido van Rossum6deb1bf2007-08-31 00:27:03 +0000800 rounded /= f;
Guido van Rossum2fa33db2007-08-23 22:07:24 +0000801 return PyFloat_FromDouble(rounded);
802 }
803
804 return PyLong_FromDouble(rounded);
805#undef UNDEF_NDIGITS
806}
807
808static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000809float_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000810{
Brett Cannonc3647ac2005-04-26 03:45:26 +0000811 if (PyFloat_CheckExact(v))
812 Py_INCREF(v);
813 else
814 v = PyFloat_FromDouble(((PyFloatObject *)v)->ob_fval);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000815 return v;
816}
817
818
Jeremy Hylton938ace62002-07-17 16:30:39 +0000819static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +0000820float_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
821
Tim Peters6d6c1a32001-08-02 04:15:00 +0000822static PyObject *
823float_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
824{
825 PyObject *x = Py_False; /* Integer zero */
Martin v. Löwis15e62742006-02-27 16:46:16 +0000826 static char *kwlist[] = {"x", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000827
Guido van Rossumbef14172001-08-29 15:47:46 +0000828 if (type != &PyFloat_Type)
829 return float_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000830 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:float", kwlist, &x))
831 return NULL;
Neal Norwitz6ea45d32007-08-26 04:19:43 +0000832 if (PyUnicode_Check(x))
Georg Brandl428f0642007-03-18 18:35:15 +0000833 return PyFloat_FromString(x);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834 return PyNumber_Float(x);
835}
836
Guido van Rossumbef14172001-08-29 15:47:46 +0000837/* Wimpy, slow approach to tp_new calls for subtypes of float:
838 first create a regular float from whatever arguments we got,
839 then allocate a subtype instance and initialize its ob_fval
840 from the regular float. The regular float is then thrown away.
841*/
842static PyObject *
843float_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
844{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000845 PyObject *tmp, *newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +0000846
847 assert(PyType_IsSubtype(type, &PyFloat_Type));
848 tmp = float_new(&PyFloat_Type, args, kwds);
849 if (tmp == NULL)
850 return NULL;
Tim Peters2400fa42001-09-12 19:12:49 +0000851 assert(PyFloat_CheckExact(tmp));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000852 newobj = type->tp_alloc(type, 0);
853 if (newobj == NULL) {
Raymond Hettingerf4667932003-06-28 20:04:25 +0000854 Py_DECREF(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +0000855 return NULL;
Raymond Hettingerf4667932003-06-28 20:04:25 +0000856 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000857 ((PyFloatObject *)newobj)->ob_fval = ((PyFloatObject *)tmp)->ob_fval;
Guido van Rossumbef14172001-08-29 15:47:46 +0000858 Py_DECREF(tmp);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000859 return newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +0000860}
861
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000862static PyObject *
863float_getnewargs(PyFloatObject *v)
864{
865 return Py_BuildValue("(d)", v->ob_fval);
866}
867
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000868/* this is for the benefit of the pack/unpack routines below */
869
870typedef enum {
871 unknown_format, ieee_big_endian_format, ieee_little_endian_format
872} float_format_type;
873
874static float_format_type double_format, float_format;
875static float_format_type detected_double_format, detected_float_format;
876
877static PyObject *
878float_getformat(PyTypeObject *v, PyObject* arg)
879{
880 char* s;
881 float_format_type r;
882
Neal Norwitz6ea45d32007-08-26 04:19:43 +0000883 if (!PyUnicode_Check(arg)) {
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000884 PyErr_Format(PyExc_TypeError,
885 "__getformat__() argument must be string, not %.500s",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000886 Py_Type(arg)->tp_name);
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000887 return NULL;
888 }
Neal Norwitz6ea45d32007-08-26 04:19:43 +0000889 s = PyUnicode_AsString(arg);
890 if (s == NULL)
891 return NULL;
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000892 if (strcmp(s, "double") == 0) {
893 r = double_format;
894 }
895 else if (strcmp(s, "float") == 0) {
896 r = float_format;
897 }
898 else {
899 PyErr_SetString(PyExc_ValueError,
900 "__getformat__() argument 1 must be "
901 "'double' or 'float'");
902 return NULL;
903 }
904
905 switch (r) {
906 case unknown_format:
Walter Dörwald71044582007-06-22 12:26:52 +0000907 return PyUnicode_FromString("unknown");
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000908 case ieee_little_endian_format:
Walter Dörwald71044582007-06-22 12:26:52 +0000909 return PyUnicode_FromString("IEEE, little-endian");
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000910 case ieee_big_endian_format:
Walter Dörwald71044582007-06-22 12:26:52 +0000911 return PyUnicode_FromString("IEEE, big-endian");
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000912 default:
913 Py_FatalError("insane float_format or double_format");
914 return NULL;
915 }
916}
917
918PyDoc_STRVAR(float_getformat_doc,
919"float.__getformat__(typestr) -> string\n"
920"\n"
921"You probably don't want to use this function. It exists mainly to be\n"
922"used in Python's test suite.\n"
923"\n"
924"typestr must be 'double' or 'float'. This function returns whichever of\n"
925"'unknown', 'IEEE, big-endian' or 'IEEE, little-endian' best describes the\n"
926"format of floating point numbers used by the C type named by typestr.");
927
928static PyObject *
929float_setformat(PyTypeObject *v, PyObject* args)
930{
931 char* typestr;
932 char* format;
933 float_format_type f;
934 float_format_type detected;
935 float_format_type *p;
936
937 if (!PyArg_ParseTuple(args, "ss:__setformat__", &typestr, &format))
938 return NULL;
939
940 if (strcmp(typestr, "double") == 0) {
941 p = &double_format;
942 detected = detected_double_format;
943 }
944 else if (strcmp(typestr, "float") == 0) {
945 p = &float_format;
946 detected = detected_float_format;
947 }
948 else {
949 PyErr_SetString(PyExc_ValueError,
950 "__setformat__() argument 1 must "
951 "be 'double' or 'float'");
952 return NULL;
953 }
954
955 if (strcmp(format, "unknown") == 0) {
956 f = unknown_format;
957 }
958 else if (strcmp(format, "IEEE, little-endian") == 0) {
959 f = ieee_little_endian_format;
960 }
961 else if (strcmp(format, "IEEE, big-endian") == 0) {
962 f = ieee_big_endian_format;
963 }
964 else {
965 PyErr_SetString(PyExc_ValueError,
966 "__setformat__() argument 2 must be "
967 "'unknown', 'IEEE, little-endian' or "
968 "'IEEE, big-endian'");
969 return NULL;
970
971 }
972
973 if (f != unknown_format && f != detected) {
974 PyErr_Format(PyExc_ValueError,
975 "can only set %s format to 'unknown' or the "
976 "detected platform value", typestr);
977 return NULL;
978 }
979
980 *p = f;
981 Py_RETURN_NONE;
982}
983
984PyDoc_STRVAR(float_setformat_doc,
985"float.__setformat__(typestr, fmt) -> None\n"
986"\n"
987"You probably don't want to use this function. It exists mainly to be\n"
988"used in Python's test suite.\n"
989"\n"
990"typestr must be 'double' or 'float'. fmt must be one of 'unknown',\n"
991"'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be\n"
992"one of the latter two if it appears to match the underlying C reality.\n"
993"\n"
994"Overrides the automatic determination of C-level floating point type.\n"
995"This affects how floats are converted to and from binary strings.");
996
Guido van Rossumb43daf72007-08-01 18:08:08 +0000997static PyObject *
998float_getzero(PyObject *v, void *closure)
999{
1000 return PyFloat_FromDouble(0.0);
1001}
1002
Eric Smith8c663262007-08-25 02:26:07 +00001003static PyObject *
1004float__format__(PyObject *self, PyObject *args)
1005{
1006 /* when back porting this to 2.6, check type of the format_spec
1007 and call either unicode_long__format__ or
1008 string_long__format__ */
1009 return unicode_float__format__(self, args);
1010}
1011
1012PyDoc_STRVAR(float__format__doc,
1013"float.__format__(format_spec) -> string\n"
1014"\n"
1015"Formats the float according to format_spec.");
1016
1017
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001018static PyMethodDef float_methods[] = {
Guido van Rossumb43daf72007-08-01 18:08:08 +00001019 {"conjugate", (PyCFunction)float_float, METH_NOARGS,
1020 "Returns self, the complex conjugate of any float."},
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001021 {"__trunc__", (PyCFunction)float_trunc, METH_NOARGS,
1022 "Returns the Integral closest to x between 0 and x."},
1023 {"__round__", (PyCFunction)float_round, METH_VARARGS,
1024 "Returns the Integral closest to x, rounding half toward even.\n"
1025 "When an argument is passed, works like built-in round(x, ndigits)."},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001026 {"__getnewargs__", (PyCFunction)float_getnewargs, METH_NOARGS},
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001027 {"__getformat__", (PyCFunction)float_getformat,
1028 METH_O|METH_CLASS, float_getformat_doc},
1029 {"__setformat__", (PyCFunction)float_setformat,
1030 METH_VARARGS|METH_CLASS, float_setformat_doc},
Eric Smith8c663262007-08-25 02:26:07 +00001031 {"__format__", (PyCFunction)float__format__,
1032 METH_VARARGS, float__format__doc},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001033 {NULL, NULL} /* sentinel */
1034};
1035
Guido van Rossumb43daf72007-08-01 18:08:08 +00001036static PyGetSetDef float_getset[] = {
1037 {"real",
1038 (getter)float_float, (setter)NULL,
1039 "the real part of a complex number",
1040 NULL},
1041 {"imag",
1042 (getter)float_getzero, (setter)NULL,
1043 "the imaginary part of a complex number",
1044 NULL},
1045 {NULL} /* Sentinel */
1046};
1047
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001048PyDoc_STRVAR(float_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001049"float(x) -> floating point number\n\
1050\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001051Convert a string or number to a floating point number, if possible.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001052
1053
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001054static PyNumberMethods float_as_number = {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001055 float_add, /*nb_add*/
1056 float_sub, /*nb_subtract*/
1057 float_mul, /*nb_multiply*/
1058 float_rem, /*nb_remainder*/
1059 float_divmod, /*nb_divmod*/
1060 float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001061 (unaryfunc)float_neg, /*nb_negative*/
Guido van Rossumb43daf72007-08-01 18:08:08 +00001062 (unaryfunc)float_float, /*nb_positive*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001063 (unaryfunc)float_abs, /*nb_absolute*/
Jack Diederich4dafcc42006-11-28 19:15:13 +00001064 (inquiry)float_bool, /*nb_bool*/
Guido van Rossum27acb331991-10-24 14:55:28 +00001065 0, /*nb_invert*/
1066 0, /*nb_lshift*/
1067 0, /*nb_rshift*/
1068 0, /*nb_and*/
1069 0, /*nb_xor*/
1070 0, /*nb_or*/
Neil Schemenauer16c70752007-09-21 20:19:23 +00001071 0, /*nb_reserved*/
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001072 float_trunc, /*nb_int*/
1073 float_trunc, /*nb_long*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074 float_float, /*nb_float*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001075 0, /* nb_oct */
1076 0, /* nb_hex */
1077 0, /* nb_inplace_add */
1078 0, /* nb_inplace_subtract */
1079 0, /* nb_inplace_multiply */
Guido van Rossum4668b002001-08-08 05:00:18 +00001080 0, /* nb_inplace_remainder */
1081 0, /* nb_inplace_power */
1082 0, /* nb_inplace_lshift */
1083 0, /* nb_inplace_rshift */
1084 0, /* nb_inplace_and */
1085 0, /* nb_inplace_xor */
1086 0, /* nb_inplace_or */
Tim Peters63a35712001-12-11 19:57:24 +00001087 float_floor_div, /* nb_floor_divide */
Guido van Rossum4668b002001-08-08 05:00:18 +00001088 float_div, /* nb_true_divide */
1089 0, /* nb_inplace_floor_divide */
1090 0, /* nb_inplace_true_divide */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001091};
1092
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001093PyTypeObject PyFloat_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001094 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001095 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001096 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001097 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001098 (destructor)float_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00001099 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001100 0, /* tp_getattr */
1101 0, /* tp_setattr */
Michael W. Hudson08678a12004-05-26 17:36:12 +00001102 0, /* tp_compare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001103 (reprfunc)float_repr, /* tp_repr */
1104 &float_as_number, /* tp_as_number */
1105 0, /* tp_as_sequence */
1106 0, /* tp_as_mapping */
1107 (hashfunc)float_hash, /* tp_hash */
1108 0, /* tp_call */
1109 (reprfunc)float_str, /* tp_str */
1110 PyObject_GenericGetAttr, /* tp_getattro */
1111 0, /* tp_setattro */
1112 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001113 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001114 float_doc, /* tp_doc */
1115 0, /* tp_traverse */
1116 0, /* tp_clear */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001117 float_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001118 0, /* tp_weaklistoffset */
1119 0, /* tp_iter */
1120 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001121 float_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001122 0, /* tp_members */
Guido van Rossumb43daf72007-08-01 18:08:08 +00001123 float_getset, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001124 0, /* tp_base */
1125 0, /* tp_dict */
1126 0, /* tp_descr_get */
1127 0, /* tp_descr_set */
1128 0, /* tp_dictoffset */
1129 0, /* tp_init */
1130 0, /* tp_alloc */
1131 float_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001132};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001133
1134void
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001135_PyFloat_Init(void)
1136{
1137 /* We attempt to determine if this machine is using IEEE
1138 floating point formats by peering at the bits of some
1139 carefully chosen values. If it looks like we are on an
1140 IEEE platform, the float packing/unpacking routines can
1141 just copy bits, if not they resort to arithmetic & shifts
1142 and masks. The shifts & masks approach works on all finite
1143 values, but what happens to infinities, NaNs and signed
1144 zeroes on packing is an accident, and attempting to unpack
1145 a NaN or an infinity will raise an exception.
1146
1147 Note that if we're on some whacked-out platform which uses
1148 IEEE formats but isn't strictly little-endian or big-
1149 endian, we will fall back to the portable shifts & masks
1150 method. */
1151
1152#if SIZEOF_DOUBLE == 8
1153 {
1154 double x = 9006104071832581.0;
1155 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
1156 detected_double_format = ieee_big_endian_format;
1157 else if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
1158 detected_double_format = ieee_little_endian_format;
1159 else
1160 detected_double_format = unknown_format;
1161 }
1162#else
1163 detected_double_format = unknown_format;
1164#endif
1165
1166#if SIZEOF_FLOAT == 4
1167 {
1168 float y = 16711938.0;
1169 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
1170 detected_float_format = ieee_big_endian_format;
1171 else if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
1172 detected_float_format = ieee_little_endian_format;
1173 else
1174 detected_float_format = unknown_format;
1175 }
1176#else
1177 detected_float_format = unknown_format;
1178#endif
1179
1180 double_format = detected_double_format;
1181 float_format = detected_float_format;
1182}
1183
1184void
Fred Drakefd99de62000-07-09 05:02:18 +00001185PyFloat_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001186{
Guido van Rossum3fce8831999-03-12 19:43:17 +00001187 PyFloatObject *p;
1188 PyFloatBlock *list, *next;
Neal Norwitz739a8f82004-07-08 01:55:58 +00001189 unsigned i;
Guido van Rossumf61bbc81999-03-12 00:12:21 +00001190 int bc, bf; /* block count, number of freed blocks */
1191 int frem, fsum; /* remaining unfreed floats per block, total */
1192
1193 bc = 0;
1194 bf = 0;
1195 fsum = 0;
1196 list = block_list;
1197 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +00001198 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +00001199 while (list != NULL) {
Guido van Rossumf61bbc81999-03-12 00:12:21 +00001200 bc++;
1201 frem = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +00001202 for (i = 0, p = &list->objects[0];
1203 i < N_FLOATOBJECTS;
1204 i++, p++) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001205 if (PyFloat_CheckExact(p) && Py_Refcnt(p) != 0)
Guido van Rossumf61bbc81999-03-12 00:12:21 +00001206 frem++;
1207 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001208 next = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +00001209 if (frem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00001210 list->next = block_list;
1211 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +00001212 for (i = 0, p = &list->objects[0];
1213 i < N_FLOATOBJECTS;
1214 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001215 if (!PyFloat_CheckExact(p) ||
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001216 Py_Refcnt(p) == 0) {
1217 Py_Type(p) = (struct _typeobject *)
Guido van Rossumd7b5fb81999-03-19 20:59:40 +00001218 free_list;
1219 free_list = p;
1220 }
1221 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +00001222 }
1223 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001224 PyMem_FREE(list); /* XXX PyObject_FREE ??? */
Guido van Rossumf61bbc81999-03-12 00:12:21 +00001225 bf++;
1226 }
1227 fsum += frem;
Guido van Rossum3fce8831999-03-12 19:43:17 +00001228 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +00001229 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001230 if (!Py_VerboseFlag)
1231 return;
1232 fprintf(stderr, "# cleanup floats");
1233 if (!fsum) {
1234 fprintf(stderr, "\n");
1235 }
1236 else {
1237 fprintf(stderr,
1238 ": %d unfreed float%s in %d out of %d block%s\n",
1239 fsum, fsum == 1 ? "" : "s",
1240 bc - bf, bc, bc == 1 ? "" : "s");
1241 }
1242 if (Py_VerboseFlag > 1) {
1243 list = block_list;
1244 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +00001245 for (i = 0, p = &list->objects[0];
1246 i < N_FLOATOBJECTS;
1247 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001248 if (PyFloat_CheckExact(p) &&
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001249 Py_Refcnt(p) != 0) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00001250 char buf[100];
Neal Norwitz545686b2006-12-28 04:45:06 +00001251 format_float(buf, sizeof(buf), p, PREC_STR);
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001252 /* XXX(twouters) cast refcount to
1253 long until %zd is universally
1254 available
1255 */
Guido van Rossum3fce8831999-03-12 19:43:17 +00001256 fprintf(stderr,
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001257 "# <float at %p, refcnt=%ld, val=%s>\n",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001258 p, (long)Py_Refcnt(p), buf);
Guido van Rossum3fce8831999-03-12 19:43:17 +00001259 }
1260 }
1261 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +00001262 }
1263 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001264}
Tim Peters9905b942003-03-20 20:53:32 +00001265
1266/*----------------------------------------------------------------------------
1267 * _PyFloat_{Pack,Unpack}{4,8}. See floatobject.h.
1268 *
1269 * TODO: On platforms that use the standard IEEE-754 single and double
1270 * formats natively, these routines could simply copy the bytes.
1271 */
1272int
1273_PyFloat_Pack4(double x, unsigned char *p, int le)
1274{
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001275 if (float_format == unknown_format) {
1276 unsigned char sign;
1277 int e;
1278 double f;
1279 unsigned int fbits;
1280 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00001281
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001282 if (le) {
1283 p += 3;
1284 incr = -1;
1285 }
Tim Peters9905b942003-03-20 20:53:32 +00001286
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001287 if (x < 0) {
1288 sign = 1;
1289 x = -x;
1290 }
1291 else
1292 sign = 0;
Tim Peters9905b942003-03-20 20:53:32 +00001293
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001294 f = frexp(x, &e);
Tim Peters9905b942003-03-20 20:53:32 +00001295
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001296 /* Normalize f to be in the range [1.0, 2.0) */
1297 if (0.5 <= f && f < 1.0) {
1298 f *= 2.0;
1299 e--;
1300 }
1301 else if (f == 0.0)
1302 e = 0;
1303 else {
1304 PyErr_SetString(PyExc_SystemError,
1305 "frexp() result out of range");
1306 return -1;
1307 }
1308
1309 if (e >= 128)
1310 goto Overflow;
1311 else if (e < -126) {
1312 /* Gradual underflow */
1313 f = ldexp(f, 126 + e);
1314 e = 0;
1315 }
1316 else if (!(e == 0 && f == 0.0)) {
1317 e += 127;
1318 f -= 1.0; /* Get rid of leading 1 */
1319 }
1320
1321 f *= 8388608.0; /* 2**23 */
1322 fbits = (unsigned int)(f + 0.5); /* Round */
1323 assert(fbits <= 8388608);
1324 if (fbits >> 23) {
1325 /* The carry propagated out of a string of 23 1 bits. */
1326 fbits = 0;
1327 ++e;
1328 if (e >= 255)
1329 goto Overflow;
1330 }
1331
1332 /* First byte */
1333 *p = (sign << 7) | (e >> 1);
1334 p += incr;
1335
1336 /* Second byte */
1337 *p = (char) (((e & 1) << 7) | (fbits >> 16));
1338 p += incr;
1339
1340 /* Third byte */
1341 *p = (fbits >> 8) & 0xFF;
1342 p += incr;
1343
1344 /* Fourth byte */
1345 *p = fbits & 0xFF;
1346
1347 /* Done */
1348 return 0;
1349
1350 Overflow:
1351 PyErr_SetString(PyExc_OverflowError,
1352 "float too large to pack with f format");
Tim Peters9905b942003-03-20 20:53:32 +00001353 return -1;
1354 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001355 else {
Michael W. Hudson3095ad02005-06-30 00:02:26 +00001356 float y = (float)x;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001357 const char *s = (char*)&y;
1358 int i, incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00001359
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001360 if ((float_format == ieee_little_endian_format && !le)
1361 || (float_format == ieee_big_endian_format && le)) {
1362 p += 3;
1363 incr = -1;
1364 }
1365
1366 for (i = 0; i < 4; i++) {
1367 *p = *s++;
1368 p += incr;
1369 }
1370 return 0;
Tim Peters9905b942003-03-20 20:53:32 +00001371 }
Tim Peters9905b942003-03-20 20:53:32 +00001372}
1373
1374int
1375_PyFloat_Pack8(double x, unsigned char *p, int le)
1376{
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001377 if (double_format == unknown_format) {
1378 unsigned char sign;
1379 int e;
1380 double f;
1381 unsigned int fhi, flo;
1382 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00001383
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001384 if (le) {
1385 p += 7;
1386 incr = -1;
1387 }
Tim Peters9905b942003-03-20 20:53:32 +00001388
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001389 if (x < 0) {
1390 sign = 1;
1391 x = -x;
1392 }
1393 else
1394 sign = 0;
Tim Peters9905b942003-03-20 20:53:32 +00001395
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001396 f = frexp(x, &e);
Tim Peters9905b942003-03-20 20:53:32 +00001397
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001398 /* Normalize f to be in the range [1.0, 2.0) */
1399 if (0.5 <= f && f < 1.0) {
1400 f *= 2.0;
1401 e--;
1402 }
1403 else if (f == 0.0)
1404 e = 0;
1405 else {
1406 PyErr_SetString(PyExc_SystemError,
1407 "frexp() result out of range");
1408 return -1;
1409 }
1410
1411 if (e >= 1024)
1412 goto Overflow;
1413 else if (e < -1022) {
1414 /* Gradual underflow */
1415 f = ldexp(f, 1022 + e);
1416 e = 0;
1417 }
1418 else if (!(e == 0 && f == 0.0)) {
1419 e += 1023;
1420 f -= 1.0; /* Get rid of leading 1 */
1421 }
1422
1423 /* fhi receives the high 28 bits; flo the low 24 bits (== 52 bits) */
1424 f *= 268435456.0; /* 2**28 */
1425 fhi = (unsigned int)f; /* Truncate */
1426 assert(fhi < 268435456);
1427
1428 f -= (double)fhi;
1429 f *= 16777216.0; /* 2**24 */
1430 flo = (unsigned int)(f + 0.5); /* Round */
1431 assert(flo <= 16777216);
1432 if (flo >> 24) {
1433 /* The carry propagated out of a string of 24 1 bits. */
1434 flo = 0;
1435 ++fhi;
1436 if (fhi >> 28) {
1437 /* And it also progagated out of the next 28 bits. */
1438 fhi = 0;
1439 ++e;
1440 if (e >= 2047)
1441 goto Overflow;
1442 }
1443 }
1444
1445 /* First byte */
1446 *p = (sign << 7) | (e >> 4);
1447 p += incr;
1448
1449 /* Second byte */
1450 *p = (unsigned char) (((e & 0xF) << 4) | (fhi >> 24));
1451 p += incr;
1452
1453 /* Third byte */
1454 *p = (fhi >> 16) & 0xFF;
1455 p += incr;
1456
1457 /* Fourth byte */
1458 *p = (fhi >> 8) & 0xFF;
1459 p += incr;
1460
1461 /* Fifth byte */
1462 *p = fhi & 0xFF;
1463 p += incr;
1464
1465 /* Sixth byte */
1466 *p = (flo >> 16) & 0xFF;
1467 p += incr;
1468
1469 /* Seventh byte */
1470 *p = (flo >> 8) & 0xFF;
1471 p += incr;
1472
1473 /* Eighth byte */
1474 *p = flo & 0xFF;
1475 p += incr;
1476
1477 /* Done */
1478 return 0;
1479
1480 Overflow:
1481 PyErr_SetString(PyExc_OverflowError,
1482 "float too large to pack with d format");
Tim Peters9905b942003-03-20 20:53:32 +00001483 return -1;
1484 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001485 else {
1486 const char *s = (char*)&x;
1487 int i, incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00001488
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001489 if ((double_format == ieee_little_endian_format && !le)
1490 || (double_format == ieee_big_endian_format && le)) {
1491 p += 7;
1492 incr = -1;
Tim Peters9905b942003-03-20 20:53:32 +00001493 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001494
1495 for (i = 0; i < 8; i++) {
1496 *p = *s++;
1497 p += incr;
1498 }
1499 return 0;
Tim Peters9905b942003-03-20 20:53:32 +00001500 }
Tim Peters9905b942003-03-20 20:53:32 +00001501}
1502
Neal Norwitz545686b2006-12-28 04:45:06 +00001503/* Should only be used by marshal. */
1504int
1505_PyFloat_Repr(double x, char *p, size_t len)
1506{
1507 format_double(p, len, x, PREC_REPR);
1508 return (int)strlen(p);
1509}
1510
Tim Peters9905b942003-03-20 20:53:32 +00001511double
1512_PyFloat_Unpack4(const unsigned char *p, int le)
1513{
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001514 if (float_format == unknown_format) {
1515 unsigned char sign;
1516 int e;
1517 unsigned int f;
1518 double x;
1519 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00001520
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001521 if (le) {
1522 p += 3;
1523 incr = -1;
1524 }
1525
1526 /* First byte */
1527 sign = (*p >> 7) & 1;
1528 e = (*p & 0x7F) << 1;
1529 p += incr;
1530
1531 /* Second byte */
1532 e |= (*p >> 7) & 1;
1533 f = (*p & 0x7F) << 16;
1534 p += incr;
1535
1536 if (e == 255) {
1537 PyErr_SetString(
1538 PyExc_ValueError,
1539 "can't unpack IEEE 754 special value "
1540 "on non-IEEE platform");
1541 return -1;
1542 }
1543
1544 /* Third byte */
1545 f |= *p << 8;
1546 p += incr;
1547
1548 /* Fourth byte */
1549 f |= *p;
1550
1551 x = (double)f / 8388608.0;
1552
1553 /* XXX This sadly ignores Inf/NaN issues */
1554 if (e == 0)
1555 e = -126;
1556 else {
1557 x += 1.0;
1558 e -= 127;
1559 }
1560 x = ldexp(x, e);
1561
1562 if (sign)
1563 x = -x;
1564
1565 return x;
Tim Peters9905b942003-03-20 20:53:32 +00001566 }
Tim Peters9905b942003-03-20 20:53:32 +00001567 else {
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00001568 float x;
1569
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001570 if ((float_format == ieee_little_endian_format && !le)
1571 || (float_format == ieee_big_endian_format && le)) {
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00001572 char buf[4];
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001573 char *d = &buf[3];
1574 int i;
Tim Peters9905b942003-03-20 20:53:32 +00001575
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001576 for (i = 0; i < 4; i++) {
1577 *d-- = *p++;
1578 }
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00001579 memcpy(&x, buf, 4);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001580 }
1581 else {
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00001582 memcpy(&x, p, 4);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001583 }
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00001584
1585 return x;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001586 }
Tim Peters9905b942003-03-20 20:53:32 +00001587}
1588
1589double
1590_PyFloat_Unpack8(const unsigned char *p, int le)
1591{
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001592 if (double_format == unknown_format) {
1593 unsigned char sign;
1594 int e;
1595 unsigned int fhi, flo;
1596 double x;
1597 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00001598
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001599 if (le) {
1600 p += 7;
1601 incr = -1;
1602 }
1603
1604 /* First byte */
1605 sign = (*p >> 7) & 1;
1606 e = (*p & 0x7F) << 4;
1607
1608 p += incr;
1609
1610 /* Second byte */
1611 e |= (*p >> 4) & 0xF;
1612 fhi = (*p & 0xF) << 24;
1613 p += incr;
1614
1615 if (e == 2047) {
1616 PyErr_SetString(
1617 PyExc_ValueError,
1618 "can't unpack IEEE 754 special value "
1619 "on non-IEEE platform");
1620 return -1.0;
1621 }
1622
1623 /* Third byte */
1624 fhi |= *p << 16;
1625 p += incr;
1626
1627 /* Fourth byte */
1628 fhi |= *p << 8;
1629 p += incr;
1630
1631 /* Fifth byte */
1632 fhi |= *p;
1633 p += incr;
1634
1635 /* Sixth byte */
1636 flo = *p << 16;
1637 p += incr;
1638
1639 /* Seventh byte */
1640 flo |= *p << 8;
1641 p += incr;
1642
1643 /* Eighth byte */
1644 flo |= *p;
1645
1646 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
1647 x /= 268435456.0; /* 2**28 */
1648
1649 if (e == 0)
1650 e = -1022;
1651 else {
1652 x += 1.0;
1653 e -= 1023;
1654 }
1655 x = ldexp(x, e);
1656
1657 if (sign)
1658 x = -x;
1659
1660 return x;
Tim Peters9905b942003-03-20 20:53:32 +00001661 }
Tim Peters9905b942003-03-20 20:53:32 +00001662 else {
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00001663 double x;
1664
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001665 if ((double_format == ieee_little_endian_format && !le)
1666 || (double_format == ieee_big_endian_format && le)) {
1667 char buf[8];
1668 char *d = &buf[7];
1669 int i;
1670
1671 for (i = 0; i < 8; i++) {
1672 *d-- = *p++;
1673 }
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00001674 memcpy(&x, buf, 8);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001675 }
1676 else {
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00001677 memcpy(&x, p, 8);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001678 }
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00001679
1680 return x;
Tim Peters9905b942003-03-20 20:53:32 +00001681 }
Tim Peters9905b942003-03-20 20:53:32 +00001682}