blob: 01e5825c492a99789247fe45b227a8417cdc3406 [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"
Christian Heimesc94e2b52008-01-14 04:13:37 +00008#include "structseq.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00009
Guido van Rossum3f5da241990-12-20 15:06:42 +000010#include <ctype.h>
Christian Heimesdfdfaab2007-12-01 11:20:10 +000011#include <float.h>
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000012
Mark Dickinson7103aa42008-07-15 19:08:33 +000013#undef MAX
14#undef MIN
15#define MAX(x, y) ((x) < (y) ? (y) : (x))
16#define MIN(x, y) ((x) < (y) ? (x) : (y))
17
Neal Norwitz5f95a792008-01-25 08:04:16 +000018#ifdef _OSF_SOURCE
19/* OSF1 5.1 doesn't make this available with XOPEN_SOURCE_EXTENDED defined */
20extern int finite(double);
21#endif
22
Guido van Rossum93ad0df1997-05-13 21:00:42 +000023/* Special free list -- see comments for same code in intobject.c. */
Guido van Rossum93ad0df1997-05-13 21:00:42 +000024#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000025#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
Guido van Rossumf61bbc81999-03-12 00:12:21 +000026#define N_FLOATOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyFloatObject))
Guido van Rossum3fce8831999-03-12 19:43:17 +000027
Guido van Rossum3fce8831999-03-12 19:43:17 +000028struct _floatblock {
29 struct _floatblock *next;
30 PyFloatObject objects[N_FLOATOBJECTS];
31};
32
33typedef struct _floatblock PyFloatBlock;
34
35static PyFloatBlock *block_list = NULL;
36static PyFloatObject *free_list = NULL;
37
Guido van Rossum93ad0df1997-05-13 21:00:42 +000038static PyFloatObject *
Fred Drakefd99de62000-07-09 05:02:18 +000039fill_free_list(void)
Guido van Rossum93ad0df1997-05-13 21:00:42 +000040{
41 PyFloatObject *p, *q;
Guido van Rossumb18618d2000-05-03 23:44:39 +000042 /* XXX Float blocks escape the object heap. Use PyObject_MALLOC ??? */
43 p = (PyFloatObject *) PyMem_MALLOC(sizeof(PyFloatBlock));
Guido van Rossum93ad0df1997-05-13 21:00:42 +000044 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +000045 return (PyFloatObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +000046 ((PyFloatBlock *)p)->next = block_list;
47 block_list = (PyFloatBlock *)p;
48 p = &((PyFloatBlock *)p)->objects[0];
Guido van Rossum93ad0df1997-05-13 21:00:42 +000049 q = p + N_FLOATOBJECTS;
50 while (--q > p)
Christian Heimese93237d2007-12-19 02:37:44 +000051 Py_TYPE(q) = (struct _typeobject *)(q-1);
52 Py_TYPE(q) = NULL;
Guido van Rossum93ad0df1997-05-13 21:00:42 +000053 return p + N_FLOATOBJECTS - 1;
54}
55
Christian Heimesdfdfaab2007-12-01 11:20:10 +000056double
57PyFloat_GetMax(void)
58{
59 return DBL_MAX;
60}
61
62double
63PyFloat_GetMin(void)
64{
65 return DBL_MIN;
66}
67
Christian Heimes796fc312008-01-30 18:58:29 +000068static PyTypeObject FloatInfoType = {0, 0, 0, 0, 0, 0};
Christian Heimesc94e2b52008-01-14 04:13:37 +000069
70PyDoc_STRVAR(floatinfo__doc__,
Benjamin Petersonbf9ec9b2009-06-16 23:13:09 +000071"sys.float_info\n\
Christian Heimesc94e2b52008-01-14 04:13:37 +000072\n\
73A structseq holding information about the float type. It contains low level\n\
74information about the precision and internal representation. Please study\n\
75your system's :file:`float.h` for more information.");
76
77static PyStructSequence_Field floatinfo_fields[] = {
78 {"max", "DBL_MAX -- maximum representable finite float"},
79 {"max_exp", "DBL_MAX_EXP -- maximum int e such that radix**(e-1) "
80 "is representable"},
81 {"max_10_exp", "DBL_MAX_10_EXP -- maximum int e such that 10**e "
82 "is representable"},
83 {"min", "DBL_MIN -- Minimum positive normalizer float"},
84 {"min_exp", "DBL_MIN_EXP -- minimum int e such that radix**(e-1) "
85 "is a normalized float"},
86 {"min_10_exp", "DBL_MIN_10_EXP -- minimum int e such that 10**e is "
87 "a normalized"},
88 {"dig", "DBL_DIG -- digits"},
89 {"mant_dig", "DBL_MANT_DIG -- mantissa digits"},
90 {"epsilon", "DBL_EPSILON -- Difference between 1 and the next "
91 "representable float"},
92 {"radix", "FLT_RADIX -- radix of exponent"},
93 {"rounds", "FLT_ROUNDS -- addition rounds"},
94 {0}
95};
96
97static PyStructSequence_Desc floatinfo_desc = {
Benjamin Petersonbf9ec9b2009-06-16 23:13:09 +000098 "sys.float_info", /* name */
Christian Heimesc94e2b52008-01-14 04:13:37 +000099 floatinfo__doc__, /* doc */
100 floatinfo_fields, /* fields */
101 11
102};
103
Christian Heimesdfdfaab2007-12-01 11:20:10 +0000104PyObject *
105PyFloat_GetInfo(void)
106{
Christian Heimes796fc312008-01-30 18:58:29 +0000107 PyObject* floatinfo;
Christian Heimesc94e2b52008-01-14 04:13:37 +0000108 int pos = 0;
Christian Heimesdfdfaab2007-12-01 11:20:10 +0000109
Christian Heimesc94e2b52008-01-14 04:13:37 +0000110 floatinfo = PyStructSequence_New(&FloatInfoType);
111 if (floatinfo == NULL) {
112 return NULL;
113 }
Christian Heimesdfdfaab2007-12-01 11:20:10 +0000114
Christian Heimesc94e2b52008-01-14 04:13:37 +0000115#define SetIntFlag(flag) \
116 PyStructSequence_SET_ITEM(floatinfo, pos++, PyInt_FromLong(flag))
117#define SetDblFlag(flag) \
118 PyStructSequence_SET_ITEM(floatinfo, pos++, PyFloat_FromDouble(flag))
Christian Heimesdfdfaab2007-12-01 11:20:10 +0000119
Christian Heimesc94e2b52008-01-14 04:13:37 +0000120 SetDblFlag(DBL_MAX);
121 SetIntFlag(DBL_MAX_EXP);
122 SetIntFlag(DBL_MAX_10_EXP);
123 SetDblFlag(DBL_MIN);
124 SetIntFlag(DBL_MIN_EXP);
125 SetIntFlag(DBL_MIN_10_EXP);
126 SetIntFlag(DBL_DIG);
127 SetIntFlag(DBL_MANT_DIG);
128 SetDblFlag(DBL_EPSILON);
129 SetIntFlag(FLT_RADIX);
130 SetIntFlag(FLT_ROUNDS);
131#undef SetIntFlag
132#undef SetDblFlag
133
134 if (PyErr_Occurred()) {
135 Py_CLEAR(floatinfo);
136 return NULL;
137 }
Christian Heimesc94e2b52008-01-14 04:13:37 +0000138 return floatinfo;
Christian Heimesdfdfaab2007-12-01 11:20:10 +0000139}
140
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142PyFloat_FromDouble(double fval)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143{
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000144 register PyFloatObject *op;
145 if (free_list == NULL) {
146 if ((free_list = fill_free_list()) == NULL)
147 return NULL;
148 }
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000149 /* Inline PyObject_New */
Guido van Rossum93ad0df1997-05-13 21:00:42 +0000150 op = free_list;
Christian Heimese93237d2007-12-19 02:37:44 +0000151 free_list = (PyFloatObject *)Py_TYPE(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000152 PyObject_INIT(op, &PyFloat_Type);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000153 op->ob_fval = fval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155}
156
Tim Petersef14d732000-09-23 03:39:17 +0000157/**************************************************************************
158RED_FLAG 22-Sep-2000 tim
159PyFloat_FromString's pend argument is braindead. Prior to this RED_FLAG,
160
1611. If v was a regular string, *pend was set to point to its terminating
162 null byte. That's useless (the caller can find that without any
163 help from this function!).
164
1652. If v was a Unicode string, or an object convertible to a character
166 buffer, *pend was set to point into stack trash (the auto temp
167 vector holding the character buffer). That was downright dangerous.
168
169Since we can't change the interface of a public API function, pend is
170still supported but now *officially* useless: if pend is not NULL,
171*pend is set to NULL.
172**************************************************************************/
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000173PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000174PyFloat_FromString(PyObject *v, char **pend)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000175{
Mark Dickinson6d6b2202009-04-26 16:04:05 +0000176 const char *s, *last, *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000177 double x;
Tim Petersef14d732000-09-23 03:39:17 +0000178 char buffer[256]; /* for errors */
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000179#ifdef Py_USING_UNICODE
Mark Dickinson8568b192009-10-26 21:11:20 +0000180 char *s_buffer = NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000181#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000182 Py_ssize_t len;
Mark Dickinson8568b192009-10-26 21:11:20 +0000183 PyObject *result = NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000184
Tim Petersef14d732000-09-23 03:39:17 +0000185 if (pend)
186 *pend = NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000187 if (PyString_Check(v)) {
188 s = PyString_AS_STRING(v);
189 len = PyString_GET_SIZE(v);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000190 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000191#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000192 else if (PyUnicode_Check(v)) {
Mark Dickinson8568b192009-10-26 21:11:20 +0000193 s_buffer = (char *)PyMem_MALLOC(PyUnicode_GET_SIZE(v)+1);
194 if (s_buffer == NULL)
195 return PyErr_NoMemory();
Tim Petersef14d732000-09-23 03:39:17 +0000196 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000197 PyUnicode_GET_SIZE(v),
Tim Petersd2364e82001-11-01 20:09:42 +0000198 s_buffer,
Guido van Rossum9e896b32000-04-05 20:11:21 +0000199 NULL))
Mark Dickinson8568b192009-10-26 21:11:20 +0000200 goto error;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000201 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000202 len = strlen(s);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000203 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000204#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +0000205 else if (PyObject_AsCharBuffer(v, &s, &len)) {
206 PyErr_SetString(PyExc_TypeError,
Mark Dickinson8568b192009-10-26 21:11:20 +0000207 "float() argument must be a string or a number");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000208 return NULL;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000209 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000210 last = s + len;
Mark Dickinson6d6b2202009-04-26 16:04:05 +0000211
Mark Dickinson777e4ff2009-05-03 20:59:48 +0000212 while (Py_ISSPACE(*s))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000213 s++;
Mark Dickinson6d6b2202009-04-26 16:04:05 +0000214 /* We don't care about overflow or underflow. If the platform
215 * supports them, infinities and signed zeroes (on underflow) are
216 * fine. */
Mark Dickinson8568b192009-10-26 21:11:20 +0000217 x = PyOS_string_to_double(s, (char **)&end, NULL);
218 if (x == -1.0 && PyErr_Occurred())
219 goto error;
Mark Dickinson777e4ff2009-05-03 20:59:48 +0000220 while (Py_ISSPACE(*end))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000221 end++;
Mark Dickinson8568b192009-10-26 21:11:20 +0000222 if (end == last)
223 result = PyFloat_FromDouble(x);
224 else {
225 PyOS_snprintf(buffer, sizeof(buffer),
226 "invalid literal for float(): %.200s", s);
227 PyErr_SetString(PyExc_ValueError, buffer);
228 result = NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000229 }
Mark Dickinson8568b192009-10-26 21:11:20 +0000230
231 error:
232#ifdef Py_USING_UNICODE
233 if (s_buffer)
234 PyMem_FREE(s_buffer);
235#endif
236 return result;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000237}
238
Guido van Rossum234f9421993-06-17 12:35:49 +0000239static void
Fred Drakefd99de62000-07-09 05:02:18 +0000240float_dealloc(PyFloatObject *op)
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000241{
Guido van Rossum9475a232001-10-05 20:51:39 +0000242 if (PyFloat_CheckExact(op)) {
Christian Heimese93237d2007-12-19 02:37:44 +0000243 Py_TYPE(op) = (struct _typeobject *)free_list;
Guido van Rossum9475a232001-10-05 20:51:39 +0000244 free_list = op;
245 }
246 else
Christian Heimese93237d2007-12-19 02:37:44 +0000247 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000248}
249
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250double
Fred Drakefd99de62000-07-09 05:02:18 +0000251PyFloat_AsDouble(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000252{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000253 PyNumberMethods *nb;
254 PyFloatObject *fo;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000255 double val;
Tim Petersd2364e82001-11-01 20:09:42 +0000256
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000257 if (op && PyFloat_Check(op))
258 return PyFloat_AS_DOUBLE((PyFloatObject*) op);
Tim Petersd2364e82001-11-01 20:09:42 +0000259
Neil Schemenauer2c77e902002-11-18 16:06:21 +0000260 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000261 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262 return -1;
263 }
Tim Petersd2364e82001-11-01 20:09:42 +0000264
Christian Heimese93237d2007-12-19 02:37:44 +0000265 if ((nb = Py_TYPE(op)->tp_as_number) == NULL || nb->nb_float == NULL) {
Neil Schemenauer2c77e902002-11-18 16:06:21 +0000266 PyErr_SetString(PyExc_TypeError, "a float is required");
267 return -1;
268 }
269
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000270 fo = (PyFloatObject*) (*nb->nb_float) (op);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000271 if (fo == NULL)
272 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000273 if (!PyFloat_Check(fo)) {
274 PyErr_SetString(PyExc_TypeError,
275 "nb_float should return float object");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000276 return -1;
277 }
Tim Petersd2364e82001-11-01 20:09:42 +0000278
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000279 val = PyFloat_AS_DOUBLE(fo);
280 Py_DECREF(fo);
Tim Petersd2364e82001-11-01 20:09:42 +0000281
Guido van Rossumb6775db1994-08-01 11:34:53 +0000282 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283}
284
285/* Methods */
286
Neil Schemenauer32117e52001-01-04 01:44:34 +0000287/* Macro and helper that convert PyObject obj to a C double and store
288 the value in dbl; this replaces the functionality of the coercion
Tim Peters77d8a4f2001-12-11 20:31:34 +0000289 slot function. If conversion to double raises an exception, obj is
290 set to NULL, and the function invoking this macro returns NULL. If
291 obj is not of float, int or long type, Py_NotImplemented is incref'ed,
292 stored in obj, and returned from the function invoking this macro.
293*/
Raymond Hettinger9c437af2008-06-24 22:46:07 +0000294#define CONVERT_TO_DOUBLE(obj, dbl) \
295 if (PyFloat_Check(obj)) \
296 dbl = PyFloat_AS_DOUBLE(obj); \
297 else if (convert_to_double(&(obj), &(dbl)) < 0) \
298 return obj;
Neil Schemenauer32117e52001-01-04 01:44:34 +0000299
300static int
Tim Peters9fffa3e2001-09-04 05:14:19 +0000301convert_to_double(PyObject **v, double *dbl)
Neil Schemenauer32117e52001-01-04 01:44:34 +0000302{
303 register PyObject *obj = *v;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000304
Neil Schemenauer32117e52001-01-04 01:44:34 +0000305 if (PyInt_Check(obj)) {
306 *dbl = (double)PyInt_AS_LONG(obj);
307 }
308 else if (PyLong_Check(obj)) {
Neil Schemenauer32117e52001-01-04 01:44:34 +0000309 *dbl = PyLong_AsDouble(obj);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000310 if (*dbl == -1.0 && PyErr_Occurred()) {
311 *v = NULL;
312 return -1;
313 }
Neil Schemenauer32117e52001-01-04 01:44:34 +0000314 }
315 else {
316 Py_INCREF(Py_NotImplemented);
317 *v = Py_NotImplemented;
318 return -1;
319 }
320 return 0;
321}
322
Eric Smithcfaf79c2009-10-26 14:48:55 +0000323/* XXX PyFloat_AsString and PyFloat_AsReprString are deprecated:
Tim Peters97019e42001-11-28 22:43:45 +0000324 XXX they pass a char buffer without passing a length.
325*/
Guido van Rossum57072eb1999-12-23 19:00:28 +0000326void
Fred Drakefd99de62000-07-09 05:02:18 +0000327PyFloat_AsString(char *buf, PyFloatObject *v)
Guido van Rossum57072eb1999-12-23 19:00:28 +0000328{
Eric Smithcfaf79c2009-10-26 14:48:55 +0000329 char *tmp = PyOS_double_to_string(v->ob_fval, 'g',
330 PyFloat_STR_PRECISION,
331 Py_DTSF_ADD_DOT_0, NULL);
332 strcpy(buf, tmp);
333 PyMem_Free(tmp);
Guido van Rossum57072eb1999-12-23 19:00:28 +0000334}
335
Tim Peters72f98e92001-05-08 15:19:57 +0000336void
337PyFloat_AsReprString(char *buf, PyFloatObject *v)
338{
Eric Smithcfaf79c2009-10-26 14:48:55 +0000339 char * tmp = PyOS_double_to_string(v->ob_fval, 'r', 0,
340 Py_DTSF_ADD_DOT_0, NULL);
341 strcpy(buf, tmp);
342 PyMem_Free(tmp);
Tim Peters72f98e92001-05-08 15:19:57 +0000343}
344
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000345/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000346static int
Fred Drakefd99de62000-07-09 05:02:18 +0000347float_print(PyFloatObject *v, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000348{
Eric Smithcfaf79c2009-10-26 14:48:55 +0000349 char *buf;
350 if (flags & Py_PRINT_RAW)
351 buf = PyOS_double_to_string(v->ob_fval,
352 'g', PyFloat_STR_PRECISION,
353 Py_DTSF_ADD_DOT_0, NULL);
354 else
355 buf = PyOS_double_to_string(v->ob_fval,
356 'r', 0, Py_DTSF_ADD_DOT_0, NULL);
Brett Cannon01531592007-09-17 03:28:34 +0000357 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358 fputs(buf, fp);
Brett Cannon01531592007-09-17 03:28:34 +0000359 Py_END_ALLOW_THREADS
Eric Smithcfaf79c2009-10-26 14:48:55 +0000360 PyMem_Free(buf);
Guido van Rossum90933611991-06-07 16:10:43 +0000361 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362}
363
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364static PyObject *
Eric Smithcfaf79c2009-10-26 14:48:55 +0000365float_str_or_repr(PyFloatObject *v, int precision, char format_code)
366{
367 PyObject *result;
368 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
369 format_code, precision,
370 Py_DTSF_ADD_DOT_0,
371 NULL);
372 if (!buf)
373 return PyErr_NoMemory();
374 result = PyString_FromString(buf);
375 PyMem_Free(buf);
376 return result;
377}
378
379static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000380float_repr(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000381{
Eric Smithcfaf79c2009-10-26 14:48:55 +0000382 return float_str_or_repr(v, 0, 'r');
Guido van Rossum57072eb1999-12-23 19:00:28 +0000383}
384
385static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000386float_str(PyFloatObject *v)
Guido van Rossum57072eb1999-12-23 19:00:28 +0000387{
Eric Smithcfaf79c2009-10-26 14:48:55 +0000388 return float_str_or_repr(v, PyFloat_STR_PRECISION, 'g');
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389}
390
Tim Peters307fa782004-09-23 08:06:40 +0000391/* Comparison is pretty much a nightmare. When comparing float to float,
392 * we do it as straightforwardly (and long-windedly) as conceivable, so
393 * that, e.g., Python x == y delivers the same result as the platform
394 * C x == y when x and/or y is a NaN.
395 * When mixing float with an integer type, there's no good *uniform* approach.
396 * Converting the double to an integer obviously doesn't work, since we
397 * may lose info from fractional bits. Converting the integer to a double
398 * also has two failure modes: (1) a long int may trigger overflow (too
399 * large to fit in the dynamic range of a C double); (2) even a C long may have
400 * more bits than fit in a C double (e.g., on a a 64-bit box long may have
401 * 63 bits of precision, but a C double probably has only 53), and then
402 * we can falsely claim equality when low-order integer bits are lost by
403 * coercion to double. So this part is painful too.
404 */
405
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000406static PyObject*
407float_richcompare(PyObject *v, PyObject *w, int op)
408{
409 double i, j;
410 int r = 0;
411
Tim Peters307fa782004-09-23 08:06:40 +0000412 assert(PyFloat_Check(v));
413 i = PyFloat_AS_DOUBLE(v);
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000414
Tim Peters307fa782004-09-23 08:06:40 +0000415 /* Switch on the type of w. Set i and j to doubles to be compared,
416 * and op to the richcomp to use.
417 */
418 if (PyFloat_Check(w))
419 j = PyFloat_AS_DOUBLE(w);
420
Kristján Valur Jónssonf94323f2006-05-25 15:53:30 +0000421 else if (!Py_IS_FINITE(i)) {
Tim Peters307fa782004-09-23 08:06:40 +0000422 if (PyInt_Check(w) || PyLong_Check(w))
Tim Peterse1c69b32004-09-23 19:22:41 +0000423 /* If i is an infinity, its magnitude exceeds any
424 * finite integer, so it doesn't matter which int we
425 * compare i with. If i is a NaN, similarly.
Tim Peters307fa782004-09-23 08:06:40 +0000426 */
427 j = 0.0;
428 else
429 goto Unimplemented;
430 }
431
432 else if (PyInt_Check(w)) {
433 long jj = PyInt_AS_LONG(w);
434 /* In the worst realistic case I can imagine, C double is a
435 * Cray single with 48 bits of precision, and long has 64
436 * bits.
437 */
Tim Peterse1c69b32004-09-23 19:22:41 +0000438#if SIZEOF_LONG > 6
Tim Peters307fa782004-09-23 08:06:40 +0000439 unsigned long abs = (unsigned long)(jj < 0 ? -jj : jj);
440 if (abs >> 48) {
441 /* Needs more than 48 bits. Make it take the
442 * PyLong path.
443 */
444 PyObject *result;
445 PyObject *ww = PyLong_FromLong(jj);
446
447 if (ww == NULL)
448 return NULL;
449 result = float_richcompare(v, ww, op);
450 Py_DECREF(ww);
451 return result;
452 }
453#endif
454 j = (double)jj;
455 assert((long)j == jj);
456 }
457
458 else if (PyLong_Check(w)) {
459 int vsign = i == 0.0 ? 0 : i < 0.0 ? -1 : 1;
460 int wsign = _PyLong_Sign(w);
461 size_t nbits;
Tim Peters307fa782004-09-23 08:06:40 +0000462 int exponent;
463
464 if (vsign != wsign) {
465 /* Magnitudes are irrelevant -- the signs alone
466 * determine the outcome.
467 */
468 i = (double)vsign;
469 j = (double)wsign;
470 goto Compare;
471 }
472 /* The signs are the same. */
473 /* Convert w to a double if it fits. In particular, 0 fits. */
474 nbits = _PyLong_NumBits(w);
475 if (nbits == (size_t)-1 && PyErr_Occurred()) {
476 /* This long is so large that size_t isn't big enough
Tim Peterse1c69b32004-09-23 19:22:41 +0000477 * to hold the # of bits. Replace with little doubles
478 * that give the same outcome -- w is so large that
479 * its magnitude must exceed the magnitude of any
480 * finite float.
Tim Peters307fa782004-09-23 08:06:40 +0000481 */
482 PyErr_Clear();
483 i = (double)vsign;
484 assert(wsign != 0);
485 j = wsign * 2.0;
486 goto Compare;
487 }
488 if (nbits <= 48) {
489 j = PyLong_AsDouble(w);
490 /* It's impossible that <= 48 bits overflowed. */
491 assert(j != -1.0 || ! PyErr_Occurred());
492 goto Compare;
493 }
494 assert(wsign != 0); /* else nbits was 0 */
495 assert(vsign != 0); /* if vsign were 0, then since wsign is
496 * not 0, we would have taken the
497 * vsign != wsign branch at the start */
498 /* We want to work with non-negative numbers. */
499 if (vsign < 0) {
500 /* "Multiply both sides" by -1; this also swaps the
501 * comparator.
502 */
503 i = -i;
504 op = _Py_SwappedOp[op];
505 }
506 assert(i > 0.0);
Neal Norwitzb2da01b2006-01-08 01:11:25 +0000507 (void) frexp(i, &exponent);
Tim Peters307fa782004-09-23 08:06:40 +0000508 /* exponent is the # of bits in v before the radix point;
509 * we know that nbits (the # of bits in w) > 48 at this point
510 */
511 if (exponent < 0 || (size_t)exponent < nbits) {
512 i = 1.0;
513 j = 2.0;
514 goto Compare;
515 }
516 if ((size_t)exponent > nbits) {
517 i = 2.0;
518 j = 1.0;
519 goto Compare;
520 }
521 /* v and w have the same number of bits before the radix
522 * point. Construct two longs that have the same comparison
523 * outcome.
524 */
525 {
526 double fracpart;
527 double intpart;
528 PyObject *result = NULL;
529 PyObject *one = NULL;
530 PyObject *vv = NULL;
531 PyObject *ww = w;
532
533 if (wsign < 0) {
534 ww = PyNumber_Negative(w);
535 if (ww == NULL)
536 goto Error;
537 }
538 else
539 Py_INCREF(ww);
540
541 fracpart = modf(i, &intpart);
542 vv = PyLong_FromDouble(intpart);
543 if (vv == NULL)
544 goto Error;
545
546 if (fracpart != 0.0) {
547 /* Shift left, and or a 1 bit into vv
548 * to represent the lost fraction.
549 */
550 PyObject *temp;
551
552 one = PyInt_FromLong(1);
553 if (one == NULL)
554 goto Error;
555
556 temp = PyNumber_Lshift(ww, one);
557 if (temp == NULL)
558 goto Error;
559 Py_DECREF(ww);
560 ww = temp;
561
562 temp = PyNumber_Lshift(vv, one);
563 if (temp == NULL)
564 goto Error;
565 Py_DECREF(vv);
566 vv = temp;
567
568 temp = PyNumber_Or(vv, one);
569 if (temp == NULL)
570 goto Error;
571 Py_DECREF(vv);
572 vv = temp;
573 }
574
575 r = PyObject_RichCompareBool(vv, ww, op);
576 if (r < 0)
577 goto Error;
578 result = PyBool_FromLong(r);
579 Error:
580 Py_XDECREF(vv);
581 Py_XDECREF(ww);
582 Py_XDECREF(one);
583 return result;
584 }
585 } /* else if (PyLong_Check(w)) */
586
587 else /* w isn't float, int, or long */
588 goto Unimplemented;
589
590 Compare:
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000591 PyFPE_START_PROTECT("richcompare", return NULL)
592 switch (op) {
593 case Py_EQ:
Tim Peters307fa782004-09-23 08:06:40 +0000594 r = i == j;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000595 break;
596 case Py_NE:
Tim Peters307fa782004-09-23 08:06:40 +0000597 r = i != j;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000598 break;
599 case Py_LE:
Tim Peters307fa782004-09-23 08:06:40 +0000600 r = i <= j;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000601 break;
602 case Py_GE:
Tim Peters307fa782004-09-23 08:06:40 +0000603 r = i >= j;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000604 break;
605 case Py_LT:
Tim Peters307fa782004-09-23 08:06:40 +0000606 r = i < j;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000607 break;
608 case Py_GT:
Tim Peters307fa782004-09-23 08:06:40 +0000609 r = i > j;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000610 break;
611 }
Michael W. Hudson957f9772004-02-26 12:33:09 +0000612 PyFPE_END_PROTECT(r)
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000613 return PyBool_FromLong(r);
Tim Peters307fa782004-09-23 08:06:40 +0000614
615 Unimplemented:
616 Py_INCREF(Py_NotImplemented);
617 return Py_NotImplemented;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000618}
619
Guido van Rossum9bfef441993-03-29 10:43:31 +0000620static long
Fred Drakefd99de62000-07-09 05:02:18 +0000621float_hash(PyFloatObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000622{
Tim Peters39dce292000-08-15 03:34:48 +0000623 return _Py_HashDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000624}
625
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000627float_add(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000628{
Neil Schemenauer32117e52001-01-04 01:44:34 +0000629 double a,b;
630 CONVERT_TO_DOUBLE(v, a);
631 CONVERT_TO_DOUBLE(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000632 PyFPE_START_PROTECT("add", return 0)
Neil Schemenauer32117e52001-01-04 01:44:34 +0000633 a = a + b;
634 PyFPE_END_PROTECT(a)
635 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000636}
637
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000639float_sub(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000640{
Neil Schemenauer32117e52001-01-04 01:44:34 +0000641 double a,b;
642 CONVERT_TO_DOUBLE(v, a);
643 CONVERT_TO_DOUBLE(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000644 PyFPE_START_PROTECT("subtract", return 0)
Neil Schemenauer32117e52001-01-04 01:44:34 +0000645 a = a - b;
646 PyFPE_END_PROTECT(a)
647 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000648}
649
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000651float_mul(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000652{
Neil Schemenauer32117e52001-01-04 01:44:34 +0000653 double a,b;
654 CONVERT_TO_DOUBLE(v, a);
655 CONVERT_TO_DOUBLE(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000656 PyFPE_START_PROTECT("multiply", return 0)
Neil Schemenauer32117e52001-01-04 01:44:34 +0000657 a = a * b;
658 PyFPE_END_PROTECT(a)
659 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000660}
661
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000663float_div(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000664{
Neil Schemenauer32117e52001-01-04 01:44:34 +0000665 double a,b;
666 CONVERT_TO_DOUBLE(v, a);
667 CONVERT_TO_DOUBLE(w, b);
Christian Heimes6f341092008-04-18 23:13:07 +0000668#ifdef Py_NAN
Neil Schemenauer32117e52001-01-04 01:44:34 +0000669 if (b == 0.0) {
Christian Heimes6f341092008-04-18 23:13:07 +0000670 PyErr_SetString(PyExc_ZeroDivisionError,
671 "float division");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000672 return NULL;
673 }
Christian Heimes6f341092008-04-18 23:13:07 +0000674#endif
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000675 PyFPE_START_PROTECT("divide", return 0)
Neil Schemenauer32117e52001-01-04 01:44:34 +0000676 a = a / b;
677 PyFPE_END_PROTECT(a)
678 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000679}
680
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000682float_classic_div(PyObject *v, PyObject *w)
683{
684 double a,b;
685 CONVERT_TO_DOUBLE(v, a);
686 CONVERT_TO_DOUBLE(w, b);
Guido van Rossum1832de42001-09-04 03:51:09 +0000687 if (Py_DivisionWarningFlag >= 2 &&
Guido van Rossum393661d2001-08-31 17:40:15 +0000688 PyErr_Warn(PyExc_DeprecationWarning, "classic float division") < 0)
689 return NULL;
Christian Heimes6f341092008-04-18 23:13:07 +0000690#ifdef Py_NAN
Guido van Rossum393661d2001-08-31 17:40:15 +0000691 if (b == 0.0) {
Christian Heimes6f341092008-04-18 23:13:07 +0000692 PyErr_SetString(PyExc_ZeroDivisionError,
693 "float division");
Guido van Rossum393661d2001-08-31 17:40:15 +0000694 return NULL;
695 }
Christian Heimes6f341092008-04-18 23:13:07 +0000696#endif
Guido van Rossum393661d2001-08-31 17:40:15 +0000697 PyFPE_START_PROTECT("divide", return 0)
698 a = a / b;
699 PyFPE_END_PROTECT(a)
700 return PyFloat_FromDouble(a);
701}
702
703static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000704float_rem(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000705{
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000706 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000707 double mod;
Christian Heimes6f341092008-04-18 23:13:07 +0000708 CONVERT_TO_DOUBLE(v, vx);
709 CONVERT_TO_DOUBLE(w, wx);
710#ifdef Py_NAN
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000711 if (wx == 0.0) {
Christian Heimes6f341092008-04-18 23:13:07 +0000712 PyErr_SetString(PyExc_ZeroDivisionError,
713 "float modulo");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000714 return NULL;
715 }
Christian Heimes6f341092008-04-18 23:13:07 +0000716#endif
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000717 PyFPE_START_PROTECT("modulo", return 0)
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000718 mod = fmod(vx, wx);
Guido van Rossum9263e781999-05-06 14:26:34 +0000719 /* note: checking mod*wx < 0 is incorrect -- underflows to
720 0 if wx < sqrt(smallest nonzero double) */
721 if (mod && ((wx < 0) != (mod < 0))) {
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000722 mod += wx;
Guido van Rossum56cd67a1992-01-26 18:16:35 +0000723 }
Guido van Rossum45b83911997-03-14 04:32:50 +0000724 PyFPE_END_PROTECT(mod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000726}
727
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000729float_divmod(PyObject *v, PyObject *w)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000730{
Guido van Rossum15ecff41991-10-20 20:16:45 +0000731 double vx, wx;
Guido van Rossum9263e781999-05-06 14:26:34 +0000732 double div, mod, floordiv;
Neil Schemenauer32117e52001-01-04 01:44:34 +0000733 CONVERT_TO_DOUBLE(v, vx);
734 CONVERT_TO_DOUBLE(w, wx);
Guido van Rossum15ecff41991-10-20 20:16:45 +0000735 if (wx == 0.0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
Guido van Rossum15ecff41991-10-20 20:16:45 +0000737 return NULL;
738 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000739 PyFPE_START_PROTECT("divmod", return 0)
Guido van Rossum15ecff41991-10-20 20:16:45 +0000740 mod = fmod(vx, wx);
Tim Peters78fc0b52000-09-16 03:54:24 +0000741 /* fmod is typically exact, so vx-mod is *mathematically* an
Guido van Rossum9263e781999-05-06 14:26:34 +0000742 exact multiple of wx. But this is fp arithmetic, and fp
743 vx - mod is an approximation; the result is that div may
744 not be an exact integral value after the division, although
745 it will always be very close to one.
746 */
Guido van Rossum15ecff41991-10-20 20:16:45 +0000747 div = (vx - mod) / wx;
Tim Petersd2e40d62001-11-01 23:12:27 +0000748 if (mod) {
749 /* ensure the remainder has the same sign as the denominator */
750 if ((wx < 0) != (mod < 0)) {
751 mod += wx;
752 div -= 1.0;
753 }
754 }
755 else {
756 /* the remainder is zero, and in the presence of signed zeroes
757 fmod returns different results across platforms; ensure
758 it has the same sign as the denominator; we'd like to do
759 "mod = wx * 0.0", but that may get optimized away */
Tim Peters4e8ab5d2001-11-01 23:59:56 +0000760 mod *= mod; /* hide "mod = +0" from optimizer */
Tim Petersd2e40d62001-11-01 23:12:27 +0000761 if (wx < 0.0)
762 mod = -mod;
Guido van Rossum15ecff41991-10-20 20:16:45 +0000763 }
Guido van Rossum9263e781999-05-06 14:26:34 +0000764 /* snap quotient to nearest integral value */
Tim Petersd2e40d62001-11-01 23:12:27 +0000765 if (div) {
766 floordiv = floor(div);
767 if (div - floordiv > 0.5)
768 floordiv += 1.0;
769 }
770 else {
771 /* div is zero - get the same sign as the true quotient */
772 div *= div; /* hide "div = +0" from optimizers */
773 floordiv = div * vx / wx; /* zero w/ sign of vx/wx */
774 }
775 PyFPE_END_PROTECT(floordiv)
Guido van Rossum9263e781999-05-06 14:26:34 +0000776 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000777}
778
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779static PyObject *
Tim Peters63a35712001-12-11 19:57:24 +0000780float_floor_div(PyObject *v, PyObject *w)
781{
782 PyObject *t, *r;
783
784 t = float_divmod(v, w);
Tim Peters77d8a4f2001-12-11 20:31:34 +0000785 if (t == NULL || t == Py_NotImplemented)
786 return t;
787 assert(PyTuple_CheckExact(t));
788 r = PyTuple_GET_ITEM(t, 0);
789 Py_INCREF(r);
790 Py_DECREF(t);
791 return r;
Tim Peters63a35712001-12-11 19:57:24 +0000792}
793
794static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000795float_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000796{
797 double iv, iw, ix;
Tim Peters32f453e2001-09-03 08:35:41 +0000798
799 if ((PyObject *)z != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +0000800 PyErr_SetString(PyExc_TypeError, "pow() 3rd argument not "
Tim Peters97f4a332001-09-05 23:49:24 +0000801 "allowed unless all arguments are integers");
Tim Peters32f453e2001-09-03 08:35:41 +0000802 return NULL;
803 }
804
Neil Schemenauer32117e52001-01-04 01:44:34 +0000805 CONVERT_TO_DOUBLE(v, iv);
806 CONVERT_TO_DOUBLE(w, iw);
Tim Petersc54d1902000-10-06 00:36:09 +0000807
808 /* Sort out special cases here instead of relying on pow() */
Tim Peters96685bf2001-08-23 22:31:37 +0000809 if (iw == 0) { /* v**0 is 1, even 0**0 */
Neal Norwitz8b267b52007-05-03 07:20:57 +0000810 return PyFloat_FromDouble(1.0);
Tim Petersc54d1902000-10-06 00:36:09 +0000811 }
Tim Peters96685bf2001-08-23 22:31:37 +0000812 if (iv == 0.0) { /* 0**w is error if w<0, else 1 */
Tim Petersc54d1902000-10-06 00:36:09 +0000813 if (iw < 0.0) {
814 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000815 "0.0 cannot be raised to a negative power");
Tim Petersc54d1902000-10-06 00:36:09 +0000816 return NULL;
817 }
818 return PyFloat_FromDouble(0.0);
819 }
Christian Heimes6f341092008-04-18 23:13:07 +0000820 if (iv == 1.0) { /* 1**w is 1, even 1**inf and 1**nan */
821 return PyFloat_FromDouble(1.0);
822 }
Tim Peterse87568d2003-05-24 20:18:24 +0000823 if (iv < 0.0) {
824 /* Whether this is an error is a mess, and bumps into libm
825 * bugs so we have to figure it out ourselves.
826 */
827 if (iw != floor(iw)) {
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +0000828 PyErr_SetString(PyExc_ValueError, "negative number "
829 "cannot be raised to a fractional power");
830 return NULL;
Tim Peterse87568d2003-05-24 20:18:24 +0000831 }
832 /* iw is an exact integer, albeit perhaps a very large one.
833 * -1 raised to an exact integer should never be exceptional.
834 * Alas, some libms (chiefly glibc as of early 2003) return
835 * NaN and set EDOM on pow(-1, large_int) if the int doesn't
836 * happen to be representable in a *C* integer. That's a
837 * bug; we let that slide in math.pow() (which currently
838 * reflects all platform accidents), but not for Python's **.
839 */
Kristján Valur Jónssonf94323f2006-05-25 15:53:30 +0000840 if (iv == -1.0 && Py_IS_FINITE(iw)) {
Tim Peterse87568d2003-05-24 20:18:24 +0000841 /* Return 1 if iw is even, -1 if iw is odd; there's
842 * no guarantee that any C integral type is big
843 * enough to hold iw, so we have to check this
844 * indirectly.
845 */
846 ix = floor(iw * 0.5) * 2.0;
847 return PyFloat_FromDouble(ix == iw ? 1.0 : -1.0);
848 }
849 /* Else iv != -1.0, and overflow or underflow are possible.
850 * Unless we're to write pow() ourselves, we have to trust
851 * the platform to do this correctly.
852 */
Guido van Rossum86c04c21996-08-09 20:50:14 +0000853 }
Tim Peters96685bf2001-08-23 22:31:37 +0000854 errno = 0;
855 PyFPE_START_PROTECT("pow", return NULL)
856 ix = pow(iv, iw);
857 PyFPE_END_PROTECT(ix)
Tim Petersdc5a5082002-03-09 04:58:24 +0000858 Py_ADJUST_ERANGE1(ix);
Alex Martelli348dc882006-08-23 22:17:59 +0000859 if (errno != 0) {
Tim Peterse87568d2003-05-24 20:18:24 +0000860 /* We don't expect any errno value other than ERANGE, but
861 * the range of libm bugs appears unbounded.
862 */
Alex Martelli348dc882006-08-23 22:17:59 +0000863 PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError :
864 PyExc_ValueError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000865 return NULL;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000866 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000867 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000868}
869
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000871float_neg(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000872{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000874}
875
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000877float_abs(PyFloatObject *v)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000878{
Tim Petersfaf0cd22001-11-01 21:51:15 +0000879 return PyFloat_FromDouble(fabs(v->ob_fval));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000880}
881
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000882static int
Fred Drakefd99de62000-07-09 05:02:18 +0000883float_nonzero(PyFloatObject *v)
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000884{
885 return v->ob_fval != 0.0;
886}
887
Guido van Rossum234f9421993-06-17 12:35:49 +0000888static int
Fred Drakefd99de62000-07-09 05:02:18 +0000889float_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +0000890{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891 if (PyInt_Check(*pw)) {
892 long x = PyInt_AsLong(*pw);
893 *pw = PyFloat_FromDouble((double)x);
894 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000895 return 0;
896 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000897 else if (PyLong_Check(*pw)) {
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000898 double x = PyLong_AsDouble(*pw);
899 if (x == -1.0 && PyErr_Occurred())
900 return -1;
901 *pw = PyFloat_FromDouble(x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000903 return 0;
904 }
Guido van Rossum1952e382001-09-19 01:25:16 +0000905 else if (PyFloat_Check(*pw)) {
906 Py_INCREF(*pv);
907 Py_INCREF(*pw);
908 return 0;
909 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000910 return 1; /* Can't do it */
911}
912
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000913static PyObject *
Christian Heimes6f341092008-04-18 23:13:07 +0000914float_is_integer(PyObject *v)
915{
916 double x = PyFloat_AsDouble(v);
917 PyObject *o;
918
919 if (x == -1.0 && PyErr_Occurred())
920 return NULL;
921 if (!Py_IS_FINITE(x))
922 Py_RETURN_FALSE;
Mark Dickinsone81c3762008-05-09 16:14:15 +0000923 errno = 0;
Christian Heimes6f341092008-04-18 23:13:07 +0000924 PyFPE_START_PROTECT("is_integer", return NULL)
925 o = (floor(x) == x) ? Py_True : Py_False;
926 PyFPE_END_PROTECT(x)
927 if (errno != 0) {
928 PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError :
929 PyExc_ValueError);
930 return NULL;
931 }
932 Py_INCREF(o);
933 return o;
934}
935
936#if 0
937static PyObject *
938float_is_inf(PyObject *v)
939{
940 double x = PyFloat_AsDouble(v);
941 if (x == -1.0 && PyErr_Occurred())
942 return NULL;
943 return PyBool_FromLong((long)Py_IS_INFINITY(x));
944}
945
946static PyObject *
947float_is_nan(PyObject *v)
948{
949 double x = PyFloat_AsDouble(v);
950 if (x == -1.0 && PyErr_Occurred())
951 return NULL;
952 return PyBool_FromLong((long)Py_IS_NAN(x));
953}
954
955static PyObject *
956float_is_finite(PyObject *v)
957{
958 double x = PyFloat_AsDouble(v);
959 if (x == -1.0 && PyErr_Occurred())
960 return NULL;
961 return PyBool_FromLong((long)Py_IS_FINITE(x));
962}
963#endif
964
965static PyObject *
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000966float_trunc(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000967{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000968 double x = PyFloat_AsDouble(v);
Tim Peters7321ec42001-07-26 20:02:17 +0000969 double wholepart; /* integral portion of x, rounded toward 0 */
Tim Peters7321ec42001-07-26 20:02:17 +0000970
971 (void)modf(x, &wholepart);
Tim Peters7d791242002-11-21 22:26:37 +0000972 /* Try to get out cheap if this fits in a Python int. The attempt
973 * to cast to long must be protected, as C doesn't define what
974 * happens if the double is too big to fit in a long. Some rare
975 * systems raise an exception then (RISCOS was mentioned as one,
976 * and someone using a non-default option on Sun also bumped into
977 * that). Note that checking for >= and <= LONG_{MIN,MAX} would
978 * still be vulnerable: if a long has more bits of precision than
979 * a double, casting MIN/MAX to double may yield an approximation,
980 * and if that's rounded up, then, e.g., wholepart=LONG_MAX+1 would
981 * yield true from the C expression wholepart<=LONG_MAX, despite
982 * that wholepart is actually greater than LONG_MAX.
983 */
984 if (LONG_MIN < wholepart && wholepart < LONG_MAX) {
985 const long aslong = (long)wholepart;
Tim Peters7321ec42001-07-26 20:02:17 +0000986 return PyInt_FromLong(aslong);
Tim Peters7d791242002-11-21 22:26:37 +0000987 }
988 return PyLong_FromDouble(wholepart);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000989}
990
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991static PyObject *
Amaury Forgeot d'Arcd3ffb892008-09-09 07:24:30 +0000992float_long(PyObject *v)
993{
994 double x = PyFloat_AsDouble(v);
995 return PyLong_FromDouble(x);
996}
997
Mark Dickinsonbd15a062009-11-18 19:33:35 +0000998/* _Py_double_round: rounds a finite nonzero double to the closest multiple of
999 10**-ndigits; here ndigits is within reasonable bounds (typically, -308 <=
1000 ndigits <= 323). Returns a Python float, or sets a Python error and
1001 returns NULL on failure (OverflowError and memory errors are possible). */
1002
1003#ifndef PY_NO_SHORT_FLOAT_REPR
1004/* version of _Py_double_round that uses the correctly-rounded string<->double
1005 conversions from Python/dtoa.c */
1006
1007/* FIVE_POW_LIMIT is the largest k such that 5**k is exactly representable as
1008 a double. Since we're using the code in Python/dtoa.c, it should be safe
1009 to assume that C doubles are IEEE 754 binary64 format. To be on the safe
1010 side, we check this. */
1011#if DBL_MANT_DIG == 53
1012#define FIVE_POW_LIMIT 22
1013#else
1014#error "C doubles do not appear to be IEEE 754 binary64 format"
1015#endif
1016
1017PyObject *
1018_Py_double_round(double x, int ndigits) {
1019
1020 double rounded, m;
1021 Py_ssize_t buflen, mybuflen=100;
1022 char *buf, *buf_end, shortbuf[100], *mybuf=shortbuf;
1023 int decpt, sign, val, halfway_case;
1024 PyObject *result = NULL;
1025
1026 /* The basic idea is very simple: convert and round the double to a
1027 decimal string using _Py_dg_dtoa, then convert that decimal string
1028 back to a double with _Py_dg_strtod. There's one minor difficulty:
1029 Python 2.x expects round to do round-half-away-from-zero, while
1030 _Py_dg_dtoa does round-half-to-even. So we need some way to detect
1031 and correct the halfway cases.
1032
1033 Detection: a halfway value has the form k * 0.5 * 10**-ndigits for
1034 some odd integer k. Or in other words, a rational number x is
1035 exactly halfway between two multiples of 10**-ndigits if its
1036 2-valuation is exactly -ndigits-1 and its 5-valuation is at least
1037 -ndigits. For ndigits >= 0 the latter condition is automatically
1038 satisfied for a binary float x, since any such float has
1039 nonnegative 5-valuation. For 0 > ndigits >= -22, x needs to be an
1040 integral multiple of 5**-ndigits; we can check this using fmod.
1041 For -22 > ndigits, there are no halfway cases: 5**23 takes 54 bits
1042 to represent exactly, so any odd multiple of 0.5 * 10**n for n >=
1043 23 takes at least 54 bits of precision to represent exactly.
1044
1045 Correction: a simple strategy for dealing with halfway cases is to
1046 (for the halfway cases only) call _Py_dg_dtoa with an argument of
1047 ndigits+1 instead of ndigits (thus doing an exact conversion to
1048 decimal), round the resulting string manually, and then convert
1049 back using _Py_dg_strtod.
1050 */
1051
1052 /* nans, infinities and zeros should have already been dealt
1053 with by the caller (in this case, builtin_round) */
1054 assert(Py_IS_FINITE(x) && x != 0.0);
1055
1056 /* find 2-valuation val of x */
1057 m = frexp(x, &val);
1058 while (m != floor(m)) {
1059 m *= 2.0;
1060 val--;
1061 }
1062
1063 /* determine whether this is a halfway case */
1064 if (val == -ndigits-1) {
1065 if (ndigits >= 0)
1066 halfway_case = 1;
1067 else if (ndigits >= -FIVE_POW_LIMIT) {
1068 double five_pow = 1.0;
1069 int i;
1070 for (i=0; i < -ndigits; i++)
1071 five_pow *= 5.0;
1072 halfway_case = fmod(x, five_pow) == 0.0;
1073 }
1074 else
1075 halfway_case = 0;
1076 }
1077 else
1078 halfway_case = 0;
1079
1080 /* round to a decimal string; use an extra place for halfway case */
1081 buf = _Py_dg_dtoa(x, 3, ndigits+halfway_case, &decpt, &sign, &buf_end);
1082 if (buf == NULL) {
1083 PyErr_NoMemory();
1084 return NULL;
1085 }
1086 buflen = buf_end - buf;
1087
1088 /* in halfway case, do the round-half-away-from-zero manually */
1089 if (halfway_case) {
1090 int i, carry;
1091 /* sanity check: _Py_dg_dtoa should not have stripped
1092 any zeros from the result: there should be exactly
1093 ndigits+1 places following the decimal point, and
1094 the last digit in the buffer should be a '5'.*/
1095 assert(buflen - decpt == ndigits+1);
1096 assert(buf[buflen-1] == '5');
1097
1098 /* increment and shift right at the same time. */
1099 decpt += 1;
1100 carry = 1;
1101 for (i=buflen-1; i-- > 0;) {
1102 carry += buf[i] - '0';
1103 buf[i+1] = carry % 10 + '0';
1104 carry /= 10;
1105 }
1106 buf[0] = carry + '0';
1107 }
1108
1109 /* Get new buffer if shortbuf is too small. Space needed <= buf_end -
1110 buf + 8: (1 extra for '0', 1 for sign, 5 for exp, 1 for '\0'). */
1111 if (buflen + 8 > mybuflen) {
1112 mybuflen = buflen+8;
1113 mybuf = (char *)PyMem_Malloc(mybuflen);
1114 if (mybuf == NULL) {
1115 PyErr_NoMemory();
1116 goto exit;
1117 }
1118 }
1119 /* copy buf to mybuf, adding exponent, sign and leading 0 */
1120 PyOS_snprintf(mybuf, mybuflen, "%s0%se%d", (sign ? "-" : ""),
1121 buf, decpt - (int)buflen);
1122
1123 /* and convert the resulting string back to a double */
1124 errno = 0;
1125 rounded = _Py_dg_strtod(mybuf, NULL);
1126 if (errno == ERANGE && fabs(rounded) >= 1.)
1127 PyErr_SetString(PyExc_OverflowError,
1128 "rounded value too large to represent");
1129 else
1130 result = PyFloat_FromDouble(rounded);
1131
1132 /* done computing value; now clean up */
1133 if (mybuf != shortbuf)
1134 PyMem_Free(mybuf);
1135 exit:
1136 _Py_dg_freedtoa(buf);
1137 return result;
1138}
1139
1140#undef FIVE_POW_LIMIT
1141
1142#else /* PY_NO_SHORT_FLOAT_REPR */
1143
1144/* fallback version, to be used when correctly rounded binary<->decimal
1145 conversions aren't available */
1146
1147PyObject *
1148_Py_double_round(double x, int ndigits) {
1149 double pow1, pow2, y, z;
1150 if (ndigits >= 0) {
1151 if (ndigits > 22) {
1152 /* pow1 and pow2 are each safe from overflow, but
1153 pow1*pow2 ~= pow(10.0, ndigits) might overflow */
1154 pow1 = pow(10.0, (double)(ndigits-22));
1155 pow2 = 1e22;
1156 }
1157 else {
1158 pow1 = pow(10.0, (double)ndigits);
1159 pow2 = 1.0;
1160 }
1161 y = (x*pow1)*pow2;
1162 /* if y overflows, then rounded value is exactly x */
1163 if (!Py_IS_FINITE(y))
1164 return PyFloat_FromDouble(x);
1165 }
1166 else {
1167 pow1 = pow(10.0, (double)-ndigits);
1168 pow2 = 1.0; /* unused; silences a gcc compiler warning */
1169 y = x / pow1;
1170 }
1171
1172 z = round(y);
1173 if (fabs(y-z) == 0.5)
1174 /* halfway between two integers; use round-away-from-zero */
1175 z = y + copysign(0.5, y);
1176
1177 if (ndigits >= 0)
1178 z = (z / pow2) / pow1;
1179 else
1180 z *= pow1;
1181
1182 /* if computation resulted in overflow, raise OverflowError */
1183 if (!Py_IS_FINITE(z)) {
1184 PyErr_SetString(PyExc_OverflowError,
1185 "overflow occurred during round");
1186 return NULL;
1187 }
1188
1189 return PyFloat_FromDouble(z);
1190}
1191
1192#endif /* PY_NO_SHORT_FLOAT_REPR */
1193
Amaury Forgeot d'Arcd3ffb892008-09-09 07:24:30 +00001194static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +00001195float_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001196{
Brett Cannonc3647ac2005-04-26 03:45:26 +00001197 if (PyFloat_CheckExact(v))
1198 Py_INCREF(v);
1199 else
1200 v = PyFloat_FromDouble(((PyFloatObject *)v)->ob_fval);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001201 return v;
1202}
1203
Mark Dickinson7103aa42008-07-15 19:08:33 +00001204/* turn ASCII hex characters into integer values and vice versa */
1205
1206static char
1207char_from_hex(int x)
1208{
1209 assert(0 <= x && x < 16);
1210 return "0123456789abcdef"[x];
1211}
1212
1213static int
1214hex_from_char(char c) {
1215 int x;
Mark Dickinson7103aa42008-07-15 19:08:33 +00001216 switch(c) {
1217 case '0':
1218 x = 0;
1219 break;
1220 case '1':
1221 x = 1;
1222 break;
1223 case '2':
1224 x = 2;
1225 break;
1226 case '3':
1227 x = 3;
1228 break;
1229 case '4':
1230 x = 4;
1231 break;
1232 case '5':
1233 x = 5;
1234 break;
1235 case '6':
1236 x = 6;
1237 break;
1238 case '7':
1239 x = 7;
1240 break;
1241 case '8':
1242 x = 8;
1243 break;
1244 case '9':
1245 x = 9;
1246 break;
1247 case 'a':
1248 case 'A':
1249 x = 10;
1250 break;
1251 case 'b':
1252 case 'B':
1253 x = 11;
1254 break;
1255 case 'c':
1256 case 'C':
1257 x = 12;
1258 break;
1259 case 'd':
1260 case 'D':
1261 x = 13;
1262 break;
1263 case 'e':
1264 case 'E':
1265 x = 14;
1266 break;
1267 case 'f':
1268 case 'F':
1269 x = 15;
1270 break;
1271 default:
1272 x = -1;
1273 break;
1274 }
1275 return x;
1276}
1277
1278/* convert a float to a hexadecimal string */
1279
1280/* TOHEX_NBITS is DBL_MANT_DIG rounded up to the next integer
1281 of the form 4k+1. */
1282#define TOHEX_NBITS DBL_MANT_DIG + 3 - (DBL_MANT_DIG+2)%4
1283
1284static PyObject *
1285float_hex(PyObject *v)
1286{
1287 double x, m;
1288 int e, shift, i, si, esign;
1289 /* Space for 1+(TOHEX_NBITS-1)/4 digits, a decimal point, and the
1290 trailing NUL byte. */
1291 char s[(TOHEX_NBITS-1)/4+3];
1292
1293 CONVERT_TO_DOUBLE(v, x);
1294
1295 if (Py_IS_NAN(x) || Py_IS_INFINITY(x))
1296 return float_str((PyFloatObject *)v);
1297
1298 if (x == 0.0) {
1299 if(copysign(1.0, x) == -1.0)
1300 return PyString_FromString("-0x0.0p+0");
1301 else
1302 return PyString_FromString("0x0.0p+0");
1303 }
1304
1305 m = frexp(fabs(x), &e);
1306 shift = 1 - MAX(DBL_MIN_EXP - e, 0);
1307 m = ldexp(m, shift);
1308 e -= shift;
1309
1310 si = 0;
1311 s[si] = char_from_hex((int)m);
1312 si++;
1313 m -= (int)m;
1314 s[si] = '.';
1315 si++;
1316 for (i=0; i < (TOHEX_NBITS-1)/4; i++) {
1317 m *= 16.0;
1318 s[si] = char_from_hex((int)m);
1319 si++;
1320 m -= (int)m;
1321 }
1322 s[si] = '\0';
1323
1324 if (e < 0) {
1325 esign = (int)'-';
1326 e = -e;
1327 }
1328 else
1329 esign = (int)'+';
1330
1331 if (x < 0.0)
1332 return PyString_FromFormat("-0x%sp%c%d", s, esign, e);
1333 else
1334 return PyString_FromFormat("0x%sp%c%d", s, esign, e);
1335}
1336
1337PyDoc_STRVAR(float_hex_doc,
1338"float.hex() -> string\n\
1339\n\
1340Return a hexadecimal representation of a floating-point number.\n\
1341>>> (-0.1).hex()\n\
1342'-0x1.999999999999ap-4'\n\
1343>>> 3.14159.hex()\n\
1344'0x1.921f9f01b866ep+1'");
1345
Mark Dickinsonb1d45852009-05-11 15:33:08 +00001346/* Case-insensitive locale-independent string match used for nan and inf
1347 detection. t should be lower-case and null-terminated. Return a nonzero
1348 result if the first strlen(t) characters of s match t and 0 otherwise. */
1349
1350static int
1351case_insensitive_match(const char *s, const char *t)
1352{
1353 while(*t && Py_TOLOWER(*s) == *t) {
1354 s++;
1355 t++;
1356 }
1357 return *t ? 0 : 1;
1358}
1359
Mark Dickinson7103aa42008-07-15 19:08:33 +00001360/* Convert a hexadecimal string to a float. */
1361
1362static PyObject *
1363float_fromhex(PyObject *cls, PyObject *arg)
1364{
1365 PyObject *result_as_float, *result;
1366 double x;
1367 long exp, top_exp, lsb, key_digit;
1368 char *s, *coeff_start, *s_store, *coeff_end, *exp_start, *s_end;
1369 int half_eps, digit, round_up, sign=1;
1370 Py_ssize_t length, ndigits, fdigits, i;
1371
1372 /*
1373 * For the sake of simplicity and correctness, we impose an artificial
1374 * limit on ndigits, the total number of hex digits in the coefficient
1375 * The limit is chosen to ensure that, writing exp for the exponent,
1376 *
1377 * (1) if exp > LONG_MAX/2 then the value of the hex string is
1378 * guaranteed to overflow (provided it's nonzero)
1379 *
1380 * (2) if exp < LONG_MIN/2 then the value of the hex string is
1381 * guaranteed to underflow to 0.
1382 *
1383 * (3) if LONG_MIN/2 <= exp <= LONG_MAX/2 then there's no danger of
1384 * overflow in the calculation of exp and top_exp below.
1385 *
1386 * More specifically, ndigits is assumed to satisfy the following
1387 * inequalities:
1388 *
1389 * 4*ndigits <= DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2
1390 * 4*ndigits <= LONG_MAX/2 + 1 - DBL_MAX_EXP
1391 *
1392 * If either of these inequalities is not satisfied, a ValueError is
1393 * raised. Otherwise, write x for the value of the hex string, and
1394 * assume x is nonzero. Then
1395 *
1396 * 2**(exp-4*ndigits) <= |x| < 2**(exp+4*ndigits).
1397 *
1398 * Now if exp > LONG_MAX/2 then:
1399 *
1400 * exp - 4*ndigits >= LONG_MAX/2 + 1 - (LONG_MAX/2 + 1 - DBL_MAX_EXP)
1401 * = DBL_MAX_EXP
1402 *
1403 * so |x| >= 2**DBL_MAX_EXP, which is too large to be stored in C
1404 * double, so overflows. If exp < LONG_MIN/2, then
1405 *
1406 * exp + 4*ndigits <= LONG_MIN/2 - 1 + (
1407 * DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2)
1408 * = DBL_MIN_EXP - DBL_MANT_DIG - 1
1409 *
1410 * and so |x| < 2**(DBL_MIN_EXP-DBL_MANT_DIG-1), hence underflows to 0
1411 * when converted to a C double.
1412 *
1413 * It's easy to show that if LONG_MIN/2 <= exp <= LONG_MAX/2 then both
1414 * exp+4*ndigits and exp-4*ndigits are within the range of a long.
1415 */
1416
1417 if (PyString_AsStringAndSize(arg, &s, &length))
1418 return NULL;
1419 s_end = s + length;
1420
1421 /********************
1422 * Parse the string *
1423 ********************/
1424
1425 /* leading whitespace and optional sign */
Mark Dickinson777e4ff2009-05-03 20:59:48 +00001426 while (Py_ISSPACE(*s))
Mark Dickinson7103aa42008-07-15 19:08:33 +00001427 s++;
1428 if (*s == '-') {
1429 s++;
1430 sign = -1;
1431 }
1432 else if (*s == '+')
1433 s++;
1434
1435 /* infinities and nans */
Mark Dickinsonb1d45852009-05-11 15:33:08 +00001436 if (*s == 'i' || *s == 'I') {
1437 if (!case_insensitive_match(s+1, "nf"))
1438 goto parse_error;
1439 s += 3;
1440 x = Py_HUGE_VAL;
1441 if (case_insensitive_match(s, "inity"))
1442 s += 5;
Mark Dickinson7103aa42008-07-15 19:08:33 +00001443 goto finished;
1444 }
Mark Dickinsonb1d45852009-05-11 15:33:08 +00001445 if (*s == 'n' || *s == 'N') {
1446 if (!case_insensitive_match(s+1, "an"))
1447 goto parse_error;
1448 s += 3;
1449 x = Py_NAN;
Mark Dickinson7103aa42008-07-15 19:08:33 +00001450 goto finished;
1451 }
1452
1453 /* [0x] */
1454 s_store = s;
1455 if (*s == '0') {
1456 s++;
Mark Dickinson777e4ff2009-05-03 20:59:48 +00001457 if (*s == 'x' || *s == 'X')
Mark Dickinson7103aa42008-07-15 19:08:33 +00001458 s++;
1459 else
1460 s = s_store;
1461 }
1462
1463 /* coefficient: <integer> [. <fraction>] */
1464 coeff_start = s;
Mark Dickinson5c2bb1a2008-08-21 21:38:38 +00001465 while (hex_from_char(*s) >= 0)
Mark Dickinson7103aa42008-07-15 19:08:33 +00001466 s++;
1467 s_store = s;
1468 if (*s == '.') {
1469 s++;
Mark Dickinson5c2bb1a2008-08-21 21:38:38 +00001470 while (hex_from_char(*s) >= 0)
Mark Dickinson7103aa42008-07-15 19:08:33 +00001471 s++;
1472 coeff_end = s-1;
1473 }
1474 else
1475 coeff_end = s;
1476
1477 /* ndigits = total # of hex digits; fdigits = # after point */
1478 ndigits = coeff_end - coeff_start;
1479 fdigits = coeff_end - s_store;
1480 if (ndigits == 0)
1481 goto parse_error;
1482 if (ndigits > MIN(DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2,
1483 LONG_MAX/2 + 1 - DBL_MAX_EXP)/4)
1484 goto insane_length_error;
1485
1486 /* [p <exponent>] */
Mark Dickinson777e4ff2009-05-03 20:59:48 +00001487 if (*s == 'p' || *s == 'P') {
Mark Dickinson7103aa42008-07-15 19:08:33 +00001488 s++;
1489 exp_start = s;
1490 if (*s == '-' || *s == '+')
1491 s++;
Mark Dickinson5c2bb1a2008-08-21 21:38:38 +00001492 if (!('0' <= *s && *s <= '9'))
Mark Dickinson7103aa42008-07-15 19:08:33 +00001493 goto parse_error;
1494 s++;
Mark Dickinson5c2bb1a2008-08-21 21:38:38 +00001495 while ('0' <= *s && *s <= '9')
Mark Dickinson7103aa42008-07-15 19:08:33 +00001496 s++;
1497 exp = strtol(exp_start, NULL, 10);
1498 }
1499 else
1500 exp = 0;
1501
Mark Dickinson7103aa42008-07-15 19:08:33 +00001502/* for 0 <= j < ndigits, HEX_DIGIT(j) gives the jth most significant digit */
1503#define HEX_DIGIT(j) hex_from_char(*((j) < fdigits ? \
1504 coeff_end-(j) : \
1505 coeff_end-1-(j)))
1506
1507 /*******************************************
1508 * Compute rounded value of the hex string *
1509 *******************************************/
1510
1511 /* Discard leading zeros, and catch extreme overflow and underflow */
1512 while (ndigits > 0 && HEX_DIGIT(ndigits-1) == 0)
1513 ndigits--;
1514 if (ndigits == 0 || exp < LONG_MIN/2) {
Mark Dickinsonb1d45852009-05-11 15:33:08 +00001515 x = 0.0;
Mark Dickinson7103aa42008-07-15 19:08:33 +00001516 goto finished;
1517 }
1518 if (exp > LONG_MAX/2)
1519 goto overflow_error;
1520
1521 /* Adjust exponent for fractional part. */
1522 exp = exp - 4*((long)fdigits);
1523
1524 /* top_exp = 1 more than exponent of most sig. bit of coefficient */
1525 top_exp = exp + 4*((long)ndigits - 1);
1526 for (digit = HEX_DIGIT(ndigits-1); digit != 0; digit /= 2)
1527 top_exp++;
1528
1529 /* catch almost all nonextreme cases of overflow and underflow here */
1530 if (top_exp < DBL_MIN_EXP - DBL_MANT_DIG) {
Mark Dickinsonb1d45852009-05-11 15:33:08 +00001531 x = 0.0;
Mark Dickinson7103aa42008-07-15 19:08:33 +00001532 goto finished;
1533 }
1534 if (top_exp > DBL_MAX_EXP)
1535 goto overflow_error;
1536
1537 /* lsb = exponent of least significant bit of the *rounded* value.
1538 This is top_exp - DBL_MANT_DIG unless result is subnormal. */
1539 lsb = MAX(top_exp, (long)DBL_MIN_EXP) - DBL_MANT_DIG;
1540
1541 x = 0.0;
1542 if (exp >= lsb) {
1543 /* no rounding required */
1544 for (i = ndigits-1; i >= 0; i--)
1545 x = 16.0*x + HEX_DIGIT(i);
Mark Dickinsonb1d45852009-05-11 15:33:08 +00001546 x = ldexp(x, (int)(exp));
Mark Dickinson7103aa42008-07-15 19:08:33 +00001547 goto finished;
1548 }
1549 /* rounding required. key_digit is the index of the hex digit
1550 containing the first bit to be rounded away. */
1551 half_eps = 1 << (int)((lsb - exp - 1) % 4);
1552 key_digit = (lsb - exp - 1) / 4;
1553 for (i = ndigits-1; i > key_digit; i--)
1554 x = 16.0*x + HEX_DIGIT(i);
1555 digit = HEX_DIGIT(key_digit);
1556 x = 16.0*x + (double)(digit & (16-2*half_eps));
1557
1558 /* round-half-even: round up if bit lsb-1 is 1 and at least one of
1559 bits lsb, lsb-2, lsb-3, lsb-4, ... is 1. */
1560 if ((digit & half_eps) != 0) {
1561 round_up = 0;
1562 if ((digit & (3*half_eps-1)) != 0 ||
1563 (half_eps == 8 && (HEX_DIGIT(key_digit+1) & 1) != 0))
1564 round_up = 1;
1565 else
1566 for (i = key_digit-1; i >= 0; i--)
1567 if (HEX_DIGIT(i) != 0) {
1568 round_up = 1;
1569 break;
1570 }
1571 if (round_up == 1) {
1572 x += 2*half_eps;
1573 if (top_exp == DBL_MAX_EXP &&
1574 x == ldexp((double)(2*half_eps), DBL_MANT_DIG))
1575 /* overflow corner case: pre-rounded value <
1576 2**DBL_MAX_EXP; rounded=2**DBL_MAX_EXP. */
1577 goto overflow_error;
1578 }
1579 }
Mark Dickinsonb1d45852009-05-11 15:33:08 +00001580 x = ldexp(x, (int)(exp+4*key_digit));
Mark Dickinson7103aa42008-07-15 19:08:33 +00001581
1582 finished:
Mark Dickinsonb1d45852009-05-11 15:33:08 +00001583 /* optional trailing whitespace leading to the end of the string */
1584 while (Py_ISSPACE(*s))
1585 s++;
1586 if (s != s_end)
1587 goto parse_error;
1588 result_as_float = Py_BuildValue("(d)", sign * x);
Mark Dickinson7103aa42008-07-15 19:08:33 +00001589 if (result_as_float == NULL)
1590 return NULL;
1591 result = PyObject_CallObject(cls, result_as_float);
1592 Py_DECREF(result_as_float);
1593 return result;
1594
1595 overflow_error:
1596 PyErr_SetString(PyExc_OverflowError,
1597 "hexadecimal value too large to represent as a float");
1598 return NULL;
1599
1600 parse_error:
1601 PyErr_SetString(PyExc_ValueError,
1602 "invalid hexadecimal floating-point string");
1603 return NULL;
1604
1605 insane_length_error:
1606 PyErr_SetString(PyExc_ValueError,
1607 "hexadecimal string too long to convert");
1608 return NULL;
1609}
1610
1611PyDoc_STRVAR(float_fromhex_doc,
1612"float.fromhex(string) -> float\n\
1613\n\
1614Create a floating-point number from a hexadecimal string.\n\
1615>>> float.fromhex('0x1.ffffp10')\n\
16162047.984375\n\
1617>>> float.fromhex('-0x1p-1074')\n\
1618-4.9406564584124654e-324");
1619
1620
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001621static PyObject *
Raymond Hettinger04c96d52008-02-01 21:30:23 +00001622float_as_integer_ratio(PyObject *v, PyObject *unused)
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001623{
1624 double self;
1625 double float_part;
Raymond Hettinger1bcb99a2008-02-01 23:12:19 +00001626 int exponent;
Raymond Hettingerf9859032008-02-01 23:45:44 +00001627 int i;
Raymond Hettinger04c96d52008-02-01 21:30:23 +00001628
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001629 PyObject *prev;
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001630 PyObject *py_exponent = NULL;
1631 PyObject *numerator = NULL;
1632 PyObject *denominator = NULL;
1633 PyObject *result_pair = NULL;
Raymond Hettinger04c96d52008-02-01 21:30:23 +00001634 PyNumberMethods *long_methods = PyLong_Type.tp_as_number;
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001635
1636#define INPLACE_UPDATE(obj, call) \
1637 prev = obj; \
1638 obj = call; \
1639 Py_DECREF(prev); \
1640
1641 CONVERT_TO_DOUBLE(v, self);
1642
1643 if (Py_IS_INFINITY(self)) {
1644 PyErr_SetString(PyExc_OverflowError,
1645 "Cannot pass infinity to float.as_integer_ratio.");
1646 return NULL;
1647 }
1648#ifdef Py_NAN
1649 if (Py_IS_NAN(self)) {
1650 PyErr_SetString(PyExc_ValueError,
Andrew M. Kuchlingbd7c4ca2008-10-04 01:02:29 +00001651 "Cannot pass NaN to float.as_integer_ratio.");
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001652 return NULL;
1653 }
1654#endif
1655
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001656 PyFPE_START_PROTECT("as_integer_ratio", goto error);
Raymond Hettinger04c96d52008-02-01 21:30:23 +00001657 float_part = frexp(self, &exponent); /* self == float_part * 2**exponent exactly */
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001658 PyFPE_END_PROTECT(float_part);
Raymond Hettinger04c96d52008-02-01 21:30:23 +00001659
Raymond Hettingerf9859032008-02-01 23:45:44 +00001660 for (i=0; i<300 && float_part != floor(float_part) ; i++) {
Raymond Hettinger04c96d52008-02-01 21:30:23 +00001661 float_part *= 2.0;
1662 exponent--;
Raymond Hettingerf9859032008-02-01 23:45:44 +00001663 }
Raymond Hettinger2d1aa332008-02-02 05:11:40 +00001664 /* self == float_part * 2**exponent exactly and float_part is integral.
1665 If FLT_RADIX != 2, the 300 steps may leave a tiny fractional part
1666 to be truncated by PyLong_FromDouble(). */
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001667
Raymond Hettinger04c96d52008-02-01 21:30:23 +00001668 numerator = PyLong_FromDouble(float_part);
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001669 if (numerator == NULL) goto error;
1670
Raymond Hettingerf9859032008-02-01 23:45:44 +00001671 /* fold in 2**exponent */
Raymond Hettingerc9e928a2008-02-01 22:15:52 +00001672 denominator = PyLong_FromLong(1);
Raymond Hettinger1bcb99a2008-02-01 23:12:19 +00001673 py_exponent = PyLong_FromLong(labs((long)exponent));
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001674 if (py_exponent == NULL) goto error;
1675 INPLACE_UPDATE(py_exponent,
1676 long_methods->nb_lshift(denominator, py_exponent));
1677 if (py_exponent == NULL) goto error;
1678 if (exponent > 0) {
1679 INPLACE_UPDATE(numerator,
Raymond Hettingerf9859032008-02-01 23:45:44 +00001680 long_methods->nb_multiply(numerator, py_exponent));
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001681 if (numerator == NULL) goto error;
1682 }
1683 else {
1684 Py_DECREF(denominator);
1685 denominator = py_exponent;
1686 py_exponent = NULL;
1687 }
1688
Raymond Hettingerc9e928a2008-02-01 22:15:52 +00001689 /* Returns ints instead of longs where possible */
1690 INPLACE_UPDATE(numerator, PyNumber_Int(numerator));
1691 if (numerator == NULL) goto error;
1692 INPLACE_UPDATE(denominator, PyNumber_Int(denominator));
1693 if (denominator == NULL) goto error;
1694
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001695 result_pair = PyTuple_Pack(2, numerator, denominator);
1696
1697#undef INPLACE_UPDATE
1698error:
1699 Py_XDECREF(py_exponent);
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001700 Py_XDECREF(denominator);
1701 Py_XDECREF(numerator);
1702 return result_pair;
1703}
1704
1705PyDoc_STRVAR(float_as_integer_ratio_doc,
1706"float.as_integer_ratio() -> (int, int)\n"
1707"\n"
Raymond Hettinger04c96d52008-02-01 21:30:23 +00001708"Returns a pair of integers, whose ratio is exactly equal to the original\n"
1709"float and with a positive denominator.\n"
Andrew M. Kuchlingbd7c4ca2008-10-04 01:02:29 +00001710"Raises OverflowError on infinities and a ValueError on NaNs.\n"
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001711"\n"
1712">>> (10.0).as_integer_ratio()\n"
Raymond Hettinger04c96d52008-02-01 21:30:23 +00001713"(10, 1)\n"
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001714">>> (0.0).as_integer_ratio()\n"
1715"(0, 1)\n"
1716">>> (-.25).as_integer_ratio()\n"
Raymond Hettinger04c96d52008-02-01 21:30:23 +00001717"(-1, 4)");
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001718
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001719
Jeremy Hylton938ace62002-07-17 16:30:39 +00001720static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00001721float_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1722
Tim Peters6d6c1a32001-08-02 04:15:00 +00001723static PyObject *
1724float_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1725{
1726 PyObject *x = Py_False; /* Integer zero */
Martin v. Löwis15e62742006-02-27 16:46:16 +00001727 static char *kwlist[] = {"x", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00001728
Guido van Rossumbef14172001-08-29 15:47:46 +00001729 if (type != &PyFloat_Type)
1730 return float_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001731 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:float", kwlist, &x))
1732 return NULL;
Benjamin Peterson99d36f12009-04-15 21:26:36 +00001733 /* If it's a string, but not a string subclass, use
1734 PyFloat_FromString. */
1735 if (PyString_CheckExact(x))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001736 return PyFloat_FromString(x, NULL);
1737 return PyNumber_Float(x);
1738}
1739
Guido van Rossumbef14172001-08-29 15:47:46 +00001740/* Wimpy, slow approach to tp_new calls for subtypes of float:
1741 first create a regular float from whatever arguments we got,
1742 then allocate a subtype instance and initialize its ob_fval
1743 from the regular float. The regular float is then thrown away.
1744*/
1745static PyObject *
1746float_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1747{
Anthony Baxter377be112006-04-11 06:54:30 +00001748 PyObject *tmp, *newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00001749
1750 assert(PyType_IsSubtype(type, &PyFloat_Type));
1751 tmp = float_new(&PyFloat_Type, args, kwds);
1752 if (tmp == NULL)
1753 return NULL;
Tim Peters2400fa42001-09-12 19:12:49 +00001754 assert(PyFloat_CheckExact(tmp));
Anthony Baxter377be112006-04-11 06:54:30 +00001755 newobj = type->tp_alloc(type, 0);
1756 if (newobj == NULL) {
Raymond Hettingerf4667932003-06-28 20:04:25 +00001757 Py_DECREF(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00001758 return NULL;
Raymond Hettingerf4667932003-06-28 20:04:25 +00001759 }
Anthony Baxter377be112006-04-11 06:54:30 +00001760 ((PyFloatObject *)newobj)->ob_fval = ((PyFloatObject *)tmp)->ob_fval;
Guido van Rossumbef14172001-08-29 15:47:46 +00001761 Py_DECREF(tmp);
Anthony Baxter377be112006-04-11 06:54:30 +00001762 return newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00001763}
1764
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001765static PyObject *
1766float_getnewargs(PyFloatObject *v)
1767{
1768 return Py_BuildValue("(d)", v->ob_fval);
1769}
1770
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001771/* this is for the benefit of the pack/unpack routines below */
1772
1773typedef enum {
1774 unknown_format, ieee_big_endian_format, ieee_little_endian_format
1775} float_format_type;
1776
1777static float_format_type double_format, float_format;
1778static float_format_type detected_double_format, detected_float_format;
1779
1780static PyObject *
1781float_getformat(PyTypeObject *v, PyObject* arg)
1782{
1783 char* s;
1784 float_format_type r;
1785
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001786 if (!PyString_Check(arg)) {
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001787 PyErr_Format(PyExc_TypeError,
1788 "__getformat__() argument must be string, not %.500s",
Christian Heimese93237d2007-12-19 02:37:44 +00001789 Py_TYPE(arg)->tp_name);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001790 return NULL;
1791 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001792 s = PyString_AS_STRING(arg);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001793 if (strcmp(s, "double") == 0) {
1794 r = double_format;
1795 }
1796 else if (strcmp(s, "float") == 0) {
1797 r = float_format;
1798 }
1799 else {
1800 PyErr_SetString(PyExc_ValueError,
1801 "__getformat__() argument 1 must be "
1802 "'double' or 'float'");
1803 return NULL;
1804 }
1805
1806 switch (r) {
1807 case unknown_format:
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001808 return PyString_FromString("unknown");
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001809 case ieee_little_endian_format:
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001810 return PyString_FromString("IEEE, little-endian");
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001811 case ieee_big_endian_format:
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001812 return PyString_FromString("IEEE, big-endian");
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001813 default:
1814 Py_FatalError("insane float_format or double_format");
1815 return NULL;
1816 }
1817}
1818
1819PyDoc_STRVAR(float_getformat_doc,
1820"float.__getformat__(typestr) -> string\n"
1821"\n"
1822"You probably don't want to use this function. It exists mainly to be\n"
1823"used in Python's test suite.\n"
1824"\n"
1825"typestr must be 'double' or 'float'. This function returns whichever of\n"
1826"'unknown', 'IEEE, big-endian' or 'IEEE, little-endian' best describes the\n"
1827"format of floating point numbers used by the C type named by typestr.");
1828
1829static PyObject *
1830float_setformat(PyTypeObject *v, PyObject* args)
1831{
1832 char* typestr;
1833 char* format;
1834 float_format_type f;
1835 float_format_type detected;
1836 float_format_type *p;
1837
1838 if (!PyArg_ParseTuple(args, "ss:__setformat__", &typestr, &format))
1839 return NULL;
1840
1841 if (strcmp(typestr, "double") == 0) {
1842 p = &double_format;
1843 detected = detected_double_format;
1844 }
1845 else if (strcmp(typestr, "float") == 0) {
1846 p = &float_format;
1847 detected = detected_float_format;
1848 }
1849 else {
1850 PyErr_SetString(PyExc_ValueError,
1851 "__setformat__() argument 1 must "
1852 "be 'double' or 'float'");
1853 return NULL;
1854 }
1855
1856 if (strcmp(format, "unknown") == 0) {
1857 f = unknown_format;
1858 }
1859 else if (strcmp(format, "IEEE, little-endian") == 0) {
1860 f = ieee_little_endian_format;
1861 }
1862 else if (strcmp(format, "IEEE, big-endian") == 0) {
1863 f = ieee_big_endian_format;
1864 }
1865 else {
1866 PyErr_SetString(PyExc_ValueError,
1867 "__setformat__() argument 2 must be "
1868 "'unknown', 'IEEE, little-endian' or "
1869 "'IEEE, big-endian'");
1870 return NULL;
1871
1872 }
1873
1874 if (f != unknown_format && f != detected) {
1875 PyErr_Format(PyExc_ValueError,
1876 "can only set %s format to 'unknown' or the "
1877 "detected platform value", typestr);
1878 return NULL;
1879 }
1880
1881 *p = f;
1882 Py_RETURN_NONE;
1883}
1884
1885PyDoc_STRVAR(float_setformat_doc,
1886"float.__setformat__(typestr, fmt) -> None\n"
1887"\n"
1888"You probably don't want to use this function. It exists mainly to be\n"
1889"used in Python's test suite.\n"
1890"\n"
1891"typestr must be 'double' or 'float'. fmt must be one of 'unknown',\n"
1892"'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be\n"
1893"one of the latter two if it appears to match the underlying C reality.\n"
1894"\n"
1895"Overrides the automatic determination of C-level floating point type.\n"
1896"This affects how floats are converted to and from binary strings.");
1897
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001898static PyObject *
1899float_getzero(PyObject *v, void *closure)
1900{
1901 return PyFloat_FromDouble(0.0);
1902}
1903
Eric Smitha9f7d622008-02-17 19:46:49 +00001904static PyObject *
1905float__format__(PyObject *self, PyObject *args)
1906{
1907 PyObject *format_spec;
1908
1909 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
1910 return NULL;
Christian Heimes593daf52008-05-26 12:51:38 +00001911 if (PyBytes_Check(format_spec))
Eric Smithdc13b792008-05-30 18:10:04 +00001912 return _PyFloat_FormatAdvanced(self,
1913 PyBytes_AS_STRING(format_spec),
1914 PyBytes_GET_SIZE(format_spec));
Eric Smitha9f7d622008-02-17 19:46:49 +00001915 if (PyUnicode_Check(format_spec)) {
1916 /* Convert format_spec to a str */
Eric Smithdc13b792008-05-30 18:10:04 +00001917 PyObject *result;
1918 PyObject *str_spec = PyObject_Str(format_spec);
Eric Smitha9f7d622008-02-17 19:46:49 +00001919
Eric Smithdc13b792008-05-30 18:10:04 +00001920 if (str_spec == NULL)
1921 return NULL;
Eric Smitha9f7d622008-02-17 19:46:49 +00001922
Eric Smithdc13b792008-05-30 18:10:04 +00001923 result = _PyFloat_FormatAdvanced(self,
1924 PyBytes_AS_STRING(str_spec),
1925 PyBytes_GET_SIZE(str_spec));
Eric Smitha9f7d622008-02-17 19:46:49 +00001926
Eric Smithdc13b792008-05-30 18:10:04 +00001927 Py_DECREF(str_spec);
Eric Smitha9f7d622008-02-17 19:46:49 +00001928 return result;
1929 }
1930 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
1931 return NULL;
1932}
1933
1934PyDoc_STRVAR(float__format__doc,
1935"float.__format__(format_spec) -> string\n"
1936"\n"
1937"Formats the float according to format_spec.");
1938
1939
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001940static PyMethodDef float_methods[] = {
Christian Heimes6f341092008-04-18 23:13:07 +00001941 {"conjugate", (PyCFunction)float_float, METH_NOARGS,
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001942 "Returns self, the complex conjugate of any float."},
1943 {"__trunc__", (PyCFunction)float_trunc, METH_NOARGS,
1944 "Returns the Integral closest to x between 0 and x."},
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00001945 {"as_integer_ratio", (PyCFunction)float_as_integer_ratio, METH_NOARGS,
1946 float_as_integer_ratio_doc},
Mark Dickinson7103aa42008-07-15 19:08:33 +00001947 {"fromhex", (PyCFunction)float_fromhex,
1948 METH_O|METH_CLASS, float_fromhex_doc},
1949 {"hex", (PyCFunction)float_hex,
1950 METH_NOARGS, float_hex_doc},
Christian Heimes6f341092008-04-18 23:13:07 +00001951 {"is_integer", (PyCFunction)float_is_integer, METH_NOARGS,
1952 "Returns True if the float is an integer."},
1953#if 0
1954 {"is_inf", (PyCFunction)float_is_inf, METH_NOARGS,
1955 "Returns True if the float is positive or negative infinite."},
1956 {"is_finite", (PyCFunction)float_is_finite, METH_NOARGS,
1957 "Returns True if the float is finite, neither infinite nor NaN."},
1958 {"is_nan", (PyCFunction)float_is_nan, METH_NOARGS,
1959 "Returns True if the float is not a number (NaN)."},
1960#endif
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001961 {"__getnewargs__", (PyCFunction)float_getnewargs, METH_NOARGS},
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001962 {"__getformat__", (PyCFunction)float_getformat,
1963 METH_O|METH_CLASS, float_getformat_doc},
1964 {"__setformat__", (PyCFunction)float_setformat,
1965 METH_VARARGS|METH_CLASS, float_setformat_doc},
Eric Smitha9f7d622008-02-17 19:46:49 +00001966 {"__format__", (PyCFunction)float__format__,
1967 METH_VARARGS, float__format__doc},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001968 {NULL, NULL} /* sentinel */
1969};
1970
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001971static PyGetSetDef float_getset[] = {
1972 {"real",
1973 (getter)float_float, (setter)NULL,
1974 "the real part of a complex number",
1975 NULL},
1976 {"imag",
1977 (getter)float_getzero, (setter)NULL,
1978 "the imaginary part of a complex number",
1979 NULL},
1980 {NULL} /* Sentinel */
1981};
1982
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001983PyDoc_STRVAR(float_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001984"float(x) -> floating point number\n\
1985\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001986Convert a string or number to a floating point number, if possible.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001987
1988
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001989static PyNumberMethods float_as_number = {
Georg Brandl347b3002006-03-30 11:57:00 +00001990 float_add, /*nb_add*/
1991 float_sub, /*nb_subtract*/
1992 float_mul, /*nb_multiply*/
1993 float_classic_div, /*nb_divide*/
1994 float_rem, /*nb_remainder*/
1995 float_divmod, /*nb_divmod*/
1996 float_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001997 (unaryfunc)float_neg, /*nb_negative*/
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001998 (unaryfunc)float_float, /*nb_positive*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001999 (unaryfunc)float_abs, /*nb_absolute*/
2000 (inquiry)float_nonzero, /*nb_nonzero*/
Guido van Rossum27acb331991-10-24 14:55:28 +00002001 0, /*nb_invert*/
2002 0, /*nb_lshift*/
2003 0, /*nb_rshift*/
2004 0, /*nb_and*/
2005 0, /*nb_xor*/
2006 0, /*nb_or*/
Georg Brandl347b3002006-03-30 11:57:00 +00002007 float_coerce, /*nb_coerce*/
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00002008 float_trunc, /*nb_int*/
Amaury Forgeot d'Arcd3ffb892008-09-09 07:24:30 +00002009 float_long, /*nb_long*/
Georg Brandl347b3002006-03-30 11:57:00 +00002010 float_float, /*nb_float*/
Raymond Hettinger9c437af2008-06-24 22:46:07 +00002011 0, /* nb_oct */
2012 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +00002013 0, /* nb_inplace_add */
2014 0, /* nb_inplace_subtract */
2015 0, /* nb_inplace_multiply */
2016 0, /* nb_inplace_divide */
2017 0, /* nb_inplace_remainder */
2018 0, /* nb_inplace_power */
2019 0, /* nb_inplace_lshift */
2020 0, /* nb_inplace_rshift */
2021 0, /* nb_inplace_and */
2022 0, /* nb_inplace_xor */
2023 0, /* nb_inplace_or */
Tim Peters63a35712001-12-11 19:57:24 +00002024 float_floor_div, /* nb_floor_divide */
Guido van Rossum4668b002001-08-08 05:00:18 +00002025 float_div, /* nb_true_divide */
2026 0, /* nb_inplace_floor_divide */
2027 0, /* nb_inplace_true_divide */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002028};
2029
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002030PyTypeObject PyFloat_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002031 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002032 "float",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002033 sizeof(PyFloatObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002034 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002035 (destructor)float_dealloc, /* tp_dealloc */
2036 (printfunc)float_print, /* tp_print */
2037 0, /* tp_getattr */
2038 0, /* tp_setattr */
Michael W. Hudson08678a12004-05-26 17:36:12 +00002039 0, /* tp_compare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002040 (reprfunc)float_repr, /* tp_repr */
2041 &float_as_number, /* tp_as_number */
2042 0, /* tp_as_sequence */
2043 0, /* tp_as_mapping */
2044 (hashfunc)float_hash, /* tp_hash */
2045 0, /* tp_call */
2046 (reprfunc)float_str, /* tp_str */
2047 PyObject_GenericGetAttr, /* tp_getattro */
2048 0, /* tp_setattro */
2049 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002050 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2051 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002052 float_doc, /* tp_doc */
2053 0, /* tp_traverse */
2054 0, /* tp_clear */
Georg Brandl347b3002006-03-30 11:57:00 +00002055 float_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002056 0, /* tp_weaklistoffset */
2057 0, /* tp_iter */
2058 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00002059 float_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002060 0, /* tp_members */
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00002061 float_getset, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002062 0, /* tp_base */
2063 0, /* tp_dict */
2064 0, /* tp_descr_get */
2065 0, /* tp_descr_set */
2066 0, /* tp_dictoffset */
2067 0, /* tp_init */
2068 0, /* tp_alloc */
2069 float_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002070};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00002071
2072void
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002073_PyFloat_Init(void)
2074{
2075 /* We attempt to determine if this machine is using IEEE
2076 floating point formats by peering at the bits of some
2077 carefully chosen values. If it looks like we are on an
2078 IEEE platform, the float packing/unpacking routines can
2079 just copy bits, if not they resort to arithmetic & shifts
2080 and masks. The shifts & masks approach works on all finite
2081 values, but what happens to infinities, NaNs and signed
2082 zeroes on packing is an accident, and attempting to unpack
2083 a NaN or an infinity will raise an exception.
2084
2085 Note that if we're on some whacked-out platform which uses
2086 IEEE formats but isn't strictly little-endian or big-
2087 endian, we will fall back to the portable shifts & masks
2088 method. */
2089
2090#if SIZEOF_DOUBLE == 8
2091 {
2092 double x = 9006104071832581.0;
2093 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
2094 detected_double_format = ieee_big_endian_format;
2095 else if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
2096 detected_double_format = ieee_little_endian_format;
2097 else
2098 detected_double_format = unknown_format;
2099 }
2100#else
2101 detected_double_format = unknown_format;
2102#endif
2103
2104#if SIZEOF_FLOAT == 4
2105 {
2106 float y = 16711938.0;
2107 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
2108 detected_float_format = ieee_big_endian_format;
2109 else if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
2110 detected_float_format = ieee_little_endian_format;
2111 else
2112 detected_float_format = unknown_format;
2113 }
2114#else
2115 detected_float_format = unknown_format;
2116#endif
2117
2118 double_format = detected_double_format;
2119 float_format = detected_float_format;
Christian Heimesf15c66e2007-12-11 00:54:34 +00002120
Christian Heimes796fc312008-01-30 18:58:29 +00002121 /* Init float info */
2122 if (FloatInfoType.tp_name == 0)
2123 PyStructSequence_InitType(&FloatInfoType, &floatinfo_desc);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002124}
2125
Gregory P. Smith2fe77062008-07-06 03:35:58 +00002126int
2127PyFloat_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00002128{
Guido van Rossum3fce8831999-03-12 19:43:17 +00002129 PyFloatObject *p;
2130 PyFloatBlock *list, *next;
Gregory P. Smith2fe77062008-07-06 03:35:58 +00002131 int i;
2132 int u; /* remaining unfreed ints per block */
2133 int freelist_size = 0;
Guido van Rossumf61bbc81999-03-12 00:12:21 +00002134
Guido van Rossumf61bbc81999-03-12 00:12:21 +00002135 list = block_list;
2136 block_list = NULL;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +00002137 free_list = NULL;
Guido van Rossumf61bbc81999-03-12 00:12:21 +00002138 while (list != NULL) {
Gregory P. Smith2fe77062008-07-06 03:35:58 +00002139 u = 0;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +00002140 for (i = 0, p = &list->objects[0];
2141 i < N_FLOATOBJECTS;
2142 i++, p++) {
Christian Heimese93237d2007-12-19 02:37:44 +00002143 if (PyFloat_CheckExact(p) && Py_REFCNT(p) != 0)
Gregory P. Smith2fe77062008-07-06 03:35:58 +00002144 u++;
Guido van Rossumf61bbc81999-03-12 00:12:21 +00002145 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00002146 next = list->next;
Gregory P. Smith2fe77062008-07-06 03:35:58 +00002147 if (u) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00002148 list->next = block_list;
2149 block_list = list;
Guido van Rossumd7b5fb81999-03-19 20:59:40 +00002150 for (i = 0, p = &list->objects[0];
2151 i < N_FLOATOBJECTS;
2152 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00002153 if (!PyFloat_CheckExact(p) ||
Christian Heimese93237d2007-12-19 02:37:44 +00002154 Py_REFCNT(p) == 0) {
2155 Py_TYPE(p) = (struct _typeobject *)
Guido van Rossumd7b5fb81999-03-19 20:59:40 +00002156 free_list;
2157 free_list = p;
2158 }
2159 }
Guido van Rossumf61bbc81999-03-12 00:12:21 +00002160 }
2161 else {
Gregory P. Smith2fe77062008-07-06 03:35:58 +00002162 PyMem_FREE(list);
Guido van Rossumf61bbc81999-03-12 00:12:21 +00002163 }
Gregory P. Smith2fe77062008-07-06 03:35:58 +00002164 freelist_size += u;
Guido van Rossum3fce8831999-03-12 19:43:17 +00002165 list = next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +00002166 }
Gregory P. Smith2fe77062008-07-06 03:35:58 +00002167 return freelist_size;
Christian Heimes422051a2008-02-04 18:00:12 +00002168}
2169
2170void
2171PyFloat_Fini(void)
2172{
2173 PyFloatObject *p;
2174 PyFloatBlock *list;
Gregory P. Smith2fe77062008-07-06 03:35:58 +00002175 int i;
2176 int u; /* total unfreed floats per block */
Christian Heimes422051a2008-02-04 18:00:12 +00002177
Gregory P. Smith2fe77062008-07-06 03:35:58 +00002178 u = PyFloat_ClearFreeList();
Christian Heimes422051a2008-02-04 18:00:12 +00002179
Guido van Rossum3fce8831999-03-12 19:43:17 +00002180 if (!Py_VerboseFlag)
2181 return;
2182 fprintf(stderr, "# cleanup floats");
Gregory P. Smith2fe77062008-07-06 03:35:58 +00002183 if (!u) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00002184 fprintf(stderr, "\n");
2185 }
2186 else {
2187 fprintf(stderr,
Gregory P. Smith2fe77062008-07-06 03:35:58 +00002188 ": %d unfreed float%s\n",
2189 u, u == 1 ? "" : "s");
Guido van Rossum3fce8831999-03-12 19:43:17 +00002190 }
2191 if (Py_VerboseFlag > 1) {
2192 list = block_list;
2193 while (list != NULL) {
Guido van Rossumd7b5fb81999-03-19 20:59:40 +00002194 for (i = 0, p = &list->objects[0];
2195 i < N_FLOATOBJECTS;
2196 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00002197 if (PyFloat_CheckExact(p) &&
Christian Heimese93237d2007-12-19 02:37:44 +00002198 Py_REFCNT(p) != 0) {
Eric Smithb3272582009-10-16 14:26:36 +00002199 char *buf = PyOS_double_to_string(
2200 PyFloat_AS_DOUBLE(p), 'r',
2201 0, 0, NULL);
2202 if (buf) {
2203 /* XXX(twouters) cast
2204 refcount to long
2205 until %zd is
2206 universally
2207 available
2208 */
2209 fprintf(stderr,
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00002210 "# <float at %p, refcnt=%ld, val=%s>\n",
Christian Heimese93237d2007-12-19 02:37:44 +00002211 p, (long)Py_REFCNT(p), buf);
Eric Smithb3272582009-10-16 14:26:36 +00002212 PyMem_Free(buf);
2213 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00002214 }
2215 }
2216 list = list->next;
Guido van Rossumf61bbc81999-03-12 00:12:21 +00002217 }
2218 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00002219}
Tim Peters9905b942003-03-20 20:53:32 +00002220
2221/*----------------------------------------------------------------------------
2222 * _PyFloat_{Pack,Unpack}{4,8}. See floatobject.h.
Tim Peters9905b942003-03-20 20:53:32 +00002223 */
2224int
2225_PyFloat_Pack4(double x, unsigned char *p, int le)
2226{
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002227 if (float_format == unknown_format) {
2228 unsigned char sign;
2229 int e;
2230 double f;
2231 unsigned int fbits;
2232 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002233
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002234 if (le) {
2235 p += 3;
2236 incr = -1;
2237 }
Tim Peters9905b942003-03-20 20:53:32 +00002238
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002239 if (x < 0) {
2240 sign = 1;
2241 x = -x;
2242 }
2243 else
2244 sign = 0;
Tim Peters9905b942003-03-20 20:53:32 +00002245
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002246 f = frexp(x, &e);
Tim Peters9905b942003-03-20 20:53:32 +00002247
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002248 /* Normalize f to be in the range [1.0, 2.0) */
2249 if (0.5 <= f && f < 1.0) {
2250 f *= 2.0;
2251 e--;
2252 }
2253 else if (f == 0.0)
2254 e = 0;
2255 else {
2256 PyErr_SetString(PyExc_SystemError,
2257 "frexp() result out of range");
2258 return -1;
2259 }
2260
2261 if (e >= 128)
2262 goto Overflow;
2263 else if (e < -126) {
2264 /* Gradual underflow */
2265 f = ldexp(f, 126 + e);
2266 e = 0;
2267 }
2268 else if (!(e == 0 && f == 0.0)) {
2269 e += 127;
2270 f -= 1.0; /* Get rid of leading 1 */
2271 }
2272
2273 f *= 8388608.0; /* 2**23 */
2274 fbits = (unsigned int)(f + 0.5); /* Round */
2275 assert(fbits <= 8388608);
2276 if (fbits >> 23) {
2277 /* The carry propagated out of a string of 23 1 bits. */
2278 fbits = 0;
2279 ++e;
2280 if (e >= 255)
2281 goto Overflow;
2282 }
2283
2284 /* First byte */
2285 *p = (sign << 7) | (e >> 1);
2286 p += incr;
2287
2288 /* Second byte */
2289 *p = (char) (((e & 1) << 7) | (fbits >> 16));
2290 p += incr;
2291
2292 /* Third byte */
2293 *p = (fbits >> 8) & 0xFF;
2294 p += incr;
2295
2296 /* Fourth byte */
2297 *p = fbits & 0xFF;
2298
2299 /* Done */
2300 return 0;
2301
Tim Peters9905b942003-03-20 20:53:32 +00002302 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002303 else {
Michael W. Hudson3095ad02005-06-30 00:02:26 +00002304 float y = (float)x;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002305 const char *s = (char*)&y;
2306 int i, incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002307
Mark Dickinsonc23b8a72008-03-14 14:23:37 +00002308 if (Py_IS_INFINITY(y) && !Py_IS_INFINITY(x))
2309 goto Overflow;
2310
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002311 if ((float_format == ieee_little_endian_format && !le)
2312 || (float_format == ieee_big_endian_format && le)) {
2313 p += 3;
2314 incr = -1;
2315 }
Mark Dickinsonc23b8a72008-03-14 14:23:37 +00002316
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002317 for (i = 0; i < 4; i++) {
2318 *p = *s++;
2319 p += incr;
2320 }
2321 return 0;
Tim Peters9905b942003-03-20 20:53:32 +00002322 }
Mark Dickinsonc23b8a72008-03-14 14:23:37 +00002323 Overflow:
2324 PyErr_SetString(PyExc_OverflowError,
2325 "float too large to pack with f format");
2326 return -1;
Tim Peters9905b942003-03-20 20:53:32 +00002327}
2328
2329int
2330_PyFloat_Pack8(double x, unsigned char *p, int le)
2331{
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002332 if (double_format == unknown_format) {
2333 unsigned char sign;
2334 int e;
2335 double f;
2336 unsigned int fhi, flo;
2337 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002338
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002339 if (le) {
2340 p += 7;
2341 incr = -1;
2342 }
Tim Peters9905b942003-03-20 20:53:32 +00002343
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002344 if (x < 0) {
2345 sign = 1;
2346 x = -x;
2347 }
2348 else
2349 sign = 0;
Tim Peters9905b942003-03-20 20:53:32 +00002350
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002351 f = frexp(x, &e);
Tim Peters9905b942003-03-20 20:53:32 +00002352
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002353 /* Normalize f to be in the range [1.0, 2.0) */
2354 if (0.5 <= f && f < 1.0) {
2355 f *= 2.0;
2356 e--;
2357 }
2358 else if (f == 0.0)
2359 e = 0;
2360 else {
2361 PyErr_SetString(PyExc_SystemError,
2362 "frexp() result out of range");
2363 return -1;
2364 }
2365
2366 if (e >= 1024)
2367 goto Overflow;
2368 else if (e < -1022) {
2369 /* Gradual underflow */
2370 f = ldexp(f, 1022 + e);
2371 e = 0;
2372 }
2373 else if (!(e == 0 && f == 0.0)) {
2374 e += 1023;
2375 f -= 1.0; /* Get rid of leading 1 */
2376 }
2377
2378 /* fhi receives the high 28 bits; flo the low 24 bits (== 52 bits) */
2379 f *= 268435456.0; /* 2**28 */
2380 fhi = (unsigned int)f; /* Truncate */
2381 assert(fhi < 268435456);
2382
2383 f -= (double)fhi;
2384 f *= 16777216.0; /* 2**24 */
2385 flo = (unsigned int)(f + 0.5); /* Round */
2386 assert(flo <= 16777216);
2387 if (flo >> 24) {
2388 /* The carry propagated out of a string of 24 1 bits. */
2389 flo = 0;
2390 ++fhi;
2391 if (fhi >> 28) {
2392 /* And it also progagated out of the next 28 bits. */
2393 fhi = 0;
2394 ++e;
2395 if (e >= 2047)
2396 goto Overflow;
2397 }
2398 }
2399
2400 /* First byte */
2401 *p = (sign << 7) | (e >> 4);
2402 p += incr;
2403
2404 /* Second byte */
2405 *p = (unsigned char) (((e & 0xF) << 4) | (fhi >> 24));
2406 p += incr;
2407
2408 /* Third byte */
2409 *p = (fhi >> 16) & 0xFF;
2410 p += incr;
2411
2412 /* Fourth byte */
2413 *p = (fhi >> 8) & 0xFF;
2414 p += incr;
2415
2416 /* Fifth byte */
2417 *p = fhi & 0xFF;
2418 p += incr;
2419
2420 /* Sixth byte */
2421 *p = (flo >> 16) & 0xFF;
2422 p += incr;
2423
2424 /* Seventh byte */
2425 *p = (flo >> 8) & 0xFF;
2426 p += incr;
2427
2428 /* Eighth byte */
2429 *p = flo & 0xFF;
2430 p += incr;
2431
2432 /* Done */
2433 return 0;
2434
2435 Overflow:
2436 PyErr_SetString(PyExc_OverflowError,
2437 "float too large to pack with d format");
Tim Peters9905b942003-03-20 20:53:32 +00002438 return -1;
2439 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002440 else {
2441 const char *s = (char*)&x;
2442 int i, incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002443
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002444 if ((double_format == ieee_little_endian_format && !le)
2445 || (double_format == ieee_big_endian_format && le)) {
2446 p += 7;
2447 incr = -1;
Tim Peters9905b942003-03-20 20:53:32 +00002448 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002449
2450 for (i = 0; i < 8; i++) {
2451 *p = *s++;
2452 p += incr;
2453 }
2454 return 0;
Tim Peters9905b942003-03-20 20:53:32 +00002455 }
Tim Peters9905b942003-03-20 20:53:32 +00002456}
2457
2458double
2459_PyFloat_Unpack4(const unsigned char *p, int le)
2460{
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002461 if (float_format == unknown_format) {
2462 unsigned char sign;
2463 int e;
2464 unsigned int f;
2465 double x;
2466 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002467
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002468 if (le) {
2469 p += 3;
2470 incr = -1;
2471 }
2472
2473 /* First byte */
2474 sign = (*p >> 7) & 1;
2475 e = (*p & 0x7F) << 1;
2476 p += incr;
2477
2478 /* Second byte */
2479 e |= (*p >> 7) & 1;
2480 f = (*p & 0x7F) << 16;
2481 p += incr;
2482
2483 if (e == 255) {
2484 PyErr_SetString(
2485 PyExc_ValueError,
2486 "can't unpack IEEE 754 special value "
2487 "on non-IEEE platform");
2488 return -1;
2489 }
2490
2491 /* Third byte */
2492 f |= *p << 8;
2493 p += incr;
2494
2495 /* Fourth byte */
2496 f |= *p;
2497
2498 x = (double)f / 8388608.0;
2499
2500 /* XXX This sadly ignores Inf/NaN issues */
2501 if (e == 0)
2502 e = -126;
2503 else {
2504 x += 1.0;
2505 e -= 127;
2506 }
2507 x = ldexp(x, e);
2508
2509 if (sign)
2510 x = -x;
2511
2512 return x;
Tim Peters9905b942003-03-20 20:53:32 +00002513 }
Tim Peters9905b942003-03-20 20:53:32 +00002514 else {
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002515 float x;
2516
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002517 if ((float_format == ieee_little_endian_format && !le)
2518 || (float_format == ieee_big_endian_format && le)) {
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002519 char buf[4];
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002520 char *d = &buf[3];
2521 int i;
Tim Peters9905b942003-03-20 20:53:32 +00002522
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002523 for (i = 0; i < 4; i++) {
2524 *d-- = *p++;
2525 }
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002526 memcpy(&x, buf, 4);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002527 }
2528 else {
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002529 memcpy(&x, p, 4);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002530 }
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002531
2532 return x;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002533 }
Tim Peters9905b942003-03-20 20:53:32 +00002534}
2535
2536double
2537_PyFloat_Unpack8(const unsigned char *p, int le)
2538{
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002539 if (double_format == unknown_format) {
2540 unsigned char sign;
2541 int e;
2542 unsigned int fhi, flo;
2543 double x;
2544 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002545
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002546 if (le) {
2547 p += 7;
2548 incr = -1;
2549 }
2550
2551 /* First byte */
2552 sign = (*p >> 7) & 1;
2553 e = (*p & 0x7F) << 4;
2554
2555 p += incr;
2556
2557 /* Second byte */
2558 e |= (*p >> 4) & 0xF;
2559 fhi = (*p & 0xF) << 24;
2560 p += incr;
2561
2562 if (e == 2047) {
2563 PyErr_SetString(
2564 PyExc_ValueError,
2565 "can't unpack IEEE 754 special value "
2566 "on non-IEEE platform");
2567 return -1.0;
2568 }
2569
2570 /* Third byte */
2571 fhi |= *p << 16;
2572 p += incr;
2573
2574 /* Fourth byte */
2575 fhi |= *p << 8;
2576 p += incr;
2577
2578 /* Fifth byte */
2579 fhi |= *p;
2580 p += incr;
2581
2582 /* Sixth byte */
2583 flo = *p << 16;
2584 p += incr;
2585
2586 /* Seventh byte */
2587 flo |= *p << 8;
2588 p += incr;
2589
2590 /* Eighth byte */
2591 flo |= *p;
2592
2593 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2594 x /= 268435456.0; /* 2**28 */
2595
2596 if (e == 0)
2597 e = -1022;
2598 else {
2599 x += 1.0;
2600 e -= 1023;
2601 }
2602 x = ldexp(x, e);
2603
2604 if (sign)
2605 x = -x;
2606
2607 return x;
Tim Peters9905b942003-03-20 20:53:32 +00002608 }
Tim Peters9905b942003-03-20 20:53:32 +00002609 else {
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002610 double x;
2611
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002612 if ((double_format == ieee_little_endian_format && !le)
2613 || (double_format == ieee_big_endian_format && le)) {
2614 char buf[8];
2615 char *d = &buf[7];
2616 int i;
2617
2618 for (i = 0; i < 8; i++) {
2619 *d-- = *p++;
2620 }
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002621 memcpy(&x, buf, 8);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002622 }
2623 else {
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002624 memcpy(&x, p, 8);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002625 }
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002626
2627 return x;
Tim Peters9905b942003-03-20 20:53:32 +00002628 }
Tim Peters9905b942003-03-20 20:53:32 +00002629}