blob: 8f87f8ec11db4ff4893ff5cf1395bc828987c6d8 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Float object implementation */
3
Guido van Rossum2a9096b1990-10-21 22:15:08 +00004/* XXX There should be overflow checks here, but it's hard to check
5 for any kind of float exception without losing portability. */
6
Guido van Rossumc0b618a1997-05-02 03:12:38 +00007#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008
Guido van Rossum3f5da241990-12-20 15:06:42 +00009#include <ctype.h>
Christian Heimes93852662007-12-01 12:22:32 +000010#include <float.h>
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011
Serhiy Storchakab5c51d32017-03-11 09:21:05 +020012/*[clinic input]
13class float "PyObject *" "&PyFloat_Type"
14[clinic start generated code]*/
15/*[clinic end generated code: output=da39a3ee5e6b4b0d input=dd0003f68f144284]*/
16
17#include "clinic/floatobject.c.h"
Guido van Rossum6923e131990-11-02 17:50:43 +000018
Mark Dickinsond19052c2010-06-27 18:19:09 +000019/* Special free list
Mark Dickinsond19052c2010-06-27 18:19:09 +000020 free_list is a singly-linked list of available PyFloatObjects, linked
21 via abuse of their ob_type members.
22*/
23
Kristján Valur Jónssondaa06542012-03-30 09:18:15 +000024#ifndef PyFloat_MAXFREELIST
25#define PyFloat_MAXFREELIST 100
26#endif
27static int numfree = 0;
Guido van Rossum3fce8831999-03-12 19:43:17 +000028static PyFloatObject *free_list = NULL;
29
Christian Heimes93852662007-12-01 12:22:32 +000030double
31PyFloat_GetMax(void)
32{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000033 return DBL_MAX;
Christian Heimes93852662007-12-01 12:22:32 +000034}
35
36double
37PyFloat_GetMin(void)
38{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000039 return DBL_MIN;
Christian Heimes93852662007-12-01 12:22:32 +000040}
41
Christian Heimesd32ed6f2008-01-14 18:49:24 +000042static PyTypeObject FloatInfoType;
43
44PyDoc_STRVAR(floatinfo__doc__,
Benjamin Peterson78565b22009-06-28 19:19:51 +000045"sys.float_info\n\
Christian Heimesd32ed6f2008-01-14 18:49:24 +000046\n\
47A structseq holding information about the float type. It contains low level\n\
48information about the precision and internal representation. Please study\n\
49your system's :file:`float.h` for more information.");
50
51static PyStructSequence_Field floatinfo_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 {"max", "DBL_MAX -- maximum representable finite float"},
53 {"max_exp", "DBL_MAX_EXP -- maximum int e such that radix**(e-1) "
54 "is representable"},
55 {"max_10_exp", "DBL_MAX_10_EXP -- maximum int e such that 10**e "
56 "is representable"},
57 {"min", "DBL_MIN -- Minimum positive normalizer float"},
58 {"min_exp", "DBL_MIN_EXP -- minimum int e such that radix**(e-1) "
59 "is a normalized float"},
60 {"min_10_exp", "DBL_MIN_10_EXP -- minimum int e such that 10**e is "
61 "a normalized"},
62 {"dig", "DBL_DIG -- digits"},
63 {"mant_dig", "DBL_MANT_DIG -- mantissa digits"},
64 {"epsilon", "DBL_EPSILON -- Difference between 1 and the next "
65 "representable float"},
66 {"radix", "FLT_RADIX -- radix of exponent"},
67 {"rounds", "FLT_ROUNDS -- addition rounds"},
68 {0}
Christian Heimesd32ed6f2008-01-14 18:49:24 +000069};
70
71static PyStructSequence_Desc floatinfo_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 "sys.float_info", /* name */
73 floatinfo__doc__, /* doc */
74 floatinfo_fields, /* fields */
75 11
Christian Heimesd32ed6f2008-01-14 18:49:24 +000076};
77
Christian Heimes93852662007-12-01 12:22:32 +000078PyObject *
79PyFloat_GetInfo(void)
80{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081 PyObject* floatinfo;
82 int pos = 0;
Christian Heimes93852662007-12-01 12:22:32 +000083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 floatinfo = PyStructSequence_New(&FloatInfoType);
85 if (floatinfo == NULL) {
86 return NULL;
87 }
Christian Heimes93852662007-12-01 12:22:32 +000088
Christian Heimesd32ed6f2008-01-14 18:49:24 +000089#define SetIntFlag(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 PyStructSequence_SET_ITEM(floatinfo, pos++, PyLong_FromLong(flag))
Christian Heimesd32ed6f2008-01-14 18:49:24 +000091#define SetDblFlag(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 PyStructSequence_SET_ITEM(floatinfo, pos++, PyFloat_FromDouble(flag))
Christian Heimes93852662007-12-01 12:22:32 +000093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 SetDblFlag(DBL_MAX);
95 SetIntFlag(DBL_MAX_EXP);
96 SetIntFlag(DBL_MAX_10_EXP);
97 SetDblFlag(DBL_MIN);
98 SetIntFlag(DBL_MIN_EXP);
99 SetIntFlag(DBL_MIN_10_EXP);
100 SetIntFlag(DBL_DIG);
101 SetIntFlag(DBL_MANT_DIG);
102 SetDblFlag(DBL_EPSILON);
103 SetIntFlag(FLT_RADIX);
104 SetIntFlag(FLT_ROUNDS);
Christian Heimesd32ed6f2008-01-14 18:49:24 +0000105#undef SetIntFlag
106#undef SetDblFlag
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107
108 if (PyErr_Occurred()) {
109 Py_CLEAR(floatinfo);
110 return NULL;
111 }
112 return floatinfo;
Christian Heimes93852662007-12-01 12:22:32 +0000113}
114
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116PyFloat_FromDouble(double fval)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200118 PyFloatObject *op = free_list;
Kristján Valur Jónssondaa06542012-03-30 09:18:15 +0000119 if (op != NULL) {
120 free_list = (PyFloatObject *) Py_TYPE(op);
121 numfree--;
122 } else {
123 op = (PyFloatObject*) PyObject_MALLOC(sizeof(PyFloatObject));
124 if (!op)
125 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 }
127 /* Inline PyObject_New */
Christian Heimesd3afe782013-12-04 09:27:47 +0100128 (void)PyObject_INIT(op, &PyFloat_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 op->ob_fval = fval;
130 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000131}
132
Brett Cannona721aba2016-09-09 14:57:09 -0700133static PyObject *
134float_from_string_inner(const char *s, Py_ssize_t len, void *obj)
135{
136 double x;
137 const char *end;
138 const char *last = s + len;
139 /* strip space */
140 while (s < last && Py_ISSPACE(*s)) {
141 s++;
142 }
143
144 while (s < last - 1 && Py_ISSPACE(last[-1])) {
145 last--;
146 }
147
148 /* We don't care about overflow or underflow. If the platform
149 * supports them, infinities and signed zeroes (on underflow) are
150 * fine. */
151 x = PyOS_string_to_double(s, (char **)&end, NULL);
152 if (end != last) {
153 PyErr_Format(PyExc_ValueError,
154 "could not convert string to float: "
155 "%R", obj);
156 return NULL;
157 }
158 else if (x == -1.0 && PyErr_Occurred()) {
159 return NULL;
160 }
161 else {
162 return PyFloat_FromDouble(x);
163 }
164}
165
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000166PyObject *
Georg Brandl428f0642007-03-18 18:35:15 +0000167PyFloat_FromString(PyObject *v)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000168{
Brett Cannona721aba2016-09-09 14:57:09 -0700169 const char *s;
Alexander Belopolsky942af5a2010-12-04 03:38:46 +0000170 PyObject *s_buffer = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 Py_ssize_t len;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200172 Py_buffer view = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 PyObject *result = NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 if (PyUnicode_Check(v)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200176 s_buffer = _PyUnicode_TransformDecimalAndSpaceToASCII(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 if (s_buffer == NULL)
Alexander Belopolsky942af5a2010-12-04 03:38:46 +0000178 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200179 s = PyUnicode_AsUTF8AndSize(s_buffer, &len);
Alexander Belopolsky942af5a2010-12-04 03:38:46 +0000180 if (s == NULL) {
181 Py_DECREF(s_buffer);
182 return NULL;
183 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 }
Martin Pantereeb896c2015-11-07 02:32:21 +0000185 else if (PyBytes_Check(v)) {
186 s = PyBytes_AS_STRING(v);
187 len = PyBytes_GET_SIZE(v);
188 }
189 else if (PyByteArray_Check(v)) {
190 s = PyByteArray_AS_STRING(v);
191 len = PyByteArray_GET_SIZE(v);
192 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200193 else if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) == 0) {
194 s = (const char *)view.buf;
195 len = view.len;
Martin Pantereeb896c2015-11-07 02:32:21 +0000196 /* Copy to NUL-terminated buffer. */
197 s_buffer = PyBytes_FromStringAndSize(s, len);
198 if (s_buffer == NULL) {
199 PyBuffer_Release(&view);
200 return NULL;
201 }
202 s = PyBytes_AS_STRING(s_buffer);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200203 }
204 else {
Ezio Melottia5b95992013-11-07 19:18:34 +0200205 PyErr_Format(PyExc_TypeError,
206 "float() argument must be a string or a number, not '%.200s'",
207 Py_TYPE(v)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 return NULL;
209 }
Brett Cannona721aba2016-09-09 14:57:09 -0700210 result = _Py_string_to_number_with_underscores(s, len, "float", v, v,
211 float_from_string_inner);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200212 PyBuffer_Release(&view);
Alexander Belopolsky942af5a2010-12-04 03:38:46 +0000213 Py_XDECREF(s_buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 return result;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000215}
216
Guido van Rossum234f9421993-06-17 12:35:49 +0000217static void
Fred Drakefd99de62000-07-09 05:02:18 +0000218float_dealloc(PyFloatObject *op)
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 if (PyFloat_CheckExact(op)) {
Kristján Valur Jónssondaa06542012-03-30 09:18:15 +0000221 if (numfree >= PyFloat_MAXFREELIST) {
222 PyObject_FREE(op);
223 return;
224 }
225 numfree++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 Py_TYPE(op) = (struct _typeobject *)free_list;
227 free_list = op;
228 }
229 else
230 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000231}
232
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233double
Fred Drakefd99de62000-07-09 05:02:18 +0000234PyFloat_AsDouble(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 PyNumberMethods *nb;
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300237 PyObject *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 double val;
Tim Petersd2364e82001-11-01 20:09:42 +0000239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 if (op == NULL) {
241 PyErr_BadArgument();
242 return -1;
243 }
Tim Petersd2364e82001-11-01 20:09:42 +0000244
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300245 if (PyFloat_Check(op)) {
246 return PyFloat_AS_DOUBLE(op);
247 }
248
249 nb = Py_TYPE(op)->tp_as_number;
250 if (nb == NULL || nb->nb_float == NULL) {
251 PyErr_Format(PyExc_TypeError, "must be real number, not %.50s",
252 op->ob_type->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 return -1;
254 }
Neil Schemenauer2c77e902002-11-18 16:06:21 +0000255
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300256 res = (*nb->nb_float) (op);
257 if (res == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 return -1;
259 }
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300260 if (!PyFloat_CheckExact(res)) {
261 if (!PyFloat_Check(res)) {
262 PyErr_Format(PyExc_TypeError,
263 "%.50s.__float__ returned non-float (type %.50s)",
264 op->ob_type->tp_name, res->ob_type->tp_name);
265 Py_DECREF(res);
266 return -1;
267 }
268 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
269 "%.50s.__float__ returned non-float (type %.50s). "
270 "The ability to return an instance of a strict subclass of float "
271 "is deprecated, and may be removed in a future version of Python.",
272 op->ob_type->tp_name, res->ob_type->tp_name)) {
273 Py_DECREF(res);
274 return -1;
275 }
276 }
Tim Petersd2364e82001-11-01 20:09:42 +0000277
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300278 val = PyFloat_AS_DOUBLE(res);
279 Py_DECREF(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281}
282
Neil Schemenauer32117e52001-01-04 01:44:34 +0000283/* Macro and helper that convert PyObject obj to a C double and store
Neil Schemenauer16c70752007-09-21 20:19:23 +0000284 the value in dbl. If conversion to double raises an exception, obj is
Tim Peters77d8a4f2001-12-11 20:31:34 +0000285 set to NULL, and the function invoking this macro returns NULL. If
Serhiy Storchaka95949422013-08-27 19:40:23 +0300286 obj is not of float or int type, Py_NotImplemented is incref'ed,
Tim Peters77d8a4f2001-12-11 20:31:34 +0000287 stored in obj, and returned from the function invoking this macro.
288*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289#define CONVERT_TO_DOUBLE(obj, dbl) \
290 if (PyFloat_Check(obj)) \
291 dbl = PyFloat_AS_DOUBLE(obj); \
292 else if (convert_to_double(&(obj), &(dbl)) < 0) \
293 return obj;
Neil Schemenauer32117e52001-01-04 01:44:34 +0000294
Eric Smith0923d1d2009-04-16 20:16:10 +0000295/* Methods */
296
Neil Schemenauer32117e52001-01-04 01:44:34 +0000297static int
Tim Peters9fffa3e2001-09-04 05:14:19 +0000298convert_to_double(PyObject **v, double *dbl)
Neil Schemenauer32117e52001-01-04 01:44:34 +0000299{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200300 PyObject *obj = *v;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 if (PyLong_Check(obj)) {
303 *dbl = PyLong_AsDouble(obj);
304 if (*dbl == -1.0 && PyErr_Occurred()) {
305 *v = NULL;
306 return -1;
307 }
308 }
309 else {
310 Py_INCREF(Py_NotImplemented);
311 *v = Py_NotImplemented;
312 return -1;
313 }
314 return 0;
Neil Schemenauer32117e52001-01-04 01:44:34 +0000315}
316
Eric Smith0923d1d2009-04-16 20:16:10 +0000317static PyObject *
Mark Dickinson388122d2010-08-04 20:56:28 +0000318float_repr(PyFloatObject *v)
Eric Smith0923d1d2009-04-16 20:16:10 +0000319{
320 PyObject *result;
Victor Stinnerd3f08822012-05-29 12:57:52 +0200321 char *buf;
322
323 buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
324 'r', 0,
325 Py_DTSF_ADD_DOT_0,
326 NULL);
Eric Smith0923d1d2009-04-16 20:16:10 +0000327 if (!buf)
Mark Dickinson388122d2010-08-04 20:56:28 +0000328 return PyErr_NoMemory();
Victor Stinnerd3f08822012-05-29 12:57:52 +0200329 result = _PyUnicode_FromASCII(buf, strlen(buf));
Eric Smith0923d1d2009-04-16 20:16:10 +0000330 PyMem_Free(buf);
331 return result;
332}
Guido van Rossum57072eb1999-12-23 19:00:28 +0000333
Tim Peters307fa782004-09-23 08:06:40 +0000334/* Comparison is pretty much a nightmare. When comparing float to float,
335 * we do it as straightforwardly (and long-windedly) as conceivable, so
336 * that, e.g., Python x == y delivers the same result as the platform
337 * C x == y when x and/or y is a NaN.
338 * When mixing float with an integer type, there's no good *uniform* approach.
339 * Converting the double to an integer obviously doesn't work, since we
340 * may lose info from fractional bits. Converting the integer to a double
Serhiy Storchaka95949422013-08-27 19:40:23 +0300341 * also has two failure modes: (1) an int may trigger overflow (too
Tim Peters307fa782004-09-23 08:06:40 +0000342 * large to fit in the dynamic range of a C double); (2) even a C long may have
Ezio Melotti3f5db392013-01-27 06:20:14 +0200343 * more bits than fit in a C double (e.g., on a 64-bit box long may have
Tim Peters307fa782004-09-23 08:06:40 +0000344 * 63 bits of precision, but a C double probably has only 53), and then
345 * we can falsely claim equality when low-order integer bits are lost by
346 * coercion to double. So this part is painful too.
347 */
348
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000349static PyObject*
350float_richcompare(PyObject *v, PyObject *w, int op)
351{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 double i, j;
353 int r = 0;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 assert(PyFloat_Check(v));
356 i = PyFloat_AS_DOUBLE(v);
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 /* Switch on the type of w. Set i and j to doubles to be compared,
359 * and op to the richcomp to use.
360 */
361 if (PyFloat_Check(w))
362 j = PyFloat_AS_DOUBLE(w);
Tim Peters307fa782004-09-23 08:06:40 +0000363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 else if (!Py_IS_FINITE(i)) {
365 if (PyLong_Check(w))
366 /* If i is an infinity, its magnitude exceeds any
367 * finite integer, so it doesn't matter which int we
368 * compare i with. If i is a NaN, similarly.
369 */
370 j = 0.0;
371 else
372 goto Unimplemented;
373 }
Tim Peters307fa782004-09-23 08:06:40 +0000374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 else if (PyLong_Check(w)) {
376 int vsign = i == 0.0 ? 0 : i < 0.0 ? -1 : 1;
377 int wsign = _PyLong_Sign(w);
378 size_t nbits;
379 int exponent;
Tim Peters307fa782004-09-23 08:06:40 +0000380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 if (vsign != wsign) {
382 /* Magnitudes are irrelevant -- the signs alone
383 * determine the outcome.
384 */
385 i = (double)vsign;
386 j = (double)wsign;
387 goto Compare;
388 }
389 /* The signs are the same. */
390 /* Convert w to a double if it fits. In particular, 0 fits. */
391 nbits = _PyLong_NumBits(w);
392 if (nbits == (size_t)-1 && PyErr_Occurred()) {
393 /* This long is so large that size_t isn't big enough
394 * to hold the # of bits. Replace with little doubles
395 * that give the same outcome -- w is so large that
396 * its magnitude must exceed the magnitude of any
397 * finite float.
398 */
399 PyErr_Clear();
400 i = (double)vsign;
401 assert(wsign != 0);
402 j = wsign * 2.0;
403 goto Compare;
404 }
405 if (nbits <= 48) {
406 j = PyLong_AsDouble(w);
407 /* It's impossible that <= 48 bits overflowed. */
408 assert(j != -1.0 || ! PyErr_Occurred());
409 goto Compare;
410 }
411 assert(wsign != 0); /* else nbits was 0 */
412 assert(vsign != 0); /* if vsign were 0, then since wsign is
413 * not 0, we would have taken the
414 * vsign != wsign branch at the start */
415 /* We want to work with non-negative numbers. */
416 if (vsign < 0) {
417 /* "Multiply both sides" by -1; this also swaps the
418 * comparator.
419 */
420 i = -i;
421 op = _Py_SwappedOp[op];
422 }
423 assert(i > 0.0);
424 (void) frexp(i, &exponent);
425 /* exponent is the # of bits in v before the radix point;
426 * we know that nbits (the # of bits in w) > 48 at this point
427 */
428 if (exponent < 0 || (size_t)exponent < nbits) {
429 i = 1.0;
430 j = 2.0;
431 goto Compare;
432 }
433 if ((size_t)exponent > nbits) {
434 i = 2.0;
435 j = 1.0;
436 goto Compare;
437 }
438 /* v and w have the same number of bits before the radix
Serhiy Storchaka95949422013-08-27 19:40:23 +0300439 * point. Construct two ints that have the same comparison
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 * outcome.
441 */
442 {
443 double fracpart;
444 double intpart;
445 PyObject *result = NULL;
446 PyObject *one = NULL;
447 PyObject *vv = NULL;
448 PyObject *ww = w;
Tim Peters307fa782004-09-23 08:06:40 +0000449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 if (wsign < 0) {
451 ww = PyNumber_Negative(w);
452 if (ww == NULL)
453 goto Error;
454 }
455 else
456 Py_INCREF(ww);
Tim Peters307fa782004-09-23 08:06:40 +0000457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 fracpart = modf(i, &intpart);
459 vv = PyLong_FromDouble(intpart);
460 if (vv == NULL)
461 goto Error;
Tim Peters307fa782004-09-23 08:06:40 +0000462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 if (fracpart != 0.0) {
464 /* Shift left, and or a 1 bit into vv
465 * to represent the lost fraction.
466 */
467 PyObject *temp;
Tim Peters307fa782004-09-23 08:06:40 +0000468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 one = PyLong_FromLong(1);
470 if (one == NULL)
471 goto Error;
Tim Peters307fa782004-09-23 08:06:40 +0000472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 temp = PyNumber_Lshift(ww, one);
474 if (temp == NULL)
475 goto Error;
476 Py_DECREF(ww);
477 ww = temp;
Tim Peters307fa782004-09-23 08:06:40 +0000478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 temp = PyNumber_Lshift(vv, one);
480 if (temp == NULL)
481 goto Error;
482 Py_DECREF(vv);
483 vv = temp;
Tim Peters307fa782004-09-23 08:06:40 +0000484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 temp = PyNumber_Or(vv, one);
486 if (temp == NULL)
487 goto Error;
488 Py_DECREF(vv);
489 vv = temp;
490 }
Tim Peters307fa782004-09-23 08:06:40 +0000491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 r = PyObject_RichCompareBool(vv, ww, op);
493 if (r < 0)
494 goto Error;
495 result = PyBool_FromLong(r);
496 Error:
497 Py_XDECREF(vv);
498 Py_XDECREF(ww);
499 Py_XDECREF(one);
500 return result;
501 }
502 } /* else if (PyLong_Check(w)) */
Tim Peters307fa782004-09-23 08:06:40 +0000503
Serhiy Storchaka95949422013-08-27 19:40:23 +0300504 else /* w isn't float or int */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 goto Unimplemented;
Tim Peters307fa782004-09-23 08:06:40 +0000506
507 Compare:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 PyFPE_START_PROTECT("richcompare", return NULL)
509 switch (op) {
510 case Py_EQ:
511 r = i == j;
512 break;
513 case Py_NE:
514 r = i != j;
515 break;
516 case Py_LE:
517 r = i <= j;
518 break;
519 case Py_GE:
520 r = i >= j;
521 break;
522 case Py_LT:
523 r = i < j;
524 break;
525 case Py_GT:
526 r = i > j;
527 break;
528 }
529 PyFPE_END_PROTECT(r)
530 return PyBool_FromLong(r);
Tim Peters307fa782004-09-23 08:06:40 +0000531
532 Unimplemented:
Brian Curtindfc80e32011-08-10 20:28:54 -0500533 Py_RETURN_NOTIMPLEMENTED;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000534}
535
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000536static Py_hash_t
Fred Drakefd99de62000-07-09 05:02:18 +0000537float_hash(PyFloatObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 return _Py_HashDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000540}
541
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000543float_add(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000544{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 double a,b;
546 CONVERT_TO_DOUBLE(v, a);
547 CONVERT_TO_DOUBLE(w, b);
548 PyFPE_START_PROTECT("add", return 0)
549 a = a + b;
550 PyFPE_END_PROTECT(a)
551 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000552}
553
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000555float_sub(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000556{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 double a,b;
558 CONVERT_TO_DOUBLE(v, a);
559 CONVERT_TO_DOUBLE(w, b);
560 PyFPE_START_PROTECT("subtract", return 0)
561 a = a - b;
562 PyFPE_END_PROTECT(a)
563 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000564}
565
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000567float_mul(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000568{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 double a,b;
570 CONVERT_TO_DOUBLE(v, a);
571 CONVERT_TO_DOUBLE(w, b);
572 PyFPE_START_PROTECT("multiply", return 0)
573 a = a * b;
574 PyFPE_END_PROTECT(a)
575 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000576}
577
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000579float_div(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 double a,b;
582 CONVERT_TO_DOUBLE(v, a);
583 CONVERT_TO_DOUBLE(w, b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 if (b == 0.0) {
585 PyErr_SetString(PyExc_ZeroDivisionError,
586 "float division by zero");
587 return NULL;
588 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 PyFPE_START_PROTECT("divide", return 0)
590 a = a / b;
591 PyFPE_END_PROTECT(a)
592 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000593}
594
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000596float_rem(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 double vx, wx;
599 double mod;
600 CONVERT_TO_DOUBLE(v, vx);
601 CONVERT_TO_DOUBLE(w, wx);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 if (wx == 0.0) {
603 PyErr_SetString(PyExc_ZeroDivisionError,
604 "float modulo");
605 return NULL;
606 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 PyFPE_START_PROTECT("modulo", return 0)
608 mod = fmod(vx, wx);
Mark Dickinsond2a9b202010-12-04 12:25:30 +0000609 if (mod) {
610 /* ensure the remainder has the same sign as the denominator */
611 if ((wx < 0) != (mod < 0)) {
612 mod += wx;
613 }
614 }
615 else {
616 /* the remainder is zero, and in the presence of signed zeroes
617 fmod returns different results across platforms; ensure
Mark Dickinson7b1bee42010-12-04 13:14:29 +0000618 it has the same sign as the denominator. */
619 mod = copysign(0.0, wx);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 }
621 PyFPE_END_PROTECT(mod)
622 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000623}
624
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000626float_divmod(PyObject *v, PyObject *w)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000627{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 double vx, wx;
629 double div, mod, floordiv;
630 CONVERT_TO_DOUBLE(v, vx);
631 CONVERT_TO_DOUBLE(w, wx);
632 if (wx == 0.0) {
633 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
634 return NULL;
635 }
636 PyFPE_START_PROTECT("divmod", return 0)
637 mod = fmod(vx, wx);
638 /* fmod is typically exact, so vx-mod is *mathematically* an
639 exact multiple of wx. But this is fp arithmetic, and fp
640 vx - mod is an approximation; the result is that div may
641 not be an exact integral value after the division, although
642 it will always be very close to one.
643 */
644 div = (vx - mod) / wx;
645 if (mod) {
646 /* ensure the remainder has the same sign as the denominator */
647 if ((wx < 0) != (mod < 0)) {
648 mod += wx;
649 div -= 1.0;
650 }
651 }
652 else {
653 /* the remainder is zero, and in the presence of signed zeroes
654 fmod returns different results across platforms; ensure
Mark Dickinson7b1bee42010-12-04 13:14:29 +0000655 it has the same sign as the denominator. */
656 mod = copysign(0.0, wx);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 }
658 /* snap quotient to nearest integral value */
659 if (div) {
660 floordiv = floor(div);
661 if (div - floordiv > 0.5)
662 floordiv += 1.0;
663 }
664 else {
665 /* div is zero - get the same sign as the true quotient */
Mark Dickinson7b1bee42010-12-04 13:14:29 +0000666 floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 }
668 PyFPE_END_PROTECT(floordiv)
669 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000670}
671
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672static PyObject *
Tim Peters63a35712001-12-11 19:57:24 +0000673float_floor_div(PyObject *v, PyObject *w)
674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 PyObject *t, *r;
Tim Peters63a35712001-12-11 19:57:24 +0000676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 t = float_divmod(v, w);
678 if (t == NULL || t == Py_NotImplemented)
679 return t;
680 assert(PyTuple_CheckExact(t));
681 r = PyTuple_GET_ITEM(t, 0);
682 Py_INCREF(r);
683 Py_DECREF(t);
684 return r;
Tim Peters63a35712001-12-11 19:57:24 +0000685}
686
Mark Dickinson9ab44b52009-12-30 16:22:49 +0000687/* determine whether x is an odd integer or not; assumes that
688 x is not an infinity or nan. */
689#define DOUBLE_IS_ODD_INTEGER(x) (fmod(fabs(x), 2.0) == 1.0)
690
Tim Peters63a35712001-12-11 19:57:24 +0000691static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000692float_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000693{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 double iv, iw, ix;
695 int negate_result = 0;
Tim Peters32f453e2001-09-03 08:35:41 +0000696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 if ((PyObject *)z != Py_None) {
698 PyErr_SetString(PyExc_TypeError, "pow() 3rd argument not "
699 "allowed unless all arguments are integers");
700 return NULL;
701 }
Tim Peters32f453e2001-09-03 08:35:41 +0000702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 CONVERT_TO_DOUBLE(v, iv);
704 CONVERT_TO_DOUBLE(w, iw);
Tim Petersc54d1902000-10-06 00:36:09 +0000705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 /* Sort out special cases here instead of relying on pow() */
707 if (iw == 0) { /* v**0 is 1, even 0**0 */
708 return PyFloat_FromDouble(1.0);
709 }
710 if (Py_IS_NAN(iv)) { /* nan**w = nan, unless w == 0 */
711 return PyFloat_FromDouble(iv);
712 }
713 if (Py_IS_NAN(iw)) { /* v**nan = nan, unless v == 1; 1**nan = 1 */
714 return PyFloat_FromDouble(iv == 1.0 ? 1.0 : iw);
715 }
716 if (Py_IS_INFINITY(iw)) {
717 /* v**inf is: 0.0 if abs(v) < 1; 1.0 if abs(v) == 1; inf if
718 * abs(v) > 1 (including case where v infinite)
719 *
720 * v**-inf is: inf if abs(v) < 1; 1.0 if abs(v) == 1; 0.0 if
721 * abs(v) > 1 (including case where v infinite)
722 */
723 iv = fabs(iv);
724 if (iv == 1.0)
725 return PyFloat_FromDouble(1.0);
726 else if ((iw > 0.0) == (iv > 1.0))
727 return PyFloat_FromDouble(fabs(iw)); /* return inf */
728 else
729 return PyFloat_FromDouble(0.0);
730 }
731 if (Py_IS_INFINITY(iv)) {
732 /* (+-inf)**w is: inf for w positive, 0 for w negative; in
733 * both cases, we need to add the appropriate sign if w is
734 * an odd integer.
735 */
736 int iw_is_odd = DOUBLE_IS_ODD_INTEGER(iw);
737 if (iw > 0.0)
738 return PyFloat_FromDouble(iw_is_odd ? iv : fabs(iv));
739 else
740 return PyFloat_FromDouble(iw_is_odd ?
741 copysign(0.0, iv) : 0.0);
742 }
743 if (iv == 0.0) { /* 0**w is: 0 for w positive, 1 for w zero
744 (already dealt with above), and an error
745 if w is negative. */
746 int iw_is_odd = DOUBLE_IS_ODD_INTEGER(iw);
747 if (iw < 0.0) {
748 PyErr_SetString(PyExc_ZeroDivisionError,
749 "0.0 cannot be raised to a "
750 "negative power");
751 return NULL;
752 }
753 /* use correct sign if iw is odd */
754 return PyFloat_FromDouble(iw_is_odd ? iv : 0.0);
755 }
Mark Dickinson9ab44b52009-12-30 16:22:49 +0000756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 if (iv < 0.0) {
758 /* Whether this is an error is a mess, and bumps into libm
759 * bugs so we have to figure it out ourselves.
760 */
761 if (iw != floor(iw)) {
762 /* Negative numbers raised to fractional powers
763 * become complex.
764 */
765 return PyComplex_Type.tp_as_number->nb_power(v, w, z);
766 }
767 /* iw is an exact integer, albeit perhaps a very large
768 * one. Replace iv by its absolute value and remember
769 * to negate the pow result if iw is odd.
770 */
771 iv = -iv;
772 negate_result = DOUBLE_IS_ODD_INTEGER(iw);
773 }
Mark Dickinson9ab44b52009-12-30 16:22:49 +0000774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 if (iv == 1.0) { /* 1**w is 1, even 1**inf and 1**nan */
776 /* (-1) ** large_integer also ends up here. Here's an
777 * extract from the comments for the previous
778 * implementation explaining why this special case is
779 * necessary:
780 *
781 * -1 raised to an exact integer should never be exceptional.
782 * Alas, some libms (chiefly glibc as of early 2003) return
783 * NaN and set EDOM on pow(-1, large_int) if the int doesn't
784 * happen to be representable in a *C* integer. That's a
785 * bug.
786 */
787 return PyFloat_FromDouble(negate_result ? -1.0 : 1.0);
788 }
Mark Dickinson9ab44b52009-12-30 16:22:49 +0000789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 /* Now iv and iw are finite, iw is nonzero, and iv is
791 * positive and not equal to 1.0. We finally allow
792 * the platform pow to step in and do the rest.
793 */
794 errno = 0;
795 PyFPE_START_PROTECT("pow", return NULL)
796 ix = pow(iv, iw);
797 PyFPE_END_PROTECT(ix)
798 Py_ADJUST_ERANGE1(ix);
799 if (negate_result)
800 ix = -ix;
Mark Dickinson9ab44b52009-12-30 16:22:49 +0000801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 if (errno != 0) {
803 /* We don't expect any errno value other than ERANGE, but
804 * the range of libm bugs appears unbounded.
805 */
806 PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError :
807 PyExc_ValueError);
808 return NULL;
809 }
810 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000811}
812
Mark Dickinson9ab44b52009-12-30 16:22:49 +0000813#undef DOUBLE_IS_ODD_INTEGER
814
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000815static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000816float_neg(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000819}
820
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000821static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000822float_abs(PyFloatObject *v)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000823{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 return PyFloat_FromDouble(fabs(v->ob_fval));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000825}
826
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000827static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000828float_bool(PyFloatObject *v)
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000829{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 return v->ob_fval != 0.0;
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000831}
832
Serhiy Storchakab5c51d32017-03-11 09:21:05 +0200833/*[clinic input]
834float.is_integer
835
836Return True if the float is an integer.
837[clinic start generated code]*/
838
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +0200840float_is_integer_impl(PyObject *self)
841/*[clinic end generated code: output=7112acf95a4d31ea input=311810d3f777e10d]*/
Christian Heimes53876d92008-04-19 00:31:39 +0000842{
Serhiy Storchakab5c51d32017-03-11 09:21:05 +0200843 double x = PyFloat_AsDouble(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 PyObject *o;
845
846 if (x == -1.0 && PyErr_Occurred())
847 return NULL;
848 if (!Py_IS_FINITE(x))
849 Py_RETURN_FALSE;
850 errno = 0;
851 PyFPE_START_PROTECT("is_integer", return NULL)
852 o = (floor(x) == x) ? Py_True : Py_False;
853 PyFPE_END_PROTECT(x)
854 if (errno != 0) {
855 PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError :
856 PyExc_ValueError);
857 return NULL;
858 }
859 Py_INCREF(o);
860 return o;
Christian Heimes53876d92008-04-19 00:31:39 +0000861}
862
863#if 0
864static PyObject *
865float_is_inf(PyObject *v)
866{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 double x = PyFloat_AsDouble(v);
868 if (x == -1.0 && PyErr_Occurred())
869 return NULL;
870 return PyBool_FromLong((long)Py_IS_INFINITY(x));
Christian Heimes53876d92008-04-19 00:31:39 +0000871}
872
873static PyObject *
874float_is_nan(PyObject *v)
875{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 double x = PyFloat_AsDouble(v);
877 if (x == -1.0 && PyErr_Occurred())
878 return NULL;
879 return PyBool_FromLong((long)Py_IS_NAN(x));
Christian Heimes53876d92008-04-19 00:31:39 +0000880}
881
882static PyObject *
883float_is_finite(PyObject *v)
884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 double x = PyFloat_AsDouble(v);
886 if (x == -1.0 && PyErr_Occurred())
887 return NULL;
888 return PyBool_FromLong((long)Py_IS_FINITE(x));
Christian Heimes53876d92008-04-19 00:31:39 +0000889}
890#endif
891
Serhiy Storchakab5c51d32017-03-11 09:21:05 +0200892/*[clinic input]
893float.__trunc__
894
895Return the Integral closest to x between 0 and x.
896[clinic start generated code]*/
897
Christian Heimes53876d92008-04-19 00:31:39 +0000898static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +0200899float___trunc___impl(PyObject *self)
900/*[clinic end generated code: output=dd3e289dd4c6b538 input=591b9ba0d650fdff]*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000901{
Serhiy Storchakab5c51d32017-03-11 09:21:05 +0200902 double x = PyFloat_AsDouble(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 double wholepart; /* integral portion of x, rounded toward 0 */
Tim Peters7321ec42001-07-26 20:02:17 +0000904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 (void)modf(x, &wholepart);
906 /* Try to get out cheap if this fits in a Python int. The attempt
907 * to cast to long must be protected, as C doesn't define what
908 * happens if the double is too big to fit in a long. Some rare
909 * systems raise an exception then (RISCOS was mentioned as one,
910 * and someone using a non-default option on Sun also bumped into
911 * that). Note that checking for >= and <= LONG_{MIN,MAX} would
912 * still be vulnerable: if a long has more bits of precision than
913 * a double, casting MIN/MAX to double may yield an approximation,
914 * and if that's rounded up, then, e.g., wholepart=LONG_MAX+1 would
915 * yield true from the C expression wholepart<=LONG_MAX, despite
916 * that wholepart is actually greater than LONG_MAX.
917 */
918 if (LONG_MIN < wholepart && wholepart < LONG_MAX) {
919 const long aslong = (long)wholepart;
920 return PyLong_FromLong(aslong);
921 }
922 return PyLong_FromDouble(wholepart);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000923}
924
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000925/* double_round: rounds a finite double to the closest multiple of
926 10**-ndigits; here ndigits is within reasonable bounds (typically, -308 <=
927 ndigits <= 323). Returns a Python float, or sets a Python error and
928 returns NULL on failure (OverflowError and memory errors are possible). */
929
930#ifndef PY_NO_SHORT_FLOAT_REPR
931/* version of double_round that uses the correctly-rounded string<->double
932 conversions from Python/dtoa.c */
933
934static PyObject *
935double_round(double x, int ndigits) {
936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 double rounded;
938 Py_ssize_t buflen, mybuflen=100;
939 char *buf, *buf_end, shortbuf[100], *mybuf=shortbuf;
940 int decpt, sign;
941 PyObject *result = NULL;
Mark Dickinson261896b2012-01-27 21:16:01 +0000942 _Py_SET_53BIT_PRECISION_HEADER;
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 /* round to a decimal string */
Mark Dickinson261896b2012-01-27 21:16:01 +0000945 _Py_SET_53BIT_PRECISION_START;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 buf = _Py_dg_dtoa(x, 3, ndigits, &decpt, &sign, &buf_end);
Mark Dickinson261896b2012-01-27 21:16:01 +0000947 _Py_SET_53BIT_PRECISION_END;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 if (buf == NULL) {
949 PyErr_NoMemory();
950 return NULL;
951 }
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 /* Get new buffer if shortbuf is too small. Space needed <= buf_end -
954 buf + 8: (1 extra for '0', 1 for sign, 5 for exp, 1 for '\0'). */
955 buflen = buf_end - buf;
956 if (buflen + 8 > mybuflen) {
957 mybuflen = buflen+8;
958 mybuf = (char *)PyMem_Malloc(mybuflen);
959 if (mybuf == NULL) {
960 PyErr_NoMemory();
961 goto exit;
962 }
963 }
964 /* copy buf to mybuf, adding exponent, sign and leading 0 */
965 PyOS_snprintf(mybuf, mybuflen, "%s0%se%d", (sign ? "-" : ""),
966 buf, decpt - (int)buflen);
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 /* and convert the resulting string back to a double */
969 errno = 0;
Mark Dickinson261896b2012-01-27 21:16:01 +0000970 _Py_SET_53BIT_PRECISION_START;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 rounded = _Py_dg_strtod(mybuf, NULL);
Mark Dickinson261896b2012-01-27 21:16:01 +0000972 _Py_SET_53BIT_PRECISION_END;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 if (errno == ERANGE && fabs(rounded) >= 1.)
974 PyErr_SetString(PyExc_OverflowError,
975 "rounded value too large to represent");
976 else
977 result = PyFloat_FromDouble(rounded);
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 /* done computing value; now clean up */
980 if (mybuf != shortbuf)
981 PyMem_Free(mybuf);
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000982 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 _Py_dg_freedtoa(buf);
984 return result;
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000985}
986
987#else /* PY_NO_SHORT_FLOAT_REPR */
988
989/* fallback version, to be used when correctly rounded binary<->decimal
990 conversions aren't available */
991
992static PyObject *
993double_round(double x, int ndigits) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 double pow1, pow2, y, z;
995 if (ndigits >= 0) {
996 if (ndigits > 22) {
997 /* pow1 and pow2 are each safe from overflow, but
998 pow1*pow2 ~= pow(10.0, ndigits) might overflow */
999 pow1 = pow(10.0, (double)(ndigits-22));
1000 pow2 = 1e22;
1001 }
1002 else {
1003 pow1 = pow(10.0, (double)ndigits);
1004 pow2 = 1.0;
1005 }
1006 y = (x*pow1)*pow2;
1007 /* if y overflows, then rounded value is exactly x */
1008 if (!Py_IS_FINITE(y))
1009 return PyFloat_FromDouble(x);
1010 }
1011 else {
1012 pow1 = pow(10.0, (double)-ndigits);
1013 pow2 = 1.0; /* unused; silences a gcc compiler warning */
1014 y = x / pow1;
1015 }
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 z = round(y);
1018 if (fabs(y-z) == 0.5)
1019 /* halfway between two integers; use round-half-even */
1020 z = 2.0*round(y/2.0);
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 if (ndigits >= 0)
1023 z = (z / pow2) / pow1;
1024 else
1025 z *= pow1;
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 /* if computation resulted in overflow, raise OverflowError */
1028 if (!Py_IS_FINITE(z)) {
1029 PyErr_SetString(PyExc_OverflowError,
1030 "overflow occurred during round");
1031 return NULL;
1032 }
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 return PyFloat_FromDouble(z);
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001035}
1036
1037#endif /* PY_NO_SHORT_FLOAT_REPR */
1038
1039/* round a Python float v to the closest multiple of 10**-ndigits */
1040
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001041/*[clinic input]
1042float.__round__
1043
1044 ndigits as o_ndigits: object = NULL
1045 /
1046
1047Return the Integral closest to x, rounding half toward even.
1048
1049When an argument is passed, work like built-in round(x, ndigits).
1050[clinic start generated code]*/
1051
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001053float___round___impl(PyObject *self, PyObject *o_ndigits)
1054/*[clinic end generated code: output=374c36aaa0f13980 input=1ca2316b510293b8]*/
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001055{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 double x, rounded;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 Py_ssize_t ndigits;
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001058
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001059 x = PyFloat_AsDouble(self);
Steve Dowercb39d1f2015-04-15 16:10:59 -04001060 if (o_ndigits == NULL || o_ndigits == Py_None) {
1061 /* single-argument round or with None ndigits:
1062 * round to nearest integer */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 rounded = round(x);
1064 if (fabs(x-rounded) == 0.5)
1065 /* halfway case: round to even */
1066 rounded = 2.0*round(x/2.0);
1067 return PyLong_FromDouble(rounded);
1068 }
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 /* interpret second argument as a Py_ssize_t; clips on overflow */
1071 ndigits = PyNumber_AsSsize_t(o_ndigits, NULL);
1072 if (ndigits == -1 && PyErr_Occurred())
1073 return NULL;
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 /* nans and infinities round to themselves */
1076 if (!Py_IS_FINITE(x))
1077 return PyFloat_FromDouble(x);
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 /* Deal with extreme values for ndigits. For ndigits > NDIGITS_MAX, x
1080 always rounds to itself. For ndigits < NDIGITS_MIN, x always
1081 rounds to +-0.0. Here 0.30103 is an upper bound for log10(2). */
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001082#define NDIGITS_MAX ((int)((DBL_MANT_DIG-DBL_MIN_EXP) * 0.30103))
1083#define NDIGITS_MIN (-(int)((DBL_MAX_EXP + 1) * 0.30103))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 if (ndigits > NDIGITS_MAX)
1085 /* return x */
1086 return PyFloat_FromDouble(x);
1087 else if (ndigits < NDIGITS_MIN)
1088 /* return 0.0, but with sign of x */
1089 return PyFloat_FromDouble(0.0*x);
1090 else
1091 /* finite x, and ndigits is not unreasonably large */
1092 return double_round(x, (int)ndigits);
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001093#undef NDIGITS_MAX
1094#undef NDIGITS_MIN
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001095}
1096
1097static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +00001098float_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 if (PyFloat_CheckExact(v))
1101 Py_INCREF(v);
1102 else
1103 v = PyFloat_FromDouble(((PyFloatObject *)v)->ob_fval);
1104 return v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001105}
1106
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001107/*[clinic input]
1108float.conjugate
1109
1110Return self, the complex conjugate of any float.
1111[clinic start generated code]*/
1112
1113static PyObject *
1114float_conjugate_impl(PyObject *self)
1115/*[clinic end generated code: output=8ca292c2479194af input=82ba6f37a9ff91dd]*/
1116{
1117 return float_float(self);
1118}
1119
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001120/* turn ASCII hex characters into integer values and vice versa */
1121
1122static char
1123char_from_hex(int x)
1124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 assert(0 <= x && x < 16);
Victor Stinnerf5cff562011-10-14 02:13:11 +02001126 return Py_hexdigits[x];
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001127}
1128
1129static int
1130hex_from_char(char c) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 int x;
1132 switch(c) {
1133 case '0':
1134 x = 0;
1135 break;
1136 case '1':
1137 x = 1;
1138 break;
1139 case '2':
1140 x = 2;
1141 break;
1142 case '3':
1143 x = 3;
1144 break;
1145 case '4':
1146 x = 4;
1147 break;
1148 case '5':
1149 x = 5;
1150 break;
1151 case '6':
1152 x = 6;
1153 break;
1154 case '7':
1155 x = 7;
1156 break;
1157 case '8':
1158 x = 8;
1159 break;
1160 case '9':
1161 x = 9;
1162 break;
1163 case 'a':
1164 case 'A':
1165 x = 10;
1166 break;
1167 case 'b':
1168 case 'B':
1169 x = 11;
1170 break;
1171 case 'c':
1172 case 'C':
1173 x = 12;
1174 break;
1175 case 'd':
1176 case 'D':
1177 x = 13;
1178 break;
1179 case 'e':
1180 case 'E':
1181 x = 14;
1182 break;
1183 case 'f':
1184 case 'F':
1185 x = 15;
1186 break;
1187 default:
1188 x = -1;
1189 break;
1190 }
1191 return x;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001192}
1193
1194/* convert a float to a hexadecimal string */
1195
1196/* TOHEX_NBITS is DBL_MANT_DIG rounded up to the next integer
1197 of the form 4k+1. */
1198#define TOHEX_NBITS DBL_MANT_DIG + 3 - (DBL_MANT_DIG+2)%4
1199
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001200/*[clinic input]
1201float.hex
1202
1203Return a hexadecimal representation of a floating-point number.
1204
1205>>> (-0.1).hex()
1206'-0x1.999999999999ap-4'
1207>>> 3.14159.hex()
1208'0x1.921f9f01b866ep+1'
1209[clinic start generated code]*/
1210
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001211static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001212float_hex_impl(PyObject *self)
1213/*[clinic end generated code: output=0ebc9836e4d302d4 input=bec1271a33d47e67]*/
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001214{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 double x, m;
1216 int e, shift, i, si, esign;
1217 /* Space for 1+(TOHEX_NBITS-1)/4 digits, a decimal point, and the
1218 trailing NUL byte. */
1219 char s[(TOHEX_NBITS-1)/4+3];
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001220
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001221 CONVERT_TO_DOUBLE(self, x);
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 if (Py_IS_NAN(x) || Py_IS_INFINITY(x))
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001224 return float_repr((PyFloatObject *)self);
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 if (x == 0.0) {
Benjamin Peterson5d470832010-07-02 19:45:07 +00001227 if (copysign(1.0, x) == -1.0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 return PyUnicode_FromString("-0x0.0p+0");
1229 else
1230 return PyUnicode_FromString("0x0.0p+0");
1231 }
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 m = frexp(fabs(x), &e);
Victor Stinner640c35c2013-06-04 23:14:37 +02001234 shift = 1 - Py_MAX(DBL_MIN_EXP - e, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 m = ldexp(m, shift);
1236 e -= shift;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 si = 0;
1239 s[si] = char_from_hex((int)m);
1240 si++;
1241 m -= (int)m;
1242 s[si] = '.';
1243 si++;
1244 for (i=0; i < (TOHEX_NBITS-1)/4; i++) {
1245 m *= 16.0;
1246 s[si] = char_from_hex((int)m);
1247 si++;
1248 m -= (int)m;
1249 }
1250 s[si] = '\0';
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 if (e < 0) {
1253 esign = (int)'-';
1254 e = -e;
1255 }
1256 else
1257 esign = (int)'+';
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 if (x < 0.0)
1260 return PyUnicode_FromFormat("-0x%sp%c%d", s, esign, e);
1261 else
1262 return PyUnicode_FromFormat("0x%sp%c%d", s, esign, e);
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001263}
1264
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001265/* Convert a hexadecimal string to a float. */
1266
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001267/*[clinic input]
1268@classmethod
1269float.fromhex
1270
1271 string: object
1272 /
1273
1274Create a floating-point number from a hexadecimal string.
1275
1276>>> float.fromhex('0x1.ffffp10')
12772047.984375
1278>>> float.fromhex('-0x1p-1074')
1279-5e-324
1280[clinic start generated code]*/
1281
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001282static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001283float_fromhex(PyTypeObject *type, PyObject *string)
1284/*[clinic end generated code: output=46c0274d22b78e82 input=0407bebd354bca89]*/
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001285{
Serhiy Storchaka25885d12016-05-12 10:21:14 +03001286 PyObject *result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 double x;
1288 long exp, top_exp, lsb, key_digit;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02001289 const char *s, *coeff_start, *s_store, *coeff_end, *exp_start, *s_end;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 int half_eps, digit, round_up, negate=0;
1291 Py_ssize_t length, ndigits, fdigits, i;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 /*
1294 * For the sake of simplicity and correctness, we impose an artificial
1295 * limit on ndigits, the total number of hex digits in the coefficient
1296 * The limit is chosen to ensure that, writing exp for the exponent,
1297 *
1298 * (1) if exp > LONG_MAX/2 then the value of the hex string is
1299 * guaranteed to overflow (provided it's nonzero)
1300 *
1301 * (2) if exp < LONG_MIN/2 then the value of the hex string is
1302 * guaranteed to underflow to 0.
1303 *
1304 * (3) if LONG_MIN/2 <= exp <= LONG_MAX/2 then there's no danger of
1305 * overflow in the calculation of exp and top_exp below.
1306 *
1307 * More specifically, ndigits is assumed to satisfy the following
1308 * inequalities:
1309 *
1310 * 4*ndigits <= DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2
1311 * 4*ndigits <= LONG_MAX/2 + 1 - DBL_MAX_EXP
1312 *
1313 * If either of these inequalities is not satisfied, a ValueError is
1314 * raised. Otherwise, write x for the value of the hex string, and
1315 * assume x is nonzero. Then
1316 *
1317 * 2**(exp-4*ndigits) <= |x| < 2**(exp+4*ndigits).
1318 *
1319 * Now if exp > LONG_MAX/2 then:
1320 *
1321 * exp - 4*ndigits >= LONG_MAX/2 + 1 - (LONG_MAX/2 + 1 - DBL_MAX_EXP)
1322 * = DBL_MAX_EXP
1323 *
1324 * so |x| >= 2**DBL_MAX_EXP, which is too large to be stored in C
1325 * double, so overflows. If exp < LONG_MIN/2, then
1326 *
1327 * exp + 4*ndigits <= LONG_MIN/2 - 1 + (
1328 * DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2)
1329 * = DBL_MIN_EXP - DBL_MANT_DIG - 1
1330 *
1331 * and so |x| < 2**(DBL_MIN_EXP-DBL_MANT_DIG-1), hence underflows to 0
1332 * when converted to a C double.
1333 *
1334 * It's easy to show that if LONG_MIN/2 <= exp <= LONG_MAX/2 then both
1335 * exp+4*ndigits and exp-4*ndigits are within the range of a long.
1336 */
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001337
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001338 s = PyUnicode_AsUTF8AndSize(string, &length);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 if (s == NULL)
1340 return NULL;
1341 s_end = s + length;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 /********************
1344 * Parse the string *
1345 ********************/
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 /* leading whitespace */
1348 while (Py_ISSPACE(*s))
1349 s++;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 /* infinities and nans */
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02001352 x = _Py_parse_inf_or_nan(s, (char **)&coeff_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 if (coeff_end != s) {
1354 s = coeff_end;
1355 goto finished;
1356 }
Mark Dickinsonbd16edd2009-05-20 22:05:25 +00001357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 /* optional sign */
1359 if (*s == '-') {
1360 s++;
1361 negate = 1;
1362 }
1363 else if (*s == '+')
1364 s++;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 /* [0x] */
1367 s_store = s;
1368 if (*s == '0') {
1369 s++;
1370 if (*s == 'x' || *s == 'X')
1371 s++;
1372 else
1373 s = s_store;
1374 }
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 /* coefficient: <integer> [. <fraction>] */
1377 coeff_start = s;
1378 while (hex_from_char(*s) >= 0)
1379 s++;
1380 s_store = s;
1381 if (*s == '.') {
1382 s++;
1383 while (hex_from_char(*s) >= 0)
1384 s++;
1385 coeff_end = s-1;
1386 }
1387 else
1388 coeff_end = s;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 /* ndigits = total # of hex digits; fdigits = # after point */
1391 ndigits = coeff_end - coeff_start;
1392 fdigits = coeff_end - s_store;
1393 if (ndigits == 0)
1394 goto parse_error;
Victor Stinner640c35c2013-06-04 23:14:37 +02001395 if (ndigits > Py_MIN(DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2,
1396 LONG_MAX/2 + 1 - DBL_MAX_EXP)/4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 goto insane_length_error;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 /* [p <exponent>] */
1400 if (*s == 'p' || *s == 'P') {
1401 s++;
1402 exp_start = s;
1403 if (*s == '-' || *s == '+')
1404 s++;
1405 if (!('0' <= *s && *s <= '9'))
1406 goto parse_error;
1407 s++;
1408 while ('0' <= *s && *s <= '9')
1409 s++;
1410 exp = strtol(exp_start, NULL, 10);
1411 }
1412 else
1413 exp = 0;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001414
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001415/* for 0 <= j < ndigits, HEX_DIGIT(j) gives the jth most significant digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416#define HEX_DIGIT(j) hex_from_char(*((j) < fdigits ? \
1417 coeff_end-(j) : \
1418 coeff_end-1-(j)))
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 /*******************************************
1421 * Compute rounded value of the hex string *
1422 *******************************************/
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 /* Discard leading zeros, and catch extreme overflow and underflow */
1425 while (ndigits > 0 && HEX_DIGIT(ndigits-1) == 0)
1426 ndigits--;
1427 if (ndigits == 0 || exp < LONG_MIN/2) {
1428 x = 0.0;
1429 goto finished;
1430 }
1431 if (exp > LONG_MAX/2)
1432 goto overflow_error;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 /* Adjust exponent for fractional part. */
1435 exp = exp - 4*((long)fdigits);
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 /* top_exp = 1 more than exponent of most sig. bit of coefficient */
1438 top_exp = exp + 4*((long)ndigits - 1);
1439 for (digit = HEX_DIGIT(ndigits-1); digit != 0; digit /= 2)
1440 top_exp++;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 /* catch almost all nonextreme cases of overflow and underflow here */
1443 if (top_exp < DBL_MIN_EXP - DBL_MANT_DIG) {
1444 x = 0.0;
1445 goto finished;
1446 }
1447 if (top_exp > DBL_MAX_EXP)
1448 goto overflow_error;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 /* lsb = exponent of least significant bit of the *rounded* value.
1451 This is top_exp - DBL_MANT_DIG unless result is subnormal. */
Victor Stinner640c35c2013-06-04 23:14:37 +02001452 lsb = Py_MAX(top_exp, (long)DBL_MIN_EXP) - DBL_MANT_DIG;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 x = 0.0;
1455 if (exp >= lsb) {
1456 /* no rounding required */
1457 for (i = ndigits-1; i >= 0; i--)
1458 x = 16.0*x + HEX_DIGIT(i);
1459 x = ldexp(x, (int)(exp));
1460 goto finished;
1461 }
1462 /* rounding required. key_digit is the index of the hex digit
1463 containing the first bit to be rounded away. */
1464 half_eps = 1 << (int)((lsb - exp - 1) % 4);
1465 key_digit = (lsb - exp - 1) / 4;
1466 for (i = ndigits-1; i > key_digit; i--)
1467 x = 16.0*x + HEX_DIGIT(i);
1468 digit = HEX_DIGIT(key_digit);
1469 x = 16.0*x + (double)(digit & (16-2*half_eps));
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 /* round-half-even: round up if bit lsb-1 is 1 and at least one of
1472 bits lsb, lsb-2, lsb-3, lsb-4, ... is 1. */
1473 if ((digit & half_eps) != 0) {
1474 round_up = 0;
1475 if ((digit & (3*half_eps-1)) != 0 ||
1476 (half_eps == 8 && (HEX_DIGIT(key_digit+1) & 1) != 0))
1477 round_up = 1;
1478 else
1479 for (i = key_digit-1; i >= 0; i--)
1480 if (HEX_DIGIT(i) != 0) {
1481 round_up = 1;
1482 break;
1483 }
Mark Dickinson21a1f732010-07-06 15:11:44 +00001484 if (round_up) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 x += 2*half_eps;
1486 if (top_exp == DBL_MAX_EXP &&
1487 x == ldexp((double)(2*half_eps), DBL_MANT_DIG))
1488 /* overflow corner case: pre-rounded value <
1489 2**DBL_MAX_EXP; rounded=2**DBL_MAX_EXP. */
1490 goto overflow_error;
1491 }
1492 }
1493 x = ldexp(x, (int)(exp+4*key_digit));
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001494
1495 finished:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 /* optional trailing whitespace leading to the end of the string */
1497 while (Py_ISSPACE(*s))
1498 s++;
1499 if (s != s_end)
1500 goto parse_error;
Serhiy Storchaka25885d12016-05-12 10:21:14 +03001501 result = PyFloat_FromDouble(negate ? -x : x);
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001502 if (type != &PyFloat_Type && result != NULL) {
1503 Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type, result, NULL));
Serhiy Storchaka25885d12016-05-12 10:21:14 +03001504 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 return result;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001506
1507 overflow_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 PyErr_SetString(PyExc_OverflowError,
1509 "hexadecimal value too large to represent as a float");
1510 return NULL;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001511
1512 parse_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 PyErr_SetString(PyExc_ValueError,
1514 "invalid hexadecimal floating-point string");
1515 return NULL;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001516
1517 insane_length_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 PyErr_SetString(PyExc_ValueError,
1519 "hexadecimal string too long to convert");
1520 return NULL;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001521}
1522
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001523/*[clinic input]
1524float.as_integer_ratio
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001525
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001526Return integer ratio.
1527
1528Return a pair of integers, whose ratio is exactly equal to the original float
1529and with a positive denominator.
1530
1531Raise OverflowError on infinities and a ValueError on NaNs.
1532
1533>>> (10.0).as_integer_ratio()
1534(10, 1)
1535>>> (0.0).as_integer_ratio()
1536(0, 1)
1537>>> (-.25).as_integer_ratio()
1538(-1, 4)
1539[clinic start generated code]*/
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001540
Christian Heimes26855632008-01-27 23:50:43 +00001541static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001542float_as_integer_ratio_impl(PyObject *self)
1543/*[clinic end generated code: output=65f25f0d8d30a712 input=e21d08b4630c2e44]*/
Christian Heimes26855632008-01-27 23:50:43 +00001544{
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001545 double self_double;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 double float_part;
1547 int exponent;
1548 int i;
Christian Heimes292d3512008-02-03 16:51:08 +00001549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 PyObject *py_exponent = NULL;
1551 PyObject *numerator = NULL;
1552 PyObject *denominator = NULL;
1553 PyObject *result_pair = NULL;
1554 PyNumberMethods *long_methods = PyLong_Type.tp_as_number;
Christian Heimes26855632008-01-27 23:50:43 +00001555
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001556 CONVERT_TO_DOUBLE(self, self_double);
Christian Heimes26855632008-01-27 23:50:43 +00001557
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001558 if (Py_IS_INFINITY(self_double)) {
Serhiy Storchaka0d250bc2015-12-29 22:34:23 +02001559 PyErr_SetString(PyExc_OverflowError,
1560 "cannot convert Infinity to integer ratio");
1561 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 }
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001563 if (Py_IS_NAN(self_double)) {
Serhiy Storchaka0d250bc2015-12-29 22:34:23 +02001564 PyErr_SetString(PyExc_ValueError,
1565 "cannot convert NaN to integer ratio");
1566 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 }
Christian Heimes26855632008-01-27 23:50:43 +00001568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 PyFPE_START_PROTECT("as_integer_ratio", goto error);
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001570 float_part = frexp(self_double, &exponent); /* self_double == float_part * 2**exponent exactly */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 PyFPE_END_PROTECT(float_part);
Christian Heimes26855632008-01-27 23:50:43 +00001572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 for (i=0; i<300 && float_part != floor(float_part) ; i++) {
1574 float_part *= 2.0;
1575 exponent--;
1576 }
1577 /* self == float_part * 2**exponent exactly and float_part is integral.
1578 If FLT_RADIX != 2, the 300 steps may leave a tiny fractional part
1579 to be truncated by PyLong_FromDouble(). */
Christian Heimes26855632008-01-27 23:50:43 +00001580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 numerator = PyLong_FromDouble(float_part);
Serhiy Storchaka4e6aad12015-12-29 22:55:48 +02001582 if (numerator == NULL)
1583 goto error;
1584 denominator = PyLong_FromLong(1);
1585 if (denominator == NULL)
1586 goto error;
1587 py_exponent = PyLong_FromLong(Py_ABS(exponent));
1588 if (py_exponent == NULL)
1589 goto error;
Christian Heimes26855632008-01-27 23:50:43 +00001590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 /* fold in 2**exponent */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 if (exponent > 0) {
Serhiy Storchaka59865e72016-04-11 09:57:37 +03001593 Py_SETREF(numerator,
Serhiy Storchaka4e6aad12015-12-29 22:55:48 +02001594 long_methods->nb_lshift(numerator, py_exponent));
1595 if (numerator == NULL)
1596 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 }
1598 else {
Serhiy Storchaka59865e72016-04-11 09:57:37 +03001599 Py_SETREF(denominator,
Serhiy Storchaka4e6aad12015-12-29 22:55:48 +02001600 long_methods->nb_lshift(denominator, py_exponent));
1601 if (denominator == NULL)
1602 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 }
1604
1605 result_pair = PyTuple_Pack(2, numerator, denominator);
Christian Heimes26855632008-01-27 23:50:43 +00001606
Christian Heimes26855632008-01-27 23:50:43 +00001607error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 Py_XDECREF(py_exponent);
1609 Py_XDECREF(denominator);
1610 Py_XDECREF(numerator);
1611 return result_pair;
Christian Heimes26855632008-01-27 23:50:43 +00001612}
1613
Jeremy Hylton938ace62002-07-17 16:30:39 +00001614static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00001615float_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1616
Tim Peters6d6c1a32001-08-02 04:15:00 +00001617static PyObject *
1618float_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 PyObject *x = Py_False; /* Integer zero */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 if (type != &PyFloat_Type)
1623 return float_subtype_new(type, args, kwds); /* Wimp out */
Serhiy Storchaka2e564242017-03-06 17:01:06 +02001624 if (!_PyArg_NoKeywords("float()", kwds))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 return NULL;
Serhiy Storchaka2e564242017-03-06 17:01:06 +02001626 if (!PyArg_UnpackTuple(args, "float", 0, 1, &x))
1627 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 /* If it's a string, but not a string subclass, use
1629 PyFloat_FromString. */
1630 if (PyUnicode_CheckExact(x))
1631 return PyFloat_FromString(x);
1632 return PyNumber_Float(x);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001633}
1634
Guido van Rossumbef14172001-08-29 15:47:46 +00001635/* Wimpy, slow approach to tp_new calls for subtypes of float:
1636 first create a regular float from whatever arguments we got,
1637 then allocate a subtype instance and initialize its ob_fval
1638 from the regular float. The regular float is then thrown away.
1639*/
1640static PyObject *
1641float_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 PyObject *tmp, *newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00001644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 assert(PyType_IsSubtype(type, &PyFloat_Type));
1646 tmp = float_new(&PyFloat_Type, args, kwds);
1647 if (tmp == NULL)
1648 return NULL;
Serhiy Storchaka15095802015-11-25 15:47:01 +02001649 assert(PyFloat_Check(tmp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 newobj = type->tp_alloc(type, 0);
1651 if (newobj == NULL) {
1652 Py_DECREF(tmp);
1653 return NULL;
1654 }
1655 ((PyFloatObject *)newobj)->ob_fval = ((PyFloatObject *)tmp)->ob_fval;
1656 Py_DECREF(tmp);
1657 return newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00001658}
1659
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001660/*[clinic input]
1661float.__getnewargs__
1662[clinic start generated code]*/
1663
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001664static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001665float___getnewargs___impl(PyObject *self)
1666/*[clinic end generated code: output=873258c9d206b088 input=002279d1d77891e6]*/
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001667{
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001668 return Py_BuildValue("(d)", ((PyFloatObject *)self)->ob_fval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001669}
1670
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001671/* this is for the benefit of the pack/unpack routines below */
1672
1673typedef enum {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 unknown_format, ieee_big_endian_format, ieee_little_endian_format
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001675} float_format_type;
1676
1677static float_format_type double_format, float_format;
1678static float_format_type detected_double_format, detected_float_format;
1679
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001680/*[clinic input]
1681@classmethod
1682float.__getformat__
1683
1684 typestr: str
1685 Must be 'double' or 'float'.
1686 /
1687
1688You probably don't want to use this function.
1689
1690It exists mainly to be used in Python's test suite.
1691
1692This function returns whichever of 'unknown', 'IEEE, big-endian' or 'IEEE,
1693little-endian' best describes the format of floating point numbers used by the
1694C type named by typestr.
1695[clinic start generated code]*/
1696
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001697static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001698float___getformat___impl(PyTypeObject *type, const char *typestr)
1699/*[clinic end generated code: output=2bfb987228cc9628 input=d5a52600f835ad67]*/
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 float_format_type r;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001702
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001703 if (strcmp(typestr, "double") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 r = double_format;
1705 }
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001706 else if (strcmp(typestr, "float") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 r = float_format;
1708 }
1709 else {
1710 PyErr_SetString(PyExc_ValueError,
1711 "__getformat__() argument 1 must be "
1712 "'double' or 'float'");
1713 return NULL;
1714 }
1715
1716 switch (r) {
1717 case unknown_format:
1718 return PyUnicode_FromString("unknown");
1719 case ieee_little_endian_format:
1720 return PyUnicode_FromString("IEEE, little-endian");
1721 case ieee_big_endian_format:
1722 return PyUnicode_FromString("IEEE, big-endian");
1723 default:
1724 Py_FatalError("insane float_format or double_format");
1725 return NULL;
1726 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001727}
1728
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001729/*[clinic input]
1730@classmethod
1731float.__set_format__
1732
1733 typestr: str
1734 Must be 'double' or 'float'.
1735 fmt: str
1736 Must be one of 'unknown', 'IEEE, big-endian' or 'IEEE, little-endian',
1737 and in addition can only be one of the latter two if it appears to
1738 match the underlying C reality.
1739 /
1740
1741You probably don't want to use this function.
1742
1743It exists mainly to be used in Python's test suite.
1744
1745Override the automatic determination of C-level floating point type.
1746This affects how floats are converted to and from binary strings.
1747[clinic start generated code]*/
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001748
1749static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001750float___set_format___impl(PyTypeObject *type, const char *typestr,
1751 const char *fmt)
1752/*[clinic end generated code: output=504460f5dc85acbd input=5306fa2b81a997e4]*/
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 float_format_type f;
1755 float_format_type detected;
1756 float_format_type *p;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 if (strcmp(typestr, "double") == 0) {
1759 p = &double_format;
1760 detected = detected_double_format;
1761 }
1762 else if (strcmp(typestr, "float") == 0) {
1763 p = &float_format;
1764 detected = detected_float_format;
1765 }
1766 else {
1767 PyErr_SetString(PyExc_ValueError,
1768 "__setformat__() argument 1 must "
1769 "be 'double' or 'float'");
1770 return NULL;
1771 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001772
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001773 if (strcmp(fmt, "unknown") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 f = unknown_format;
1775 }
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001776 else if (strcmp(fmt, "IEEE, little-endian") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 f = ieee_little_endian_format;
1778 }
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001779 else if (strcmp(fmt, "IEEE, big-endian") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 f = ieee_big_endian_format;
1781 }
1782 else {
1783 PyErr_SetString(PyExc_ValueError,
1784 "__setformat__() argument 2 must be "
1785 "'unknown', 'IEEE, little-endian' or "
1786 "'IEEE, big-endian'");
1787 return NULL;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 if (f != unknown_format && f != detected) {
1792 PyErr_Format(PyExc_ValueError,
1793 "can only set %s format to 'unknown' or the "
1794 "detected platform value", typestr);
1795 return NULL;
1796 }
1797
1798 *p = f;
1799 Py_RETURN_NONE;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001800}
1801
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001802static PyObject *
1803float_getreal(PyObject *v, void *closure)
1804{
1805 return float_float(v);
1806}
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001807
Guido van Rossumb43daf72007-08-01 18:08:08 +00001808static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001809float_getimag(PyObject *v, void *closure)
Guido van Rossumb43daf72007-08-01 18:08:08 +00001810{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 return PyFloat_FromDouble(0.0);
Guido van Rossumb43daf72007-08-01 18:08:08 +00001812}
1813
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001814/*[clinic input]
1815float.__format__
1816
1817 format_spec: unicode
1818 /
1819
1820Formats the float according to format_spec.
1821[clinic start generated code]*/
1822
Eric Smith8c663262007-08-25 02:26:07 +00001823static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001824float___format___impl(PyObject *self, PyObject *format_spec)
1825/*[clinic end generated code: output=b260e52a47eade56 input=2ece1052211fd0e6]*/
Eric Smith8c663262007-08-25 02:26:07 +00001826{
Victor Stinnerd3f08822012-05-29 12:57:52 +02001827 _PyUnicodeWriter writer;
1828 int ret;
Eric Smith4a7d76d2008-05-30 18:10:19 +00001829
Victor Stinner8f674cc2013-04-17 23:02:17 +02001830 _PyUnicodeWriter_Init(&writer);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001831 ret = _PyFloat_FormatAdvancedWriter(
1832 &writer,
1833 self,
1834 format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
1835 if (ret == -1) {
1836 _PyUnicodeWriter_Dealloc(&writer);
1837 return NULL;
1838 }
1839 return _PyUnicodeWriter_Finish(&writer);
Eric Smith8c663262007-08-25 02:26:07 +00001840}
1841
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001842static PyMethodDef float_methods[] = {
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001843 FLOAT_CONJUGATE_METHODDEF
1844 FLOAT___TRUNC___METHODDEF
1845 FLOAT___ROUND___METHODDEF
1846 FLOAT_AS_INTEGER_RATIO_METHODDEF
1847 FLOAT_FROMHEX_METHODDEF
1848 FLOAT_HEX_METHODDEF
1849 FLOAT_IS_INTEGER_METHODDEF
Christian Heimes53876d92008-04-19 00:31:39 +00001850#if 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 {"is_inf", (PyCFunction)float_is_inf, METH_NOARGS,
Ezio Melotti7760b4e2013-10-06 00:45:11 +03001852 "Return True if the float is positive or negative infinite."},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 {"is_finite", (PyCFunction)float_is_finite, METH_NOARGS,
Ezio Melotti7760b4e2013-10-06 00:45:11 +03001854 "Return True if the float is finite, neither infinite nor NaN."},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 {"is_nan", (PyCFunction)float_is_nan, METH_NOARGS,
Ezio Melotti7760b4e2013-10-06 00:45:11 +03001856 "Return True if the float is not a number (NaN)."},
Christian Heimes53876d92008-04-19 00:31:39 +00001857#endif
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001858 FLOAT___GETNEWARGS___METHODDEF
1859 FLOAT___GETFORMAT___METHODDEF
1860 FLOAT___SET_FORMAT___METHODDEF
1861 FLOAT___FORMAT___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 {NULL, NULL} /* sentinel */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001863};
1864
Guido van Rossumb43daf72007-08-01 18:08:08 +00001865static PyGetSetDef float_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 {"real",
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001867 float_getreal, (setter)NULL,
Guido van Rossumb43daf72007-08-01 18:08:08 +00001868 "the real part of a complex number",
1869 NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 {"imag",
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001871 float_getimag, (setter)NULL,
Guido van Rossumb43daf72007-08-01 18:08:08 +00001872 "the imaginary part of a complex number",
1873 NULL},
1874 {NULL} /* Sentinel */
1875};
1876
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001877PyDoc_STRVAR(float_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001878"float(x) -> floating point number\n\
1879\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001880Convert a string or number to a floating point number, if possible.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001881
1882
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001883static PyNumberMethods float_as_number = {
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001884 float_add, /* nb_add */
1885 float_sub, /* nb_subtract */
1886 float_mul, /* nb_multiply */
1887 float_rem, /* nb_remainder */
1888 float_divmod, /* nb_divmod */
1889 float_pow, /* nb_power */
1890 (unaryfunc)float_neg, /* nb_negative */
1891 float_float, /* nb_positive */
1892 (unaryfunc)float_abs, /* nb_absolute */
1893 (inquiry)float_bool, /* nb_bool */
1894 0, /* nb_invert */
1895 0, /* nb_lshift */
1896 0, /* nb_rshift */
1897 0, /* nb_and */
1898 0, /* nb_xor */
1899 0, /* nb_or */
1900 float___trunc___impl, /* nb_int */
1901 0, /* nb_reserved */
1902 float_float, /* nb_float */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 0, /* nb_inplace_add */
1904 0, /* nb_inplace_subtract */
1905 0, /* nb_inplace_multiply */
1906 0, /* nb_inplace_remainder */
1907 0, /* nb_inplace_power */
1908 0, /* nb_inplace_lshift */
1909 0, /* nb_inplace_rshift */
1910 0, /* nb_inplace_and */
1911 0, /* nb_inplace_xor */
1912 0, /* nb_inplace_or */
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001913 float_floor_div, /* nb_floor_divide */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 float_div, /* nb_true_divide */
1915 0, /* nb_inplace_floor_divide */
1916 0, /* nb_inplace_true_divide */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001917};
1918
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001919PyTypeObject PyFloat_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1921 "float",
1922 sizeof(PyFloatObject),
1923 0,
1924 (destructor)float_dealloc, /* tp_dealloc */
1925 0, /* tp_print */
1926 0, /* tp_getattr */
1927 0, /* tp_setattr */
1928 0, /* tp_reserved */
1929 (reprfunc)float_repr, /* tp_repr */
1930 &float_as_number, /* tp_as_number */
1931 0, /* tp_as_sequence */
1932 0, /* tp_as_mapping */
1933 (hashfunc)float_hash, /* tp_hash */
1934 0, /* tp_call */
Mark Dickinson388122d2010-08-04 20:56:28 +00001935 (reprfunc)float_repr, /* tp_str */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 PyObject_GenericGetAttr, /* tp_getattro */
1937 0, /* tp_setattro */
1938 0, /* tp_as_buffer */
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001939 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 float_doc, /* tp_doc */
1941 0, /* tp_traverse */
1942 0, /* tp_clear */
1943 float_richcompare, /* tp_richcompare */
1944 0, /* tp_weaklistoffset */
1945 0, /* tp_iter */
1946 0, /* tp_iternext */
1947 float_methods, /* tp_methods */
1948 0, /* tp_members */
1949 float_getset, /* tp_getset */
1950 0, /* tp_base */
1951 0, /* tp_dict */
1952 0, /* tp_descr_get */
1953 0, /* tp_descr_set */
1954 0, /* tp_dictoffset */
1955 0, /* tp_init */
1956 0, /* tp_alloc */
1957 float_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001958};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001959
Victor Stinner1c8f0592013-07-22 22:24:54 +02001960int
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001961_PyFloat_Init(void)
1962{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 /* We attempt to determine if this machine is using IEEE
1964 floating point formats by peering at the bits of some
1965 carefully chosen values. If it looks like we are on an
1966 IEEE platform, the float packing/unpacking routines can
1967 just copy bits, if not they resort to arithmetic & shifts
1968 and masks. The shifts & masks approach works on all finite
1969 values, but what happens to infinities, NaNs and signed
1970 zeroes on packing is an accident, and attempting to unpack
1971 a NaN or an infinity will raise an exception.
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 Note that if we're on some whacked-out platform which uses
1974 IEEE formats but isn't strictly little-endian or big-
1975 endian, we will fall back to the portable shifts & masks
1976 method. */
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001977
1978#if SIZEOF_DOUBLE == 8
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 {
1980 double x = 9006104071832581.0;
1981 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
1982 detected_double_format = ieee_big_endian_format;
1983 else if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
1984 detected_double_format = ieee_little_endian_format;
1985 else
1986 detected_double_format = unknown_format;
1987 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001988#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 detected_double_format = unknown_format;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001990#endif
1991
1992#if SIZEOF_FLOAT == 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 {
1994 float y = 16711938.0;
1995 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
1996 detected_float_format = ieee_big_endian_format;
1997 else if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
1998 detected_float_format = ieee_little_endian_format;
1999 else
2000 detected_float_format = unknown_format;
2001 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002002#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 detected_float_format = unknown_format;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002004#endif
2005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 double_format = detected_double_format;
2007 float_format = detected_float_format;
Christian Heimesb76922a2007-12-11 01:06:40 +00002008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 /* Init float info */
Victor Stinner1c8f0592013-07-22 22:24:54 +02002010 if (FloatInfoType.tp_name == NULL) {
2011 if (PyStructSequence_InitType2(&FloatInfoType, &floatinfo_desc) < 0)
2012 return 0;
2013 }
2014 return 1;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002015}
2016
Georg Brandl2ee470f2008-07-16 12:55:28 +00002017int
2018PyFloat_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00002019{
Kristján Valur Jónssondaa06542012-03-30 09:18:15 +00002020 PyFloatObject *f = free_list, *next;
2021 int i = numfree;
2022 while (f) {
2023 next = (PyFloatObject*) Py_TYPE(f);
2024 PyObject_FREE(f);
2025 f = next;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 }
Kristján Valur Jónssondaa06542012-03-30 09:18:15 +00002027 free_list = NULL;
2028 numfree = 0;
2029 return i;
Christian Heimes15ebc882008-02-04 18:48:49 +00002030}
2031
2032void
2033PyFloat_Fini(void)
2034{
Kristján Valur Jónssondaa06542012-03-30 09:18:15 +00002035 (void)PyFloat_ClearFreeList();
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00002036}
Tim Peters9905b942003-03-20 20:53:32 +00002037
David Malcolm49526f42012-06-22 14:55:41 -04002038/* Print summary info about the state of the optimized allocator */
2039void
2040_PyFloat_DebugMallocStats(FILE *out)
2041{
2042 _PyDebugAllocatorStats(out,
2043 "free PyFloatObject",
2044 numfree, sizeof(PyFloatObject));
2045}
2046
2047
Tim Peters9905b942003-03-20 20:53:32 +00002048/*----------------------------------------------------------------------------
Mark Dickinson7c4e4092016-09-03 17:21:29 +01002049 * _PyFloat_{Pack,Unpack}{2,4,8}. See floatobject.h.
2050 * To match the NPY_HALF_ROUND_TIES_TO_EVEN behavior in:
2051 * https://github.com/numpy/numpy/blob/master/numpy/core/src/npymath/halffloat.c
2052 * We use:
2053 * bits = (unsigned short)f; Note the truncation
2054 * if ((f - bits > 0.5) || (f - bits == 0.5 && bits % 2)) {
2055 * bits++;
2056 * }
Tim Peters9905b942003-03-20 20:53:32 +00002057 */
Mark Dickinson7c4e4092016-09-03 17:21:29 +01002058
2059int
2060_PyFloat_Pack2(double x, unsigned char *p, int le)
2061{
2062 unsigned char sign;
2063 int e;
2064 double f;
2065 unsigned short bits;
2066 int incr = 1;
2067
2068 if (x == 0.0) {
2069 sign = (copysign(1.0, x) == -1.0);
2070 e = 0;
2071 bits = 0;
2072 }
2073 else if (Py_IS_INFINITY(x)) {
2074 sign = (x < 0.0);
2075 e = 0x1f;
2076 bits = 0;
2077 }
2078 else if (Py_IS_NAN(x)) {
2079 /* There are 2046 distinct half-precision NaNs (1022 signaling and
2080 1024 quiet), but there are only two quiet NaNs that don't arise by
2081 quieting a signaling NaN; we get those by setting the topmost bit
2082 of the fraction field and clearing all other fraction bits. We
2083 choose the one with the appropriate sign. */
2084 sign = (copysign(1.0, x) == -1.0);
2085 e = 0x1f;
2086 bits = 512;
2087 }
2088 else {
2089 sign = (x < 0.0);
2090 if (sign) {
2091 x = -x;
2092 }
2093
2094 f = frexp(x, &e);
2095 if (f < 0.5 || f >= 1.0) {
2096 PyErr_SetString(PyExc_SystemError,
2097 "frexp() result out of range");
2098 return -1;
2099 }
2100
2101 /* Normalize f to be in the range [1.0, 2.0) */
2102 f *= 2.0;
2103 e--;
2104
2105 if (e >= 16) {
2106 goto Overflow;
2107 }
2108 else if (e < -25) {
2109 /* |x| < 2**-25. Underflow to zero. */
2110 f = 0.0;
2111 e = 0;
2112 }
2113 else if (e < -14) {
2114 /* |x| < 2**-14. Gradual underflow */
2115 f = ldexp(f, 14 + e);
2116 e = 0;
2117 }
2118 else /* if (!(e == 0 && f == 0.0)) */ {
2119 e += 15;
2120 f -= 1.0; /* Get rid of leading 1 */
2121 }
2122
2123 f *= 1024.0; /* 2**10 */
2124 /* Round to even */
2125 bits = (unsigned short)f; /* Note the truncation */
2126 assert(bits < 1024);
2127 assert(e < 31);
2128 if ((f - bits > 0.5) || ((f - bits == 0.5) && (bits % 2 == 1))) {
2129 ++bits;
2130 if (bits == 1024) {
2131 /* The carry propagated out of a string of 10 1 bits. */
2132 bits = 0;
2133 ++e;
2134 if (e == 31)
2135 goto Overflow;
2136 }
2137 }
2138 }
2139
2140 bits |= (e << 10) | (sign << 15);
2141
2142 /* Write out result. */
2143 if (le) {
2144 p += 1;
2145 incr = -1;
2146 }
2147
2148 /* First byte */
2149 *p = (unsigned char)((bits >> 8) & 0xFF);
2150 p += incr;
2151
2152 /* Second byte */
2153 *p = (unsigned char)(bits & 0xFF);
2154
2155 return 0;
2156
2157 Overflow:
2158 PyErr_SetString(PyExc_OverflowError,
2159 "float too large to pack with e format");
2160 return -1;
2161}
2162
Tim Peters9905b942003-03-20 20:53:32 +00002163int
2164_PyFloat_Pack4(double x, unsigned char *p, int le)
2165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 if (float_format == unknown_format) {
2167 unsigned char sign;
2168 int e;
2169 double f;
2170 unsigned int fbits;
2171 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 if (le) {
2174 p += 3;
2175 incr = -1;
2176 }
Tim Peters9905b942003-03-20 20:53:32 +00002177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 if (x < 0) {
2179 sign = 1;
2180 x = -x;
2181 }
2182 else
2183 sign = 0;
Tim Peters9905b942003-03-20 20:53:32 +00002184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 f = frexp(x, &e);
Tim Peters9905b942003-03-20 20:53:32 +00002186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 /* Normalize f to be in the range [1.0, 2.0) */
2188 if (0.5 <= f && f < 1.0) {
2189 f *= 2.0;
2190 e--;
2191 }
2192 else if (f == 0.0)
2193 e = 0;
2194 else {
2195 PyErr_SetString(PyExc_SystemError,
2196 "frexp() result out of range");
2197 return -1;
2198 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 if (e >= 128)
2201 goto Overflow;
2202 else if (e < -126) {
2203 /* Gradual underflow */
2204 f = ldexp(f, 126 + e);
2205 e = 0;
2206 }
2207 else if (!(e == 0 && f == 0.0)) {
2208 e += 127;
2209 f -= 1.0; /* Get rid of leading 1 */
2210 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 f *= 8388608.0; /* 2**23 */
2213 fbits = (unsigned int)(f + 0.5); /* Round */
2214 assert(fbits <= 8388608);
2215 if (fbits >> 23) {
2216 /* The carry propagated out of a string of 23 1 bits. */
2217 fbits = 0;
2218 ++e;
2219 if (e >= 255)
2220 goto Overflow;
2221 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 /* First byte */
2224 *p = (sign << 7) | (e >> 1);
2225 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 /* Second byte */
2228 *p = (char) (((e & 1) << 7) | (fbits >> 16));
2229 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 /* Third byte */
2232 *p = (fbits >> 8) & 0xFF;
2233 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002235 /* Fourth byte */
2236 *p = fbits & 0xFF;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 /* Done */
2239 return 0;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 }
2242 else {
2243 float y = (float)x;
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002244 const unsigned char *s = (unsigned char*)&y;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 int i, incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002247 if (Py_IS_INFINITY(y) && !Py_IS_INFINITY(x))
2248 goto Overflow;
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 if ((float_format == ieee_little_endian_format && !le)
2251 || (float_format == ieee_big_endian_format && le)) {
2252 p += 3;
2253 incr = -1;
2254 }
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 for (i = 0; i < 4; i++) {
2257 *p = *s++;
2258 p += incr;
2259 }
2260 return 0;
2261 }
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002262 Overflow:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 PyErr_SetString(PyExc_OverflowError,
2264 "float too large to pack with f format");
2265 return -1;
Tim Peters9905b942003-03-20 20:53:32 +00002266}
2267
2268int
2269_PyFloat_Pack8(double x, unsigned char *p, int le)
2270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 if (double_format == unknown_format) {
2272 unsigned char sign;
2273 int e;
2274 double f;
2275 unsigned int fhi, flo;
2276 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 if (le) {
2279 p += 7;
2280 incr = -1;
2281 }
Tim Peters9905b942003-03-20 20:53:32 +00002282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 if (x < 0) {
2284 sign = 1;
2285 x = -x;
2286 }
2287 else
2288 sign = 0;
Tim Peters9905b942003-03-20 20:53:32 +00002289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 f = frexp(x, &e);
Tim Peters9905b942003-03-20 20:53:32 +00002291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 /* Normalize f to be in the range [1.0, 2.0) */
2293 if (0.5 <= f && f < 1.0) {
2294 f *= 2.0;
2295 e--;
2296 }
2297 else if (f == 0.0)
2298 e = 0;
2299 else {
2300 PyErr_SetString(PyExc_SystemError,
2301 "frexp() result out of range");
2302 return -1;
2303 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 if (e >= 1024)
2306 goto Overflow;
2307 else if (e < -1022) {
2308 /* Gradual underflow */
2309 f = ldexp(f, 1022 + e);
2310 e = 0;
2311 }
2312 else if (!(e == 0 && f == 0.0)) {
2313 e += 1023;
2314 f -= 1.0; /* Get rid of leading 1 */
2315 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 /* fhi receives the high 28 bits; flo the low 24 bits (== 52 bits) */
2318 f *= 268435456.0; /* 2**28 */
2319 fhi = (unsigned int)f; /* Truncate */
2320 assert(fhi < 268435456);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 f -= (double)fhi;
2323 f *= 16777216.0; /* 2**24 */
2324 flo = (unsigned int)(f + 0.5); /* Round */
2325 assert(flo <= 16777216);
2326 if (flo >> 24) {
2327 /* The carry propagated out of a string of 24 1 bits. */
2328 flo = 0;
2329 ++fhi;
2330 if (fhi >> 28) {
2331 /* And it also progagated out of the next 28 bits. */
2332 fhi = 0;
2333 ++e;
2334 if (e >= 2047)
2335 goto Overflow;
2336 }
2337 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 /* First byte */
2340 *p = (sign << 7) | (e >> 4);
2341 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 /* Second byte */
2344 *p = (unsigned char) (((e & 0xF) << 4) | (fhi >> 24));
2345 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 /* Third byte */
2348 *p = (fhi >> 16) & 0xFF;
2349 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 /* Fourth byte */
2352 *p = (fhi >> 8) & 0xFF;
2353 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 /* Fifth byte */
2356 *p = fhi & 0xFF;
2357 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002359 /* Sixth byte */
2360 *p = (flo >> 16) & 0xFF;
2361 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 /* Seventh byte */
2364 *p = (flo >> 8) & 0xFF;
2365 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 /* Eighth byte */
2368 *p = flo & 0xFF;
Brett Cannonb94767f2011-02-22 20:15:44 +00002369 /* p += incr; */
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 /* Done */
2372 return 0;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 Overflow:
2375 PyErr_SetString(PyExc_OverflowError,
2376 "float too large to pack with d format");
2377 return -1;
2378 }
2379 else {
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002380 const unsigned char *s = (unsigned char*)&x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 int i, incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 if ((double_format == ieee_little_endian_format && !le)
2384 || (double_format == ieee_big_endian_format && le)) {
2385 p += 7;
2386 incr = -1;
2387 }
2388
2389 for (i = 0; i < 8; i++) {
2390 *p = *s++;
2391 p += incr;
2392 }
2393 return 0;
2394 }
Tim Peters9905b942003-03-20 20:53:32 +00002395}
2396
2397double
Mark Dickinson7c4e4092016-09-03 17:21:29 +01002398_PyFloat_Unpack2(const unsigned char *p, int le)
2399{
2400 unsigned char sign;
2401 int e;
2402 unsigned int f;
2403 double x;
2404 int incr = 1;
2405
2406 if (le) {
2407 p += 1;
2408 incr = -1;
2409 }
2410
2411 /* First byte */
2412 sign = (*p >> 7) & 1;
2413 e = (*p & 0x7C) >> 2;
2414 f = (*p & 0x03) << 8;
2415 p += incr;
2416
2417 /* Second byte */
2418 f |= *p;
2419
2420 if (e == 0x1f) {
2421#ifdef PY_NO_SHORT_FLOAT_REPR
2422 if (f == 0) {
2423 /* Infinity */
2424 return sign ? -Py_HUGE_VAL : Py_HUGE_VAL;
2425 }
2426 else {
2427 /* NaN */
2428#ifdef Py_NAN
2429 return sign ? -Py_NAN : Py_NAN;
2430#else
2431 PyErr_SetString(
2432 PyExc_ValueError,
2433 "can't unpack IEEE 754 NaN "
2434 "on platform that does not support NaNs");
2435 return -1;
2436#endif /* #ifdef Py_NAN */
2437 }
2438#else
2439 if (f == 0) {
2440 /* Infinity */
2441 return _Py_dg_infinity(sign);
2442 }
2443 else {
2444 /* NaN */
2445 return _Py_dg_stdnan(sign);
2446 }
2447#endif /* #ifdef PY_NO_SHORT_FLOAT_REPR */
2448 }
2449
2450 x = (double)f / 1024.0;
2451
2452 if (e == 0) {
2453 e = -14;
2454 }
2455 else {
2456 x += 1.0;
2457 e -= 15;
2458 }
2459 x = ldexp(x, e);
2460
2461 if (sign)
2462 x = -x;
2463
2464 return x;
2465}
2466
2467double
Tim Peters9905b942003-03-20 20:53:32 +00002468_PyFloat_Unpack4(const unsigned char *p, int le)
2469{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 if (float_format == unknown_format) {
2471 unsigned char sign;
2472 int e;
2473 unsigned int f;
2474 double x;
2475 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002477 if (le) {
2478 p += 3;
2479 incr = -1;
2480 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 /* First byte */
2483 sign = (*p >> 7) & 1;
2484 e = (*p & 0x7F) << 1;
2485 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002487 /* Second byte */
2488 e |= (*p >> 7) & 1;
2489 f = (*p & 0x7F) << 16;
2490 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 if (e == 255) {
2493 PyErr_SetString(
2494 PyExc_ValueError,
2495 "can't unpack IEEE 754 special value "
2496 "on non-IEEE platform");
2497 return -1;
2498 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002500 /* Third byte */
2501 f |= *p << 8;
2502 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 /* Fourth byte */
2505 f |= *p;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 x = (double)f / 8388608.0;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 /* XXX This sadly ignores Inf/NaN issues */
2510 if (e == 0)
2511 e = -126;
2512 else {
2513 x += 1.0;
2514 e -= 127;
2515 }
2516 x = ldexp(x, e);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 if (sign)
2519 x = -x;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 return x;
2522 }
2523 else {
2524 float x;
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 if ((float_format == ieee_little_endian_format && !le)
2527 || (float_format == ieee_big_endian_format && le)) {
2528 char buf[4];
2529 char *d = &buf[3];
2530 int i;
Tim Peters9905b942003-03-20 20:53:32 +00002531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 for (i = 0; i < 4; i++) {
2533 *d-- = *p++;
2534 }
2535 memcpy(&x, buf, 4);
2536 }
2537 else {
2538 memcpy(&x, p, 4);
2539 }
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 return x;
2542 }
Tim Peters9905b942003-03-20 20:53:32 +00002543}
2544
2545double
2546_PyFloat_Unpack8(const unsigned char *p, int le)
2547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 if (double_format == unknown_format) {
2549 unsigned char sign;
2550 int e;
2551 unsigned int fhi, flo;
2552 double x;
2553 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 if (le) {
2556 p += 7;
2557 incr = -1;
2558 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 /* First byte */
2561 sign = (*p >> 7) & 1;
2562 e = (*p & 0x7F) << 4;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 /* Second byte */
2567 e |= (*p >> 4) & 0xF;
2568 fhi = (*p & 0xF) << 24;
2569 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 if (e == 2047) {
2572 PyErr_SetString(
2573 PyExc_ValueError,
2574 "can't unpack IEEE 754 special value "
2575 "on non-IEEE platform");
2576 return -1.0;
2577 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 /* Third byte */
2580 fhi |= *p << 16;
2581 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 /* Fourth byte */
2584 fhi |= *p << 8;
2585 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 /* Fifth byte */
2588 fhi |= *p;
2589 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 /* Sixth byte */
2592 flo = *p << 16;
2593 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 /* Seventh byte */
2596 flo |= *p << 8;
2597 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 /* Eighth byte */
2600 flo |= *p;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2603 x /= 268435456.0; /* 2**28 */
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 if (e == 0)
2606 e = -1022;
2607 else {
2608 x += 1.0;
2609 e -= 1023;
2610 }
2611 x = ldexp(x, e);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002613 if (sign)
2614 x = -x;
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 return x;
2617 }
2618 else {
2619 double x;
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 if ((double_format == ieee_little_endian_format && !le)
2622 || (double_format == ieee_big_endian_format && le)) {
2623 char buf[8];
2624 char *d = &buf[7];
2625 int i;
2626
2627 for (i = 0; i < 8; i++) {
2628 *d-- = *p++;
2629 }
2630 memcpy(&x, buf, 8);
2631 }
2632 else {
2633 memcpy(&x, p, 8);
2634 }
2635
2636 return x;
2637 }
Tim Peters9905b942003-03-20 20:53:32 +00002638}