blob: 26e238cf05ad3874aaa8bc39aec22223fe4004f8 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Float object implementation */
2
Guido van Rossum2a9096b1990-10-21 22:15:08 +00003/* XXX There should be overflow checks here, but it's hard to check
4 for any kind of float exception without losing portability. */
5
Guido van Rossumc0b618a1997-05-02 03:12:38 +00006#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00007
Guido van Rossum3f5da241990-12-20 15:06:42 +00008#include <ctype.h>
Christian Heimes93852662007-12-01 12:22:32 +00009#include <float.h>
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010
Serhiy Storchakab5c51d32017-03-11 09:21:05 +020011/*[clinic input]
12class float "PyObject *" "&PyFloat_Type"
13[clinic start generated code]*/
14/*[clinic end generated code: output=da39a3ee5e6b4b0d input=dd0003f68f144284]*/
15
16#include "clinic/floatobject.c.h"
Guido van Rossum6923e131990-11-02 17:50:43 +000017
Mark Dickinsond19052c2010-06-27 18:19:09 +000018/* Special free list
Mark Dickinsond19052c2010-06-27 18:19:09 +000019 free_list is a singly-linked list of available PyFloatObjects, linked
20 via abuse of their ob_type members.
21*/
22
Kristján Valur Jónssondaa06542012-03-30 09:18:15 +000023#ifndef PyFloat_MAXFREELIST
24#define PyFloat_MAXFREELIST 100
25#endif
26static int numfree = 0;
Guido van Rossum3fce8831999-03-12 19:43:17 +000027static PyFloatObject *free_list = NULL;
28
Christian Heimes93852662007-12-01 12:22:32 +000029double
30PyFloat_GetMax(void)
31{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000032 return DBL_MAX;
Christian Heimes93852662007-12-01 12:22:32 +000033}
34
35double
36PyFloat_GetMin(void)
37{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000038 return DBL_MIN;
Christian Heimes93852662007-12-01 12:22:32 +000039}
40
Christian Heimesd32ed6f2008-01-14 18:49:24 +000041static PyTypeObject FloatInfoType;
42
43PyDoc_STRVAR(floatinfo__doc__,
Benjamin Peterson78565b22009-06-28 19:19:51 +000044"sys.float_info\n\
Christian Heimesd32ed6f2008-01-14 18:49:24 +000045\n\
Raymond Hettinger71170742019-09-11 07:17:32 -070046A named tuple holding information about the float type. It contains low level\n\
Christian Heimesd32ed6f2008-01-14 18:49:24 +000047information about the precision and internal representation. Please study\n\
48your system's :file:`float.h` for more information.");
49
50static PyStructSequence_Field floatinfo_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 {"max", "DBL_MAX -- maximum representable finite float"},
52 {"max_exp", "DBL_MAX_EXP -- maximum int e such that radix**(e-1) "
53 "is representable"},
54 {"max_10_exp", "DBL_MAX_10_EXP -- maximum int e such that 10**e "
55 "is representable"},
Stefano Taschini0301c9b2018-03-26 11:41:30 +020056 {"min", "DBL_MIN -- Minimum positive normalized float"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 {"min_exp", "DBL_MIN_EXP -- minimum int e such that radix**(e-1) "
58 "is a normalized float"},
59 {"min_10_exp", "DBL_MIN_10_EXP -- minimum int e such that 10**e is "
60 "a normalized"},
61 {"dig", "DBL_DIG -- digits"},
62 {"mant_dig", "DBL_MANT_DIG -- mantissa digits"},
63 {"epsilon", "DBL_EPSILON -- Difference between 1 and the next "
64 "representable float"},
65 {"radix", "FLT_RADIX -- radix of exponent"},
Stefano Taschini0301c9b2018-03-26 11:41:30 +020066 {"rounds", "FLT_ROUNDS -- rounding mode"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 {0}
Christian Heimesd32ed6f2008-01-14 18:49:24 +000068};
69
70static PyStructSequence_Desc floatinfo_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 "sys.float_info", /* name */
72 floatinfo__doc__, /* doc */
73 floatinfo_fields, /* fields */
74 11
Christian Heimesd32ed6f2008-01-14 18:49:24 +000075};
76
Christian Heimes93852662007-12-01 12:22:32 +000077PyObject *
78PyFloat_GetInfo(void)
79{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 PyObject* floatinfo;
81 int pos = 0;
Christian Heimes93852662007-12-01 12:22:32 +000082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083 floatinfo = PyStructSequence_New(&FloatInfoType);
84 if (floatinfo == NULL) {
85 return NULL;
86 }
Christian Heimes93852662007-12-01 12:22:32 +000087
Christian Heimesd32ed6f2008-01-14 18:49:24 +000088#define SetIntFlag(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 PyStructSequence_SET_ITEM(floatinfo, pos++, PyLong_FromLong(flag))
Christian Heimesd32ed6f2008-01-14 18:49:24 +000090#define SetDblFlag(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 PyStructSequence_SET_ITEM(floatinfo, pos++, PyFloat_FromDouble(flag))
Christian Heimes93852662007-12-01 12:22:32 +000092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 SetDblFlag(DBL_MAX);
94 SetIntFlag(DBL_MAX_EXP);
95 SetIntFlag(DBL_MAX_10_EXP);
96 SetDblFlag(DBL_MIN);
97 SetIntFlag(DBL_MIN_EXP);
98 SetIntFlag(DBL_MIN_10_EXP);
99 SetIntFlag(DBL_DIG);
100 SetIntFlag(DBL_MANT_DIG);
101 SetDblFlag(DBL_EPSILON);
102 SetIntFlag(FLT_RADIX);
103 SetIntFlag(FLT_ROUNDS);
Christian Heimesd32ed6f2008-01-14 18:49:24 +0000104#undef SetIntFlag
105#undef SetDblFlag
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106
107 if (PyErr_Occurred()) {
108 Py_CLEAR(floatinfo);
109 return NULL;
110 }
111 return floatinfo;
Christian Heimes93852662007-12-01 12:22:32 +0000112}
113
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyFloat_FromDouble(double fval)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200117 PyFloatObject *op = free_list;
Kristján Valur Jónssondaa06542012-03-30 09:18:15 +0000118 if (op != NULL) {
119 free_list = (PyFloatObject *) Py_TYPE(op);
120 numfree--;
121 } else {
122 op = (PyFloatObject*) PyObject_MALLOC(sizeof(PyFloatObject));
123 if (!op)
124 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 }
126 /* Inline PyObject_New */
Victor Stinnerb509d522018-11-23 14:27:38 +0100127 (void)PyObject_INIT(op, &PyFloat_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 op->ob_fval = fval;
129 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000130}
131
Brett Cannona721aba2016-09-09 14:57:09 -0700132static PyObject *
133float_from_string_inner(const char *s, Py_ssize_t len, void *obj)
134{
135 double x;
136 const char *end;
137 const char *last = s + len;
138 /* strip space */
139 while (s < last && Py_ISSPACE(*s)) {
140 s++;
141 }
142
143 while (s < last - 1 && Py_ISSPACE(last[-1])) {
144 last--;
145 }
146
147 /* We don't care about overflow or underflow. If the platform
148 * supports them, infinities and signed zeroes (on underflow) are
149 * fine. */
150 x = PyOS_string_to_double(s, (char **)&end, NULL);
151 if (end != last) {
152 PyErr_Format(PyExc_ValueError,
153 "could not convert string to float: "
154 "%R", obj);
155 return NULL;
156 }
157 else if (x == -1.0 && PyErr_Occurred()) {
158 return NULL;
159 }
160 else {
161 return PyFloat_FromDouble(x);
162 }
163}
164
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000165PyObject *
Georg Brandl428f0642007-03-18 18:35:15 +0000166PyFloat_FromString(PyObject *v)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000167{
Brett Cannona721aba2016-09-09 14:57:09 -0700168 const char *s;
Alexander Belopolsky942af5a2010-12-04 03:38:46 +0000169 PyObject *s_buffer = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 Py_ssize_t len;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200171 Py_buffer view = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 PyObject *result = NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 if (PyUnicode_Check(v)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200175 s_buffer = _PyUnicode_TransformDecimalAndSpaceToASCII(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 if (s_buffer == NULL)
Alexander Belopolsky942af5a2010-12-04 03:38:46 +0000177 return NULL;
Serhiy Storchaka9b6c60c2017-11-13 21:23:48 +0200178 assert(PyUnicode_IS_ASCII(s_buffer));
179 /* Simply get a pointer to existing ASCII characters. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200180 s = PyUnicode_AsUTF8AndSize(s_buffer, &len);
Serhiy Storchaka9b6c60c2017-11-13 21:23:48 +0200181 assert(s != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 }
Martin Pantereeb896c2015-11-07 02:32:21 +0000183 else if (PyBytes_Check(v)) {
184 s = PyBytes_AS_STRING(v);
185 len = PyBytes_GET_SIZE(v);
186 }
187 else if (PyByteArray_Check(v)) {
188 s = PyByteArray_AS_STRING(v);
189 len = PyByteArray_GET_SIZE(v);
190 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200191 else if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) == 0) {
192 s = (const char *)view.buf;
193 len = view.len;
Martin Pantereeb896c2015-11-07 02:32:21 +0000194 /* Copy to NUL-terminated buffer. */
195 s_buffer = PyBytes_FromStringAndSize(s, len);
196 if (s_buffer == NULL) {
197 PyBuffer_Release(&view);
198 return NULL;
199 }
200 s = PyBytes_AS_STRING(s_buffer);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200201 }
202 else {
Ezio Melottia5b95992013-11-07 19:18:34 +0200203 PyErr_Format(PyExc_TypeError,
204 "float() argument must be a string or a number, not '%.200s'",
205 Py_TYPE(v)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 return NULL;
207 }
Brett Cannona721aba2016-09-09 14:57:09 -0700208 result = _Py_string_to_number_with_underscores(s, len, "float", v, v,
209 float_from_string_inner);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200210 PyBuffer_Release(&view);
Alexander Belopolsky942af5a2010-12-04 03:38:46 +0000211 Py_XDECREF(s_buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 return result;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000213}
214
Guido van Rossum234f9421993-06-17 12:35:49 +0000215static void
Fred Drakefd99de62000-07-09 05:02:18 +0000216float_dealloc(PyFloatObject *op)
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 if (PyFloat_CheckExact(op)) {
Kristján Valur Jónssondaa06542012-03-30 09:18:15 +0000219 if (numfree >= PyFloat_MAXFREELIST) {
220 PyObject_FREE(op);
221 return;
222 }
223 numfree++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 Py_TYPE(op) = (struct _typeobject *)free_list;
225 free_list = op;
226 }
227 else
228 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum3132a5a1992-03-27 17:28:44 +0000229}
230
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231double
Fred Drakefd99de62000-07-09 05:02:18 +0000232PyFloat_AsDouble(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 PyNumberMethods *nb;
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300235 PyObject *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 double val;
Tim Petersd2364e82001-11-01 20:09:42 +0000237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 if (op == NULL) {
239 PyErr_BadArgument();
240 return -1;
241 }
Tim Petersd2364e82001-11-01 20:09:42 +0000242
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300243 if (PyFloat_Check(op)) {
244 return PyFloat_AS_DOUBLE(op);
245 }
246
247 nb = Py_TYPE(op)->tp_as_number;
248 if (nb == NULL || nb->nb_float == NULL) {
Serhiy Storchakabdbad712019-06-02 00:05:48 +0300249 if (nb && nb->nb_index) {
250 PyObject *res = PyNumber_Index(op);
251 if (!res) {
252 return -1;
253 }
254 double val = PyLong_AsDouble(res);
255 Py_DECREF(res);
256 return val;
257 }
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300258 PyErr_Format(PyExc_TypeError, "must be real number, not %.50s",
Victor Stinner58ac7002020-02-07 03:04:21 +0100259 Py_TYPE(op)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 return -1;
261 }
Neil Schemenauer2c77e902002-11-18 16:06:21 +0000262
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300263 res = (*nb->nb_float) (op);
264 if (res == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 return -1;
266 }
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300267 if (!PyFloat_CheckExact(res)) {
268 if (!PyFloat_Check(res)) {
269 PyErr_Format(PyExc_TypeError,
270 "%.50s.__float__ returned non-float (type %.50s)",
Victor Stinner58ac7002020-02-07 03:04:21 +0100271 Py_TYPE(op)->tp_name, Py_TYPE(res)->tp_name);
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300272 Py_DECREF(res);
273 return -1;
274 }
275 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
276 "%.50s.__float__ returned non-float (type %.50s). "
277 "The ability to return an instance of a strict subclass of float "
278 "is deprecated, and may be removed in a future version of Python.",
Victor Stinner58ac7002020-02-07 03:04:21 +0100279 Py_TYPE(op)->tp_name, Py_TYPE(res)->tp_name)) {
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300280 Py_DECREF(res);
281 return -1;
282 }
283 }
Tim Petersd2364e82001-11-01 20:09:42 +0000284
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300285 val = PyFloat_AS_DOUBLE(res);
286 Py_DECREF(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288}
289
Neil Schemenauer32117e52001-01-04 01:44:34 +0000290/* Macro and helper that convert PyObject obj to a C double and store
Neil Schemenauer16c70752007-09-21 20:19:23 +0000291 the value in dbl. If conversion to double raises an exception, obj is
Tim Peters77d8a4f2001-12-11 20:31:34 +0000292 set to NULL, and the function invoking this macro returns NULL. If
Serhiy Storchaka95949422013-08-27 19:40:23 +0300293 obj is not of float or int type, Py_NotImplemented is incref'ed,
Tim Peters77d8a4f2001-12-11 20:31:34 +0000294 stored in obj, and returned from the function invoking this macro.
295*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296#define CONVERT_TO_DOUBLE(obj, dbl) \
297 if (PyFloat_Check(obj)) \
298 dbl = PyFloat_AS_DOUBLE(obj); \
299 else if (convert_to_double(&(obj), &(dbl)) < 0) \
300 return obj;
Neil Schemenauer32117e52001-01-04 01:44:34 +0000301
Eric Smith0923d1d2009-04-16 20:16:10 +0000302/* Methods */
303
Neil Schemenauer32117e52001-01-04 01:44:34 +0000304static int
Tim Peters9fffa3e2001-09-04 05:14:19 +0000305convert_to_double(PyObject **v, double *dbl)
Neil Schemenauer32117e52001-01-04 01:44:34 +0000306{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200307 PyObject *obj = *v;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 if (PyLong_Check(obj)) {
310 *dbl = PyLong_AsDouble(obj);
311 if (*dbl == -1.0 && PyErr_Occurred()) {
312 *v = NULL;
313 return -1;
314 }
315 }
316 else {
317 Py_INCREF(Py_NotImplemented);
318 *v = Py_NotImplemented;
319 return -1;
320 }
321 return 0;
Neil Schemenauer32117e52001-01-04 01:44:34 +0000322}
323
Eric Smith0923d1d2009-04-16 20:16:10 +0000324static PyObject *
Mark Dickinson388122d2010-08-04 20:56:28 +0000325float_repr(PyFloatObject *v)
Eric Smith0923d1d2009-04-16 20:16:10 +0000326{
327 PyObject *result;
Victor Stinnerd3f08822012-05-29 12:57:52 +0200328 char *buf;
329
330 buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
331 'r', 0,
332 Py_DTSF_ADD_DOT_0,
333 NULL);
Eric Smith0923d1d2009-04-16 20:16:10 +0000334 if (!buf)
Mark Dickinson388122d2010-08-04 20:56:28 +0000335 return PyErr_NoMemory();
Victor Stinnerd3f08822012-05-29 12:57:52 +0200336 result = _PyUnicode_FromASCII(buf, strlen(buf));
Eric Smith0923d1d2009-04-16 20:16:10 +0000337 PyMem_Free(buf);
338 return result;
339}
Guido van Rossum57072eb1999-12-23 19:00:28 +0000340
Tim Peters307fa782004-09-23 08:06:40 +0000341/* Comparison is pretty much a nightmare. When comparing float to float,
342 * we do it as straightforwardly (and long-windedly) as conceivable, so
343 * that, e.g., Python x == y delivers the same result as the platform
344 * C x == y when x and/or y is a NaN.
345 * When mixing float with an integer type, there's no good *uniform* approach.
346 * Converting the double to an integer obviously doesn't work, since we
347 * may lose info from fractional bits. Converting the integer to a double
Serhiy Storchaka95949422013-08-27 19:40:23 +0300348 * also has two failure modes: (1) an int may trigger overflow (too
Tim Peters307fa782004-09-23 08:06:40 +0000349 * 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 +0200350 * 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 +0000351 * 63 bits of precision, but a C double probably has only 53), and then
352 * we can falsely claim equality when low-order integer bits are lost by
353 * coercion to double. So this part is painful too.
354 */
355
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000356static PyObject*
357float_richcompare(PyObject *v, PyObject *w, int op)
358{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 double i, j;
360 int r = 0;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 assert(PyFloat_Check(v));
363 i = PyFloat_AS_DOUBLE(v);
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 /* Switch on the type of w. Set i and j to doubles to be compared,
366 * and op to the richcomp to use.
367 */
368 if (PyFloat_Check(w))
369 j = PyFloat_AS_DOUBLE(w);
Tim Peters307fa782004-09-23 08:06:40 +0000370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 else if (!Py_IS_FINITE(i)) {
372 if (PyLong_Check(w))
373 /* If i is an infinity, its magnitude exceeds any
374 * finite integer, so it doesn't matter which int we
375 * compare i with. If i is a NaN, similarly.
376 */
377 j = 0.0;
378 else
379 goto Unimplemented;
380 }
Tim Peters307fa782004-09-23 08:06:40 +0000381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 else if (PyLong_Check(w)) {
383 int vsign = i == 0.0 ? 0 : i < 0.0 ? -1 : 1;
384 int wsign = _PyLong_Sign(w);
385 size_t nbits;
386 int exponent;
Tim Peters307fa782004-09-23 08:06:40 +0000387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 if (vsign != wsign) {
389 /* Magnitudes are irrelevant -- the signs alone
390 * determine the outcome.
391 */
392 i = (double)vsign;
393 j = (double)wsign;
394 goto Compare;
395 }
396 /* The signs are the same. */
397 /* Convert w to a double if it fits. In particular, 0 fits. */
398 nbits = _PyLong_NumBits(w);
399 if (nbits == (size_t)-1 && PyErr_Occurred()) {
400 /* This long is so large that size_t isn't big enough
401 * to hold the # of bits. Replace with little doubles
402 * that give the same outcome -- w is so large that
403 * its magnitude must exceed the magnitude of any
404 * finite float.
405 */
406 PyErr_Clear();
407 i = (double)vsign;
408 assert(wsign != 0);
409 j = wsign * 2.0;
410 goto Compare;
411 }
412 if (nbits <= 48) {
413 j = PyLong_AsDouble(w);
414 /* It's impossible that <= 48 bits overflowed. */
415 assert(j != -1.0 || ! PyErr_Occurred());
416 goto Compare;
417 }
418 assert(wsign != 0); /* else nbits was 0 */
419 assert(vsign != 0); /* if vsign were 0, then since wsign is
420 * not 0, we would have taken the
421 * vsign != wsign branch at the start */
422 /* We want to work with non-negative numbers. */
423 if (vsign < 0) {
424 /* "Multiply both sides" by -1; this also swaps the
425 * comparator.
426 */
427 i = -i;
428 op = _Py_SwappedOp[op];
429 }
430 assert(i > 0.0);
431 (void) frexp(i, &exponent);
432 /* exponent is the # of bits in v before the radix point;
433 * we know that nbits (the # of bits in w) > 48 at this point
434 */
435 if (exponent < 0 || (size_t)exponent < nbits) {
436 i = 1.0;
437 j = 2.0;
438 goto Compare;
439 }
440 if ((size_t)exponent > nbits) {
441 i = 2.0;
442 j = 1.0;
443 goto Compare;
444 }
445 /* v and w have the same number of bits before the radix
Serhiy Storchaka95949422013-08-27 19:40:23 +0300446 * point. Construct two ints that have the same comparison
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 * outcome.
448 */
449 {
450 double fracpart;
451 double intpart;
452 PyObject *result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 PyObject *vv = NULL;
454 PyObject *ww = w;
Tim Peters307fa782004-09-23 08:06:40 +0000455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 if (wsign < 0) {
457 ww = PyNumber_Negative(w);
458 if (ww == NULL)
459 goto Error;
460 }
461 else
462 Py_INCREF(ww);
Tim Peters307fa782004-09-23 08:06:40 +0000463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 fracpart = modf(i, &intpart);
465 vv = PyLong_FromDouble(intpart);
466 if (vv == NULL)
467 goto Error;
Tim Peters307fa782004-09-23 08:06:40 +0000468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 if (fracpart != 0.0) {
470 /* Shift left, and or a 1 bit into vv
471 * to represent the lost fraction.
472 */
473 PyObject *temp;
Tim Peters307fa782004-09-23 08:06:40 +0000474
Serhiy Storchakaa5119e72019-05-19 14:14:38 +0300475 temp = _PyLong_Lshift(ww, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 if (temp == NULL)
477 goto Error;
478 Py_DECREF(ww);
479 ww = temp;
Tim Peters307fa782004-09-23 08:06:40 +0000480
Serhiy Storchakaa5119e72019-05-19 14:14:38 +0300481 temp = _PyLong_Lshift(vv, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 if (temp == NULL)
483 goto Error;
484 Py_DECREF(vv);
485 vv = temp;
Tim Peters307fa782004-09-23 08:06:40 +0000486
Serhiy Storchakaba85d692017-03-30 09:09:41 +0300487 temp = PyNumber_Or(vv, _PyLong_One);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 if (temp == NULL)
489 goto Error;
490 Py_DECREF(vv);
491 vv = temp;
492 }
Tim Peters307fa782004-09-23 08:06:40 +0000493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 r = PyObject_RichCompareBool(vv, ww, op);
495 if (r < 0)
496 goto Error;
497 result = PyBool_FromLong(r);
498 Error:
499 Py_XDECREF(vv);
500 Py_XDECREF(ww);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 return result;
502 }
503 } /* else if (PyLong_Check(w)) */
Tim Peters307fa782004-09-23 08:06:40 +0000504
Serhiy Storchaka95949422013-08-27 19:40:23 +0300505 else /* w isn't float or int */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 goto Unimplemented;
Tim Peters307fa782004-09-23 08:06:40 +0000507
508 Compare:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 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 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 return PyBool_FromLong(r);
Tim Peters307fa782004-09-23 08:06:40 +0000530
531 Unimplemented:
Brian Curtindfc80e32011-08-10 20:28:54 -0500532 Py_RETURN_NOTIMPLEMENTED;
Michael W. Hudsond3b33b52004-02-19 19:35:22 +0000533}
534
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000535static Py_hash_t
Fred Drakefd99de62000-07-09 05:02:18 +0000536float_hash(PyFloatObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 return _Py_HashDouble(v->ob_fval);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000539}
540
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000542float_add(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 double a,b;
545 CONVERT_TO_DOUBLE(v, a);
546 CONVERT_TO_DOUBLE(w, b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 a = a + b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000549}
550
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000552float_sub(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000553{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 double a,b;
555 CONVERT_TO_DOUBLE(v, a);
556 CONVERT_TO_DOUBLE(w, b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 a = a - b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000559}
560
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000562float_mul(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 double a,b;
565 CONVERT_TO_DOUBLE(v, a);
566 CONVERT_TO_DOUBLE(w, b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 a = a * b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000569}
570
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000571static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000572float_div(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 double a,b;
575 CONVERT_TO_DOUBLE(v, a);
576 CONVERT_TO_DOUBLE(w, b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 if (b == 0.0) {
578 PyErr_SetString(PyExc_ZeroDivisionError,
579 "float division by zero");
580 return NULL;
581 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 a = a / b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 return PyFloat_FromDouble(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000584}
585
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000587float_rem(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000588{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 double vx, wx;
590 double mod;
591 CONVERT_TO_DOUBLE(v, vx);
592 CONVERT_TO_DOUBLE(w, wx);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 if (wx == 0.0) {
594 PyErr_SetString(PyExc_ZeroDivisionError,
595 "float modulo");
596 return NULL;
597 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 mod = fmod(vx, wx);
Mark Dickinsond2a9b202010-12-04 12:25:30 +0000599 if (mod) {
600 /* ensure the remainder has the same sign as the denominator */
601 if ((wx < 0) != (mod < 0)) {
602 mod += wx;
603 }
604 }
605 else {
606 /* the remainder is zero, and in the presence of signed zeroes
607 fmod returns different results across platforms; ensure
Mark Dickinson7b1bee42010-12-04 13:14:29 +0000608 it has the same sign as the denominator. */
609 mod = copysign(0.0, wx);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 return PyFloat_FromDouble(mod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000612}
613
Dong-hee Na8d49f7c2020-01-30 22:23:15 +0900614static void
615_float_div_mod(double vx, double wx, double *floordiv, double *mod)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000616{
Dong-hee Na8d49f7c2020-01-30 22:23:15 +0900617 double div;
618 *mod = fmod(vx, wx);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 /* fmod is typically exact, so vx-mod is *mathematically* an
620 exact multiple of wx. But this is fp arithmetic, and fp
621 vx - mod is an approximation; the result is that div may
622 not be an exact integral value after the division, although
623 it will always be very close to one.
624 */
Dong-hee Na8d49f7c2020-01-30 22:23:15 +0900625 div = (vx - *mod) / wx;
626 if (*mod) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 /* ensure the remainder has the same sign as the denominator */
Dong-hee Na8d49f7c2020-01-30 22:23:15 +0900628 if ((wx < 0) != (*mod < 0)) {
629 *mod += wx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 div -= 1.0;
631 }
632 }
633 else {
634 /* the remainder is zero, and in the presence of signed zeroes
635 fmod returns different results across platforms; ensure
Mark Dickinson7b1bee42010-12-04 13:14:29 +0000636 it has the same sign as the denominator. */
Dong-hee Na8d49f7c2020-01-30 22:23:15 +0900637 *mod = copysign(0.0, wx);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 }
639 /* snap quotient to nearest integral value */
640 if (div) {
Dong-hee Na8d49f7c2020-01-30 22:23:15 +0900641 *floordiv = floor(div);
642 if (div - *floordiv > 0.5) {
643 *floordiv += 1.0;
Mark Dickinsonbe8147b2020-02-02 11:37:02 +0000644 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 }
646 else {
647 /* div is zero - get the same sign as the true quotient */
Dong-hee Na8d49f7c2020-01-30 22:23:15 +0900648 *floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 }
Dong-hee Na8d49f7c2020-01-30 22:23:15 +0900650}
651
652static PyObject *
653float_divmod(PyObject *v, PyObject *w)
654{
Mark Dickinsonbe8147b2020-02-02 11:37:02 +0000655 double vx, wx;
656 double mod, floordiv;
657 CONVERT_TO_DOUBLE(v, vx);
658 CONVERT_TO_DOUBLE(w, wx);
659 if (wx == 0.0) {
660 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
661 return NULL;
662 }
663 _float_div_mod(vx, wx, &floordiv, &mod);
664 return Py_BuildValue("(dd)", floordiv, mod);
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000665}
666
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667static PyObject *
Tim Peters63a35712001-12-11 19:57:24 +0000668float_floor_div(PyObject *v, PyObject *w)
669{
Dong-hee Na8d49f7c2020-01-30 22:23:15 +0900670 double vx, wx;
671 double mod, floordiv;
672 CONVERT_TO_DOUBLE(v, vx);
673 CONVERT_TO_DOUBLE(w, wx);
674 if (wx == 0.0) {
675 PyErr_SetString(PyExc_ZeroDivisionError, "float floor division by zero");
676 return NULL;
677 }
678 _float_div_mod(vx, wx, &floordiv, &mod);
679 return PyFloat_FromDouble(floordiv);
Tim Peters63a35712001-12-11 19:57:24 +0000680}
681
Mark Dickinson9ab44b52009-12-30 16:22:49 +0000682/* determine whether x is an odd integer or not; assumes that
683 x is not an infinity or nan. */
684#define DOUBLE_IS_ODD_INTEGER(x) (fmod(fabs(x), 2.0) == 1.0)
685
Tim Peters63a35712001-12-11 19:57:24 +0000686static PyObject *
Neil Schemenauer32117e52001-01-04 01:44:34 +0000687float_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000688{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 double iv, iw, ix;
690 int negate_result = 0;
Tim Peters32f453e2001-09-03 08:35:41 +0000691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 if ((PyObject *)z != Py_None) {
693 PyErr_SetString(PyExc_TypeError, "pow() 3rd argument not "
694 "allowed unless all arguments are integers");
695 return NULL;
696 }
Tim Peters32f453e2001-09-03 08:35:41 +0000697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 CONVERT_TO_DOUBLE(v, iv);
699 CONVERT_TO_DOUBLE(w, iw);
Tim Petersc54d1902000-10-06 00:36:09 +0000700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 /* Sort out special cases here instead of relying on pow() */
702 if (iw == 0) { /* v**0 is 1, even 0**0 */
703 return PyFloat_FromDouble(1.0);
704 }
705 if (Py_IS_NAN(iv)) { /* nan**w = nan, unless w == 0 */
706 return PyFloat_FromDouble(iv);
707 }
708 if (Py_IS_NAN(iw)) { /* v**nan = nan, unless v == 1; 1**nan = 1 */
709 return PyFloat_FromDouble(iv == 1.0 ? 1.0 : iw);
710 }
711 if (Py_IS_INFINITY(iw)) {
712 /* v**inf is: 0.0 if abs(v) < 1; 1.0 if abs(v) == 1; inf if
713 * abs(v) > 1 (including case where v infinite)
714 *
715 * v**-inf is: inf if abs(v) < 1; 1.0 if abs(v) == 1; 0.0 if
716 * abs(v) > 1 (including case where v infinite)
717 */
718 iv = fabs(iv);
719 if (iv == 1.0)
720 return PyFloat_FromDouble(1.0);
721 else if ((iw > 0.0) == (iv > 1.0))
722 return PyFloat_FromDouble(fabs(iw)); /* return inf */
723 else
724 return PyFloat_FromDouble(0.0);
725 }
726 if (Py_IS_INFINITY(iv)) {
727 /* (+-inf)**w is: inf for w positive, 0 for w negative; in
728 * both cases, we need to add the appropriate sign if w is
729 * an odd integer.
730 */
731 int iw_is_odd = DOUBLE_IS_ODD_INTEGER(iw);
732 if (iw > 0.0)
733 return PyFloat_FromDouble(iw_is_odd ? iv : fabs(iv));
734 else
735 return PyFloat_FromDouble(iw_is_odd ?
736 copysign(0.0, iv) : 0.0);
737 }
738 if (iv == 0.0) { /* 0**w is: 0 for w positive, 1 for w zero
739 (already dealt with above), and an error
740 if w is negative. */
741 int iw_is_odd = DOUBLE_IS_ODD_INTEGER(iw);
742 if (iw < 0.0) {
743 PyErr_SetString(PyExc_ZeroDivisionError,
744 "0.0 cannot be raised to a "
745 "negative power");
746 return NULL;
747 }
748 /* use correct sign if iw is odd */
749 return PyFloat_FromDouble(iw_is_odd ? iv : 0.0);
750 }
Mark Dickinson9ab44b52009-12-30 16:22:49 +0000751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 if (iv < 0.0) {
753 /* Whether this is an error is a mess, and bumps into libm
754 * bugs so we have to figure it out ourselves.
755 */
756 if (iw != floor(iw)) {
757 /* Negative numbers raised to fractional powers
758 * become complex.
759 */
760 return PyComplex_Type.tp_as_number->nb_power(v, w, z);
761 }
762 /* iw is an exact integer, albeit perhaps a very large
763 * one. Replace iv by its absolute value and remember
764 * to negate the pow result if iw is odd.
765 */
766 iv = -iv;
767 negate_result = DOUBLE_IS_ODD_INTEGER(iw);
768 }
Mark Dickinson9ab44b52009-12-30 16:22:49 +0000769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 if (iv == 1.0) { /* 1**w is 1, even 1**inf and 1**nan */
771 /* (-1) ** large_integer also ends up here. Here's an
772 * extract from the comments for the previous
773 * implementation explaining why this special case is
774 * necessary:
775 *
776 * -1 raised to an exact integer should never be exceptional.
777 * Alas, some libms (chiefly glibc as of early 2003) return
778 * NaN and set EDOM on pow(-1, large_int) if the int doesn't
779 * happen to be representable in a *C* integer. That's a
780 * bug.
781 */
782 return PyFloat_FromDouble(negate_result ? -1.0 : 1.0);
783 }
Mark Dickinson9ab44b52009-12-30 16:22:49 +0000784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 /* Now iv and iw are finite, iw is nonzero, and iv is
786 * positive and not equal to 1.0. We finally allow
787 * the platform pow to step in and do the rest.
788 */
789 errno = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 ix = pow(iv, iw);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 Py_ADJUST_ERANGE1(ix);
792 if (negate_result)
793 ix = -ix;
Mark Dickinson9ab44b52009-12-30 16:22:49 +0000794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 if (errno != 0) {
796 /* We don't expect any errno value other than ERANGE, but
797 * the range of libm bugs appears unbounded.
798 */
799 PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError :
800 PyExc_ValueError);
801 return NULL;
802 }
803 return PyFloat_FromDouble(ix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000804}
805
Mark Dickinson9ab44b52009-12-30 16:22:49 +0000806#undef DOUBLE_IS_ODD_INTEGER
807
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000808static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000809float_neg(PyFloatObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000810{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 return PyFloat_FromDouble(-v->ob_fval);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000812}
813
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000814static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +0000815float_abs(PyFloatObject *v)
Guido van Rossumeba1b5e1991-05-05 20:07:00 +0000816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 return PyFloat_FromDouble(fabs(v->ob_fval));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000818}
819
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000820static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000821float_bool(PyFloatObject *v)
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000822{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 return v->ob_fval != 0.0;
Guido van Rossum50b4ef61991-05-14 11:57:01 +0000824}
825
Serhiy Storchakab5c51d32017-03-11 09:21:05 +0200826/*[clinic input]
827float.is_integer
828
829Return True if the float is an integer.
830[clinic start generated code]*/
831
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000832static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +0200833float_is_integer_impl(PyObject *self)
834/*[clinic end generated code: output=7112acf95a4d31ea input=311810d3f777e10d]*/
Christian Heimes53876d92008-04-19 00:31:39 +0000835{
Serhiy Storchakab5c51d32017-03-11 09:21:05 +0200836 double x = PyFloat_AsDouble(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 PyObject *o;
838
839 if (x == -1.0 && PyErr_Occurred())
840 return NULL;
841 if (!Py_IS_FINITE(x))
842 Py_RETURN_FALSE;
843 errno = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 o = (floor(x) == x) ? Py_True : Py_False;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 if (errno != 0) {
846 PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError :
847 PyExc_ValueError);
848 return NULL;
849 }
850 Py_INCREF(o);
851 return o;
Christian Heimes53876d92008-04-19 00:31:39 +0000852}
853
Serhiy Storchakab5c51d32017-03-11 09:21:05 +0200854/*[clinic input]
855float.__trunc__
856
857Return the Integral closest to x between 0 and x.
858[clinic start generated code]*/
859
Christian Heimes53876d92008-04-19 00:31:39 +0000860static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +0200861float___trunc___impl(PyObject *self)
862/*[clinic end generated code: output=dd3e289dd4c6b538 input=591b9ba0d650fdff]*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000863{
Serhiy Storchakab5c51d32017-03-11 09:21:05 +0200864 double x = PyFloat_AsDouble(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 double wholepart; /* integral portion of x, rounded toward 0 */
Tim Peters7321ec42001-07-26 20:02:17 +0000866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 (void)modf(x, &wholepart);
868 /* Try to get out cheap if this fits in a Python int. The attempt
869 * to cast to long must be protected, as C doesn't define what
870 * happens if the double is too big to fit in a long. Some rare
871 * systems raise an exception then (RISCOS was mentioned as one,
872 * and someone using a non-default option on Sun also bumped into
873 * that). Note that checking for >= and <= LONG_{MIN,MAX} would
874 * still be vulnerable: if a long has more bits of precision than
875 * a double, casting MIN/MAX to double may yield an approximation,
876 * and if that's rounded up, then, e.g., wholepart=LONG_MAX+1 would
877 * yield true from the C expression wholepart<=LONG_MAX, despite
878 * that wholepart is actually greater than LONG_MAX.
879 */
880 if (LONG_MIN < wholepart && wholepart < LONG_MAX) {
881 const long aslong = (long)wholepart;
882 return PyLong_FromLong(aslong);
883 }
884 return PyLong_FromDouble(wholepart);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000885}
886
Batuhan Taşkayacb8b9462019-12-16 01:00:28 +0300887/*[clinic input]
888float.__floor__
889
890Return the floor as an Integral.
891[clinic start generated code]*/
892
893static PyObject *
894float___floor___impl(PyObject *self)
895/*[clinic end generated code: output=e0551dbaea8c01d1 input=77bb13eb12e268df]*/
896{
897 double x = PyFloat_AS_DOUBLE(self);
898 return PyLong_FromDouble(floor(x));
899}
900
901/*[clinic input]
902float.__ceil__
903
904Return the ceiling as an Integral.
905[clinic start generated code]*/
906
907static PyObject *
908float___ceil___impl(PyObject *self)
909/*[clinic end generated code: output=a2fd8858f73736f9 input=79e41ae94aa0a516]*/
910{
911 double x = PyFloat_AS_DOUBLE(self);
912 return PyLong_FromDouble(ceil(x));
913}
914
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000915/* double_round: rounds a finite double to the closest multiple of
916 10**-ndigits; here ndigits is within reasonable bounds (typically, -308 <=
917 ndigits <= 323). Returns a Python float, or sets a Python error and
918 returns NULL on failure (OverflowError and memory errors are possible). */
919
920#ifndef PY_NO_SHORT_FLOAT_REPR
921/* version of double_round that uses the correctly-rounded string<->double
922 conversions from Python/dtoa.c */
923
924static PyObject *
925double_round(double x, int ndigits) {
926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 double rounded;
928 Py_ssize_t buflen, mybuflen=100;
929 char *buf, *buf_end, shortbuf[100], *mybuf=shortbuf;
930 int decpt, sign;
931 PyObject *result = NULL;
Mark Dickinson261896b2012-01-27 21:16:01 +0000932 _Py_SET_53BIT_PRECISION_HEADER;
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 /* round to a decimal string */
Mark Dickinson261896b2012-01-27 21:16:01 +0000935 _Py_SET_53BIT_PRECISION_START;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 buf = _Py_dg_dtoa(x, 3, ndigits, &decpt, &sign, &buf_end);
Mark Dickinson261896b2012-01-27 21:16:01 +0000937 _Py_SET_53BIT_PRECISION_END;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 if (buf == NULL) {
939 PyErr_NoMemory();
940 return NULL;
941 }
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 /* Get new buffer if shortbuf is too small. Space needed <= buf_end -
944 buf + 8: (1 extra for '0', 1 for sign, 5 for exp, 1 for '\0'). */
945 buflen = buf_end - buf;
946 if (buflen + 8 > mybuflen) {
947 mybuflen = buflen+8;
948 mybuf = (char *)PyMem_Malloc(mybuflen);
949 if (mybuf == NULL) {
950 PyErr_NoMemory();
951 goto exit;
952 }
953 }
954 /* copy buf to mybuf, adding exponent, sign and leading 0 */
955 PyOS_snprintf(mybuf, mybuflen, "%s0%se%d", (sign ? "-" : ""),
956 buf, decpt - (int)buflen);
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 /* and convert the resulting string back to a double */
959 errno = 0;
Mark Dickinson261896b2012-01-27 21:16:01 +0000960 _Py_SET_53BIT_PRECISION_START;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 rounded = _Py_dg_strtod(mybuf, NULL);
Mark Dickinson261896b2012-01-27 21:16:01 +0000962 _Py_SET_53BIT_PRECISION_END;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 if (errno == ERANGE && fabs(rounded) >= 1.)
964 PyErr_SetString(PyExc_OverflowError,
965 "rounded value too large to represent");
966 else
967 result = PyFloat_FromDouble(rounded);
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 /* done computing value; now clean up */
970 if (mybuf != shortbuf)
971 PyMem_Free(mybuf);
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000972 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 _Py_dg_freedtoa(buf);
974 return result;
Mark Dickinsone6a076d2009-04-18 11:48:33 +0000975}
976
977#else /* PY_NO_SHORT_FLOAT_REPR */
978
979/* fallback version, to be used when correctly rounded binary<->decimal
980 conversions aren't available */
981
982static PyObject *
983double_round(double x, int ndigits) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 double pow1, pow2, y, z;
985 if (ndigits >= 0) {
986 if (ndigits > 22) {
987 /* pow1 and pow2 are each safe from overflow, but
988 pow1*pow2 ~= pow(10.0, ndigits) might overflow */
989 pow1 = pow(10.0, (double)(ndigits-22));
990 pow2 = 1e22;
991 }
992 else {
993 pow1 = pow(10.0, (double)ndigits);
994 pow2 = 1.0;
995 }
996 y = (x*pow1)*pow2;
997 /* if y overflows, then rounded value is exactly x */
998 if (!Py_IS_FINITE(y))
999 return PyFloat_FromDouble(x);
1000 }
1001 else {
1002 pow1 = pow(10.0, (double)-ndigits);
1003 pow2 = 1.0; /* unused; silences a gcc compiler warning */
1004 y = x / pow1;
1005 }
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 z = round(y);
1008 if (fabs(y-z) == 0.5)
1009 /* halfway between two integers; use round-half-even */
1010 z = 2.0*round(y/2.0);
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 if (ndigits >= 0)
1013 z = (z / pow2) / pow1;
1014 else
1015 z *= pow1;
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 /* if computation resulted in overflow, raise OverflowError */
1018 if (!Py_IS_FINITE(z)) {
1019 PyErr_SetString(PyExc_OverflowError,
1020 "overflow occurred during round");
1021 return NULL;
1022 }
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 return PyFloat_FromDouble(z);
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001025}
1026
1027#endif /* PY_NO_SHORT_FLOAT_REPR */
1028
1029/* round a Python float v to the closest multiple of 10**-ndigits */
1030
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001031/*[clinic input]
1032float.__round__
1033
Serhiy Storchaka279f4462019-09-14 12:24:05 +03001034 ndigits as o_ndigits: object = None
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001035 /
1036
1037Return the Integral closest to x, rounding half toward even.
1038
1039When an argument is passed, work like built-in round(x, ndigits).
1040[clinic start generated code]*/
1041
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001042static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001043float___round___impl(PyObject *self, PyObject *o_ndigits)
Serhiy Storchaka279f4462019-09-14 12:24:05 +03001044/*[clinic end generated code: output=374c36aaa0f13980 input=fc0fe25924fbc9ed]*/
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 double x, rounded;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 Py_ssize_t ndigits;
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001048
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001049 x = PyFloat_AsDouble(self);
Serhiy Storchaka279f4462019-09-14 12:24:05 +03001050 if (o_ndigits == Py_None) {
Steve Dowercb39d1f2015-04-15 16:10:59 -04001051 /* single-argument round or with None ndigits:
1052 * round to nearest integer */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 rounded = round(x);
1054 if (fabs(x-rounded) == 0.5)
1055 /* halfway case: round to even */
1056 rounded = 2.0*round(x/2.0);
1057 return PyLong_FromDouble(rounded);
1058 }
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 /* interpret second argument as a Py_ssize_t; clips on overflow */
1061 ndigits = PyNumber_AsSsize_t(o_ndigits, NULL);
1062 if (ndigits == -1 && PyErr_Occurred())
1063 return NULL;
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 /* nans and infinities round to themselves */
1066 if (!Py_IS_FINITE(x))
1067 return PyFloat_FromDouble(x);
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 /* Deal with extreme values for ndigits. For ndigits > NDIGITS_MAX, x
1070 always rounds to itself. For ndigits < NDIGITS_MIN, x always
1071 rounds to +-0.0. Here 0.30103 is an upper bound for log10(2). */
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001072#define NDIGITS_MAX ((int)((DBL_MANT_DIG-DBL_MIN_EXP) * 0.30103))
1073#define NDIGITS_MIN (-(int)((DBL_MAX_EXP + 1) * 0.30103))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 if (ndigits > NDIGITS_MAX)
1075 /* return x */
1076 return PyFloat_FromDouble(x);
1077 else if (ndigits < NDIGITS_MIN)
1078 /* return 0.0, but with sign of x */
1079 return PyFloat_FromDouble(0.0*x);
1080 else
1081 /* finite x, and ndigits is not unreasonably large */
1082 return double_round(x, (int)ndigits);
Mark Dickinsone6a076d2009-04-18 11:48:33 +00001083#undef NDIGITS_MAX
1084#undef NDIGITS_MIN
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001085}
1086
1087static PyObject *
Fred Drakefd99de62000-07-09 05:02:18 +00001088float_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 if (PyFloat_CheckExact(v))
1091 Py_INCREF(v);
1092 else
1093 v = PyFloat_FromDouble(((PyFloatObject *)v)->ob_fval);
1094 return v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001095}
1096
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001097/*[clinic input]
1098float.conjugate
1099
1100Return self, the complex conjugate of any float.
1101[clinic start generated code]*/
1102
1103static PyObject *
1104float_conjugate_impl(PyObject *self)
1105/*[clinic end generated code: output=8ca292c2479194af input=82ba6f37a9ff91dd]*/
1106{
1107 return float_float(self);
1108}
1109
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001110/* turn ASCII hex characters into integer values and vice versa */
1111
1112static char
1113char_from_hex(int x)
1114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 assert(0 <= x && x < 16);
Victor Stinnerf5cff562011-10-14 02:13:11 +02001116 return Py_hexdigits[x];
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001117}
1118
1119static int
1120hex_from_char(char c) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 int x;
1122 switch(c) {
1123 case '0':
1124 x = 0;
1125 break;
1126 case '1':
1127 x = 1;
1128 break;
1129 case '2':
1130 x = 2;
1131 break;
1132 case '3':
1133 x = 3;
1134 break;
1135 case '4':
1136 x = 4;
1137 break;
1138 case '5':
1139 x = 5;
1140 break;
1141 case '6':
1142 x = 6;
1143 break;
1144 case '7':
1145 x = 7;
1146 break;
1147 case '8':
1148 x = 8;
1149 break;
1150 case '9':
1151 x = 9;
1152 break;
1153 case 'a':
1154 case 'A':
1155 x = 10;
1156 break;
1157 case 'b':
1158 case 'B':
1159 x = 11;
1160 break;
1161 case 'c':
1162 case 'C':
1163 x = 12;
1164 break;
1165 case 'd':
1166 case 'D':
1167 x = 13;
1168 break;
1169 case 'e':
1170 case 'E':
1171 x = 14;
1172 break;
1173 case 'f':
1174 case 'F':
1175 x = 15;
1176 break;
1177 default:
1178 x = -1;
1179 break;
1180 }
1181 return x;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001182}
1183
1184/* convert a float to a hexadecimal string */
1185
1186/* TOHEX_NBITS is DBL_MANT_DIG rounded up to the next integer
1187 of the form 4k+1. */
1188#define TOHEX_NBITS DBL_MANT_DIG + 3 - (DBL_MANT_DIG+2)%4
1189
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001190/*[clinic input]
1191float.hex
1192
1193Return a hexadecimal representation of a floating-point number.
1194
1195>>> (-0.1).hex()
1196'-0x1.999999999999ap-4'
1197>>> 3.14159.hex()
1198'0x1.921f9f01b866ep+1'
1199[clinic start generated code]*/
1200
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001201static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001202float_hex_impl(PyObject *self)
1203/*[clinic end generated code: output=0ebc9836e4d302d4 input=bec1271a33d47e67]*/
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 double x, m;
1206 int e, shift, i, si, esign;
1207 /* Space for 1+(TOHEX_NBITS-1)/4 digits, a decimal point, and the
1208 trailing NUL byte. */
1209 char s[(TOHEX_NBITS-1)/4+3];
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001210
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001211 CONVERT_TO_DOUBLE(self, x);
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 if (Py_IS_NAN(x) || Py_IS_INFINITY(x))
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001214 return float_repr((PyFloatObject *)self);
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 if (x == 0.0) {
Benjamin Peterson5d470832010-07-02 19:45:07 +00001217 if (copysign(1.0, x) == -1.0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 return PyUnicode_FromString("-0x0.0p+0");
1219 else
1220 return PyUnicode_FromString("0x0.0p+0");
1221 }
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 m = frexp(fabs(x), &e);
Victor Stinner640c35c2013-06-04 23:14:37 +02001224 shift = 1 - Py_MAX(DBL_MIN_EXP - e, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 m = ldexp(m, shift);
1226 e -= shift;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 si = 0;
1229 s[si] = char_from_hex((int)m);
1230 si++;
1231 m -= (int)m;
1232 s[si] = '.';
1233 si++;
1234 for (i=0; i < (TOHEX_NBITS-1)/4; i++) {
1235 m *= 16.0;
1236 s[si] = char_from_hex((int)m);
1237 si++;
1238 m -= (int)m;
1239 }
1240 s[si] = '\0';
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 if (e < 0) {
1243 esign = (int)'-';
1244 e = -e;
1245 }
1246 else
1247 esign = (int)'+';
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 if (x < 0.0)
1250 return PyUnicode_FromFormat("-0x%sp%c%d", s, esign, e);
1251 else
1252 return PyUnicode_FromFormat("0x%sp%c%d", s, esign, e);
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001253}
1254
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001255/* Convert a hexadecimal string to a float. */
1256
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001257/*[clinic input]
1258@classmethod
1259float.fromhex
1260
1261 string: object
1262 /
1263
1264Create a floating-point number from a hexadecimal string.
1265
1266>>> float.fromhex('0x1.ffffp10')
12672047.984375
1268>>> float.fromhex('-0x1p-1074')
1269-5e-324
1270[clinic start generated code]*/
1271
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001272static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001273float_fromhex(PyTypeObject *type, PyObject *string)
1274/*[clinic end generated code: output=46c0274d22b78e82 input=0407bebd354bca89]*/
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001275{
Serhiy Storchaka25885d12016-05-12 10:21:14 +03001276 PyObject *result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 double x;
1278 long exp, top_exp, lsb, key_digit;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02001279 const char *s, *coeff_start, *s_store, *coeff_end, *exp_start, *s_end;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 int half_eps, digit, round_up, negate=0;
1281 Py_ssize_t length, ndigits, fdigits, i;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 /*
1284 * For the sake of simplicity and correctness, we impose an artificial
1285 * limit on ndigits, the total number of hex digits in the coefficient
1286 * The limit is chosen to ensure that, writing exp for the exponent,
1287 *
1288 * (1) if exp > LONG_MAX/2 then the value of the hex string is
1289 * guaranteed to overflow (provided it's nonzero)
1290 *
1291 * (2) if exp < LONG_MIN/2 then the value of the hex string is
1292 * guaranteed to underflow to 0.
1293 *
1294 * (3) if LONG_MIN/2 <= exp <= LONG_MAX/2 then there's no danger of
1295 * overflow in the calculation of exp and top_exp below.
1296 *
1297 * More specifically, ndigits is assumed to satisfy the following
1298 * inequalities:
1299 *
1300 * 4*ndigits <= DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2
1301 * 4*ndigits <= LONG_MAX/2 + 1 - DBL_MAX_EXP
1302 *
1303 * If either of these inequalities is not satisfied, a ValueError is
1304 * raised. Otherwise, write x for the value of the hex string, and
1305 * assume x is nonzero. Then
1306 *
1307 * 2**(exp-4*ndigits) <= |x| < 2**(exp+4*ndigits).
1308 *
1309 * Now if exp > LONG_MAX/2 then:
1310 *
1311 * exp - 4*ndigits >= LONG_MAX/2 + 1 - (LONG_MAX/2 + 1 - DBL_MAX_EXP)
1312 * = DBL_MAX_EXP
1313 *
1314 * so |x| >= 2**DBL_MAX_EXP, which is too large to be stored in C
1315 * double, so overflows. If exp < LONG_MIN/2, then
1316 *
1317 * exp + 4*ndigits <= LONG_MIN/2 - 1 + (
1318 * DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2)
1319 * = DBL_MIN_EXP - DBL_MANT_DIG - 1
1320 *
1321 * and so |x| < 2**(DBL_MIN_EXP-DBL_MANT_DIG-1), hence underflows to 0
1322 * when converted to a C double.
1323 *
1324 * It's easy to show that if LONG_MIN/2 <= exp <= LONG_MAX/2 then both
1325 * exp+4*ndigits and exp-4*ndigits are within the range of a long.
1326 */
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001327
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001328 s = PyUnicode_AsUTF8AndSize(string, &length);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 if (s == NULL)
1330 return NULL;
1331 s_end = s + length;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 /********************
1334 * Parse the string *
1335 ********************/
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 /* leading whitespace */
1338 while (Py_ISSPACE(*s))
1339 s++;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 /* infinities and nans */
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02001342 x = _Py_parse_inf_or_nan(s, (char **)&coeff_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 if (coeff_end != s) {
1344 s = coeff_end;
1345 goto finished;
1346 }
Mark Dickinsonbd16edd2009-05-20 22:05:25 +00001347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 /* optional sign */
1349 if (*s == '-') {
1350 s++;
1351 negate = 1;
1352 }
1353 else if (*s == '+')
1354 s++;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 /* [0x] */
1357 s_store = s;
1358 if (*s == '0') {
1359 s++;
1360 if (*s == 'x' || *s == 'X')
1361 s++;
1362 else
1363 s = s_store;
1364 }
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 /* coefficient: <integer> [. <fraction>] */
1367 coeff_start = s;
1368 while (hex_from_char(*s) >= 0)
1369 s++;
1370 s_store = s;
1371 if (*s == '.') {
1372 s++;
1373 while (hex_from_char(*s) >= 0)
1374 s++;
1375 coeff_end = s-1;
1376 }
1377 else
1378 coeff_end = s;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 /* ndigits = total # of hex digits; fdigits = # after point */
1381 ndigits = coeff_end - coeff_start;
1382 fdigits = coeff_end - s_store;
1383 if (ndigits == 0)
1384 goto parse_error;
Victor Stinner640c35c2013-06-04 23:14:37 +02001385 if (ndigits > Py_MIN(DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2,
1386 LONG_MAX/2 + 1 - DBL_MAX_EXP)/4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 goto insane_length_error;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 /* [p <exponent>] */
1390 if (*s == 'p' || *s == 'P') {
1391 s++;
1392 exp_start = s;
1393 if (*s == '-' || *s == '+')
1394 s++;
1395 if (!('0' <= *s && *s <= '9'))
1396 goto parse_error;
1397 s++;
1398 while ('0' <= *s && *s <= '9')
1399 s++;
1400 exp = strtol(exp_start, NULL, 10);
1401 }
1402 else
1403 exp = 0;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001404
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001405/* for 0 <= j < ndigits, HEX_DIGIT(j) gives the jth most significant digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406#define HEX_DIGIT(j) hex_from_char(*((j) < fdigits ? \
1407 coeff_end-(j) : \
1408 coeff_end-1-(j)))
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 /*******************************************
1411 * Compute rounded value of the hex string *
1412 *******************************************/
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 /* Discard leading zeros, and catch extreme overflow and underflow */
1415 while (ndigits > 0 && HEX_DIGIT(ndigits-1) == 0)
1416 ndigits--;
1417 if (ndigits == 0 || exp < LONG_MIN/2) {
1418 x = 0.0;
1419 goto finished;
1420 }
1421 if (exp > LONG_MAX/2)
1422 goto overflow_error;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 /* Adjust exponent for fractional part. */
1425 exp = exp - 4*((long)fdigits);
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 /* top_exp = 1 more than exponent of most sig. bit of coefficient */
1428 top_exp = exp + 4*((long)ndigits - 1);
1429 for (digit = HEX_DIGIT(ndigits-1); digit != 0; digit /= 2)
1430 top_exp++;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 /* catch almost all nonextreme cases of overflow and underflow here */
1433 if (top_exp < DBL_MIN_EXP - DBL_MANT_DIG) {
1434 x = 0.0;
1435 goto finished;
1436 }
1437 if (top_exp > DBL_MAX_EXP)
1438 goto overflow_error;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 /* lsb = exponent of least significant bit of the *rounded* value.
1441 This is top_exp - DBL_MANT_DIG unless result is subnormal. */
Victor Stinner640c35c2013-06-04 23:14:37 +02001442 lsb = Py_MAX(top_exp, (long)DBL_MIN_EXP) - DBL_MANT_DIG;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 x = 0.0;
1445 if (exp >= lsb) {
1446 /* no rounding required */
1447 for (i = ndigits-1; i >= 0; i--)
1448 x = 16.0*x + HEX_DIGIT(i);
1449 x = ldexp(x, (int)(exp));
1450 goto finished;
1451 }
1452 /* rounding required. key_digit is the index of the hex digit
1453 containing the first bit to be rounded away. */
1454 half_eps = 1 << (int)((lsb - exp - 1) % 4);
1455 key_digit = (lsb - exp - 1) / 4;
1456 for (i = ndigits-1; i > key_digit; i--)
1457 x = 16.0*x + HEX_DIGIT(i);
1458 digit = HEX_DIGIT(key_digit);
1459 x = 16.0*x + (double)(digit & (16-2*half_eps));
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 /* round-half-even: round up if bit lsb-1 is 1 and at least one of
1462 bits lsb, lsb-2, lsb-3, lsb-4, ... is 1. */
1463 if ((digit & half_eps) != 0) {
1464 round_up = 0;
1465 if ((digit & (3*half_eps-1)) != 0 ||
1466 (half_eps == 8 && (HEX_DIGIT(key_digit+1) & 1) != 0))
1467 round_up = 1;
1468 else
1469 for (i = key_digit-1; i >= 0; i--)
1470 if (HEX_DIGIT(i) != 0) {
1471 round_up = 1;
1472 break;
1473 }
Mark Dickinson21a1f732010-07-06 15:11:44 +00001474 if (round_up) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 x += 2*half_eps;
1476 if (top_exp == DBL_MAX_EXP &&
1477 x == ldexp((double)(2*half_eps), DBL_MANT_DIG))
1478 /* overflow corner case: pre-rounded value <
1479 2**DBL_MAX_EXP; rounded=2**DBL_MAX_EXP. */
1480 goto overflow_error;
1481 }
1482 }
1483 x = ldexp(x, (int)(exp+4*key_digit));
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001484
1485 finished:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 /* optional trailing whitespace leading to the end of the string */
1487 while (Py_ISSPACE(*s))
1488 s++;
1489 if (s != s_end)
1490 goto parse_error;
Serhiy Storchaka25885d12016-05-12 10:21:14 +03001491 result = PyFloat_FromDouble(negate ? -x : x);
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001492 if (type != &PyFloat_Type && result != NULL) {
Jeroen Demeyer196a5302019-07-04 12:31:34 +02001493 Py_SETREF(result, _PyObject_CallOneArg((PyObject *)type, result));
Serhiy Storchaka25885d12016-05-12 10:21:14 +03001494 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 return result;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001496
1497 overflow_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 PyErr_SetString(PyExc_OverflowError,
1499 "hexadecimal value too large to represent as a float");
1500 return NULL;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001501
1502 parse_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 PyErr_SetString(PyExc_ValueError,
1504 "invalid hexadecimal floating-point string");
1505 return NULL;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001506
1507 insane_length_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 PyErr_SetString(PyExc_ValueError,
1509 "hexadecimal string too long to convert");
1510 return NULL;
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001511}
1512
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001513/*[clinic input]
1514float.as_integer_ratio
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001515
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001516Return integer ratio.
1517
1518Return a pair of integers, whose ratio is exactly equal to the original float
1519and with a positive denominator.
1520
1521Raise OverflowError on infinities and a ValueError on NaNs.
1522
1523>>> (10.0).as_integer_ratio()
1524(10, 1)
1525>>> (0.0).as_integer_ratio()
1526(0, 1)
1527>>> (-.25).as_integer_ratio()
1528(-1, 4)
1529[clinic start generated code]*/
Mark Dickinson65fe25e2008-07-16 11:30:51 +00001530
Christian Heimes26855632008-01-27 23:50:43 +00001531static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001532float_as_integer_ratio_impl(PyObject *self)
1533/*[clinic end generated code: output=65f25f0d8d30a712 input=e21d08b4630c2e44]*/
Christian Heimes26855632008-01-27 23:50:43 +00001534{
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001535 double self_double;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 double float_part;
1537 int exponent;
1538 int i;
Christian Heimes292d3512008-02-03 16:51:08 +00001539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 PyObject *py_exponent = NULL;
1541 PyObject *numerator = NULL;
1542 PyObject *denominator = NULL;
1543 PyObject *result_pair = NULL;
1544 PyNumberMethods *long_methods = PyLong_Type.tp_as_number;
Christian Heimes26855632008-01-27 23:50:43 +00001545
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001546 CONVERT_TO_DOUBLE(self, self_double);
Christian Heimes26855632008-01-27 23:50:43 +00001547
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001548 if (Py_IS_INFINITY(self_double)) {
Serhiy Storchaka0d250bc2015-12-29 22:34:23 +02001549 PyErr_SetString(PyExc_OverflowError,
1550 "cannot convert Infinity to integer ratio");
1551 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 }
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001553 if (Py_IS_NAN(self_double)) {
Serhiy Storchaka0d250bc2015-12-29 22:34:23 +02001554 PyErr_SetString(PyExc_ValueError,
1555 "cannot convert NaN to integer ratio");
1556 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 }
Christian Heimes26855632008-01-27 23:50:43 +00001558
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001559 float_part = frexp(self_double, &exponent); /* self_double == float_part * 2**exponent exactly */
Christian Heimes26855632008-01-27 23:50:43 +00001560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 for (i=0; i<300 && float_part != floor(float_part) ; i++) {
1562 float_part *= 2.0;
1563 exponent--;
1564 }
1565 /* self == float_part * 2**exponent exactly and float_part is integral.
1566 If FLT_RADIX != 2, the 300 steps may leave a tiny fractional part
1567 to be truncated by PyLong_FromDouble(). */
Christian Heimes26855632008-01-27 23:50:43 +00001568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 numerator = PyLong_FromDouble(float_part);
Serhiy Storchaka4e6aad12015-12-29 22:55:48 +02001570 if (numerator == NULL)
1571 goto error;
1572 denominator = PyLong_FromLong(1);
1573 if (denominator == NULL)
1574 goto error;
1575 py_exponent = PyLong_FromLong(Py_ABS(exponent));
1576 if (py_exponent == NULL)
1577 goto error;
Christian Heimes26855632008-01-27 23:50:43 +00001578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 /* fold in 2**exponent */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 if (exponent > 0) {
Serhiy Storchaka59865e72016-04-11 09:57:37 +03001581 Py_SETREF(numerator,
Serhiy Storchaka4e6aad12015-12-29 22:55:48 +02001582 long_methods->nb_lshift(numerator, py_exponent));
1583 if (numerator == NULL)
1584 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 }
1586 else {
Serhiy Storchaka59865e72016-04-11 09:57:37 +03001587 Py_SETREF(denominator,
Serhiy Storchaka4e6aad12015-12-29 22:55:48 +02001588 long_methods->nb_lshift(denominator, py_exponent));
1589 if (denominator == NULL)
1590 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 }
1592
1593 result_pair = PyTuple_Pack(2, numerator, denominator);
Christian Heimes26855632008-01-27 23:50:43 +00001594
Christian Heimes26855632008-01-27 23:50:43 +00001595error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 Py_XDECREF(py_exponent);
1597 Py_XDECREF(denominator);
1598 Py_XDECREF(numerator);
1599 return result_pair;
Christian Heimes26855632008-01-27 23:50:43 +00001600}
1601
Jeremy Hylton938ace62002-07-17 16:30:39 +00001602static PyObject *
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02001603float_subtype_new(PyTypeObject *type, PyObject *x);
1604
1605/*[clinic input]
1606@classmethod
1607float.__new__ as float_new
Serhiy Storchakaba85d692017-03-30 09:09:41 +03001608 x: object(c_default="_PyLong_Zero") = 0
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02001609 /
1610
1611Convert a string or number to a floating point number, if possible.
1612[clinic start generated code]*/
Guido van Rossumbef14172001-08-29 15:47:46 +00001613
Tim Peters6d6c1a32001-08-02 04:15:00 +00001614static PyObject *
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02001615float_new_impl(PyTypeObject *type, PyObject *x)
Serhiy Storchakabae68812017-04-05 12:00:42 +03001616/*[clinic end generated code: output=ccf1e8dc460ba6ba input=540ee77c204ff87a]*/
Tim Peters6d6c1a32001-08-02 04:15:00 +00001617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 if (type != &PyFloat_Type)
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02001619 return float_subtype_new(type, x); /* Wimp out */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 /* If it's a string, but not a string subclass, use
1621 PyFloat_FromString. */
1622 if (PyUnicode_CheckExact(x))
1623 return PyFloat_FromString(x);
1624 return PyNumber_Float(x);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001625}
1626
Guido van Rossumbef14172001-08-29 15:47:46 +00001627/* Wimpy, slow approach to tp_new calls for subtypes of float:
1628 first create a regular float from whatever arguments we got,
1629 then allocate a subtype instance and initialize its ob_fval
1630 from the regular float. The regular float is then thrown away.
1631*/
1632static PyObject *
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02001633float_subtype_new(PyTypeObject *type, PyObject *x)
Guido van Rossumbef14172001-08-29 15:47:46 +00001634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 PyObject *tmp, *newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00001636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 assert(PyType_IsSubtype(type, &PyFloat_Type));
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02001638 tmp = float_new_impl(&PyFloat_Type, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 if (tmp == NULL)
1640 return NULL;
Serhiy Storchaka15095802015-11-25 15:47:01 +02001641 assert(PyFloat_Check(tmp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 newobj = type->tp_alloc(type, 0);
1643 if (newobj == NULL) {
1644 Py_DECREF(tmp);
1645 return NULL;
1646 }
1647 ((PyFloatObject *)newobj)->ob_fval = ((PyFloatObject *)tmp)->ob_fval;
1648 Py_DECREF(tmp);
1649 return newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00001650}
1651
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001652/*[clinic input]
1653float.__getnewargs__
1654[clinic start generated code]*/
1655
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001656static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001657float___getnewargs___impl(PyObject *self)
1658/*[clinic end generated code: output=873258c9d206b088 input=002279d1d77891e6]*/
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001659{
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001660 return Py_BuildValue("(d)", ((PyFloatObject *)self)->ob_fval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001661}
1662
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001663/* this is for the benefit of the pack/unpack routines below */
1664
1665typedef enum {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 unknown_format, ieee_big_endian_format, ieee_little_endian_format
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001667} float_format_type;
1668
1669static float_format_type double_format, float_format;
1670static float_format_type detected_double_format, detected_float_format;
1671
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001672/*[clinic input]
1673@classmethod
1674float.__getformat__
1675
1676 typestr: str
1677 Must be 'double' or 'float'.
1678 /
1679
1680You probably don't want to use this function.
1681
1682It exists mainly to be used in Python's test suite.
1683
1684This function returns whichever of 'unknown', 'IEEE, big-endian' or 'IEEE,
1685little-endian' best describes the format of floating point numbers used by the
1686C type named by typestr.
1687[clinic start generated code]*/
1688
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001689static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001690float___getformat___impl(PyTypeObject *type, const char *typestr)
1691/*[clinic end generated code: output=2bfb987228cc9628 input=d5a52600f835ad67]*/
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 float_format_type r;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001694
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001695 if (strcmp(typestr, "double") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 r = double_format;
1697 }
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001698 else if (strcmp(typestr, "float") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 r = float_format;
1700 }
1701 else {
1702 PyErr_SetString(PyExc_ValueError,
1703 "__getformat__() argument 1 must be "
1704 "'double' or 'float'");
1705 return NULL;
1706 }
1707
1708 switch (r) {
1709 case unknown_format:
1710 return PyUnicode_FromString("unknown");
1711 case ieee_little_endian_format:
1712 return PyUnicode_FromString("IEEE, little-endian");
1713 case ieee_big_endian_format:
1714 return PyUnicode_FromString("IEEE, big-endian");
1715 default:
Victor Stinner04394df2019-11-18 17:39:48 +01001716 PyErr_SetString(PyExc_RuntimeError,
1717 "insane float_format or double_format");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 return NULL;
1719 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001720}
1721
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001722/*[clinic input]
1723@classmethod
1724float.__set_format__
1725
1726 typestr: str
1727 Must be 'double' or 'float'.
1728 fmt: str
1729 Must be one of 'unknown', 'IEEE, big-endian' or 'IEEE, little-endian',
1730 and in addition can only be one of the latter two if it appears to
1731 match the underlying C reality.
1732 /
1733
1734You probably don't want to use this function.
1735
1736It exists mainly to be used in Python's test suite.
1737
1738Override the automatic determination of C-level floating point type.
1739This affects how floats are converted to and from binary strings.
1740[clinic start generated code]*/
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001741
1742static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001743float___set_format___impl(PyTypeObject *type, const char *typestr,
1744 const char *fmt)
1745/*[clinic end generated code: output=504460f5dc85acbd input=5306fa2b81a997e4]*/
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 float_format_type f;
1748 float_format_type detected;
1749 float_format_type *p;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 if (strcmp(typestr, "double") == 0) {
1752 p = &double_format;
1753 detected = detected_double_format;
1754 }
1755 else if (strcmp(typestr, "float") == 0) {
1756 p = &float_format;
1757 detected = detected_float_format;
1758 }
1759 else {
1760 PyErr_SetString(PyExc_ValueError,
1761 "__setformat__() argument 1 must "
1762 "be 'double' or 'float'");
1763 return NULL;
1764 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001765
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001766 if (strcmp(fmt, "unknown") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 f = unknown_format;
1768 }
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001769 else if (strcmp(fmt, "IEEE, little-endian") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 f = ieee_little_endian_format;
1771 }
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001772 else if (strcmp(fmt, "IEEE, big-endian") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 f = ieee_big_endian_format;
1774 }
1775 else {
1776 PyErr_SetString(PyExc_ValueError,
1777 "__setformat__() argument 2 must be "
1778 "'unknown', 'IEEE, little-endian' or "
1779 "'IEEE, big-endian'");
1780 return NULL;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 if (f != unknown_format && f != detected) {
1785 PyErr_Format(PyExc_ValueError,
1786 "can only set %s format to 'unknown' or the "
1787 "detected platform value", typestr);
1788 return NULL;
1789 }
1790
1791 *p = f;
1792 Py_RETURN_NONE;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001793}
1794
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001795static PyObject *
1796float_getreal(PyObject *v, void *closure)
1797{
1798 return float_float(v);
1799}
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001800
Guido van Rossumb43daf72007-08-01 18:08:08 +00001801static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001802float_getimag(PyObject *v, void *closure)
Guido van Rossumb43daf72007-08-01 18:08:08 +00001803{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 return PyFloat_FromDouble(0.0);
Guido van Rossumb43daf72007-08-01 18:08:08 +00001805}
1806
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001807/*[clinic input]
1808float.__format__
1809
1810 format_spec: unicode
1811 /
1812
1813Formats the float according to format_spec.
1814[clinic start generated code]*/
1815
Eric Smith8c663262007-08-25 02:26:07 +00001816static PyObject *
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001817float___format___impl(PyObject *self, PyObject *format_spec)
1818/*[clinic end generated code: output=b260e52a47eade56 input=2ece1052211fd0e6]*/
Eric Smith8c663262007-08-25 02:26:07 +00001819{
Victor Stinnerd3f08822012-05-29 12:57:52 +02001820 _PyUnicodeWriter writer;
1821 int ret;
Eric Smith4a7d76d2008-05-30 18:10:19 +00001822
Victor Stinner8f674cc2013-04-17 23:02:17 +02001823 _PyUnicodeWriter_Init(&writer);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001824 ret = _PyFloat_FormatAdvancedWriter(
1825 &writer,
1826 self,
1827 format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
1828 if (ret == -1) {
1829 _PyUnicodeWriter_Dealloc(&writer);
1830 return NULL;
1831 }
1832 return _PyUnicodeWriter_Finish(&writer);
Eric Smith8c663262007-08-25 02:26:07 +00001833}
1834
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001835static PyMethodDef float_methods[] = {
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001836 FLOAT_CONJUGATE_METHODDEF
1837 FLOAT___TRUNC___METHODDEF
Batuhan Taşkayacb8b9462019-12-16 01:00:28 +03001838 FLOAT___FLOOR___METHODDEF
1839 FLOAT___CEIL___METHODDEF
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001840 FLOAT___ROUND___METHODDEF
1841 FLOAT_AS_INTEGER_RATIO_METHODDEF
1842 FLOAT_FROMHEX_METHODDEF
1843 FLOAT_HEX_METHODDEF
1844 FLOAT_IS_INTEGER_METHODDEF
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001845 FLOAT___GETNEWARGS___METHODDEF
1846 FLOAT___GETFORMAT___METHODDEF
1847 FLOAT___SET_FORMAT___METHODDEF
1848 FLOAT___FORMAT___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 {NULL, NULL} /* sentinel */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001850};
1851
Guido van Rossumb43daf72007-08-01 18:08:08 +00001852static PyGetSetDef float_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 {"real",
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001854 float_getreal, (setter)NULL,
Guido van Rossumb43daf72007-08-01 18:08:08 +00001855 "the real part of a complex number",
1856 NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 {"imag",
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001858 float_getimag, (setter)NULL,
Guido van Rossumb43daf72007-08-01 18:08:08 +00001859 "the imaginary part of a complex number",
1860 NULL},
1861 {NULL} /* Sentinel */
1862};
1863
Tim Peters6d6c1a32001-08-02 04:15:00 +00001864
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001865static PyNumberMethods float_as_number = {
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001866 float_add, /* nb_add */
1867 float_sub, /* nb_subtract */
1868 float_mul, /* nb_multiply */
1869 float_rem, /* nb_remainder */
1870 float_divmod, /* nb_divmod */
1871 float_pow, /* nb_power */
1872 (unaryfunc)float_neg, /* nb_negative */
1873 float_float, /* nb_positive */
1874 (unaryfunc)float_abs, /* nb_absolute */
1875 (inquiry)float_bool, /* nb_bool */
1876 0, /* nb_invert */
1877 0, /* nb_lshift */
1878 0, /* nb_rshift */
1879 0, /* nb_and */
1880 0, /* nb_xor */
1881 0, /* nb_or */
1882 float___trunc___impl, /* nb_int */
1883 0, /* nb_reserved */
1884 float_float, /* nb_float */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 0, /* nb_inplace_add */
1886 0, /* nb_inplace_subtract */
1887 0, /* nb_inplace_multiply */
1888 0, /* nb_inplace_remainder */
1889 0, /* nb_inplace_power */
1890 0, /* nb_inplace_lshift */
1891 0, /* nb_inplace_rshift */
1892 0, /* nb_inplace_and */
1893 0, /* nb_inplace_xor */
1894 0, /* nb_inplace_or */
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001895 float_floor_div, /* nb_floor_divide */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 float_div, /* nb_true_divide */
1897 0, /* nb_inplace_floor_divide */
1898 0, /* nb_inplace_true_divide */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001899};
1900
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001901PyTypeObject PyFloat_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1903 "float",
1904 sizeof(PyFloatObject),
1905 0,
1906 (destructor)float_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001907 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 0, /* tp_getattr */
1909 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001910 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 (reprfunc)float_repr, /* tp_repr */
1912 &float_as_number, /* tp_as_number */
1913 0, /* tp_as_sequence */
1914 0, /* tp_as_mapping */
1915 (hashfunc)float_hash, /* tp_hash */
1916 0, /* tp_call */
Serhiy Storchaka96aeaec2019-05-06 22:29:40 +03001917 0, /* tp_str */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 PyObject_GenericGetAttr, /* tp_getattro */
1919 0, /* tp_setattro */
1920 0, /* tp_as_buffer */
Serhiy Storchakab5c51d32017-03-11 09:21:05 +02001921 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02001922 float_new__doc__, /* tp_doc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 0, /* tp_traverse */
1924 0, /* tp_clear */
1925 float_richcompare, /* tp_richcompare */
1926 0, /* tp_weaklistoffset */
1927 0, /* tp_iter */
1928 0, /* tp_iternext */
1929 float_methods, /* tp_methods */
1930 0, /* tp_members */
1931 float_getset, /* tp_getset */
1932 0, /* tp_base */
1933 0, /* tp_dict */
1934 0, /* tp_descr_get */
1935 0, /* tp_descr_set */
1936 0, /* tp_dictoffset */
1937 0, /* tp_init */
1938 0, /* tp_alloc */
1939 float_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001940};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001941
Victor Stinner1c8f0592013-07-22 22:24:54 +02001942int
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001943_PyFloat_Init(void)
1944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945 /* We attempt to determine if this machine is using IEEE
1946 floating point formats by peering at the bits of some
1947 carefully chosen values. If it looks like we are on an
1948 IEEE platform, the float packing/unpacking routines can
1949 just copy bits, if not they resort to arithmetic & shifts
1950 and masks. The shifts & masks approach works on all finite
1951 values, but what happens to infinities, NaNs and signed
1952 zeroes on packing is an accident, and attempting to unpack
1953 a NaN or an infinity will raise an exception.
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 Note that if we're on some whacked-out platform which uses
1956 IEEE formats but isn't strictly little-endian or big-
1957 endian, we will fall back to the portable shifts & masks
1958 method. */
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001959
1960#if SIZEOF_DOUBLE == 8
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 {
1962 double x = 9006104071832581.0;
1963 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
1964 detected_double_format = ieee_big_endian_format;
1965 else if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
1966 detected_double_format = ieee_little_endian_format;
1967 else
1968 detected_double_format = unknown_format;
1969 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001970#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 detected_double_format = unknown_format;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001972#endif
1973
1974#if SIZEOF_FLOAT == 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 {
1976 float y = 16711938.0;
1977 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
1978 detected_float_format = ieee_big_endian_format;
1979 else if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
1980 detected_float_format = ieee_little_endian_format;
1981 else
1982 detected_float_format = unknown_format;
1983 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001984#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 detected_float_format = unknown_format;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001986#endif
1987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 double_format = detected_double_format;
1989 float_format = detected_float_format;
Christian Heimesb76922a2007-12-11 01:06:40 +00001990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 /* Init float info */
Victor Stinner1c8f0592013-07-22 22:24:54 +02001992 if (FloatInfoType.tp_name == NULL) {
Victor Stinner6d43f6f2019-01-22 21:18:05 +01001993 if (PyStructSequence_InitType2(&FloatInfoType, &floatinfo_desc) < 0) {
Victor Stinner1c8f0592013-07-22 22:24:54 +02001994 return 0;
Victor Stinner6d43f6f2019-01-22 21:18:05 +01001995 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02001996 }
1997 return 1;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00001998}
1999
Georg Brandl2ee470f2008-07-16 12:55:28 +00002000int
2001PyFloat_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00002002{
Kristján Valur Jónssondaa06542012-03-30 09:18:15 +00002003 PyFloatObject *f = free_list, *next;
2004 int i = numfree;
2005 while (f) {
2006 next = (PyFloatObject*) Py_TYPE(f);
2007 PyObject_FREE(f);
2008 f = next;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 }
Kristján Valur Jónssondaa06542012-03-30 09:18:15 +00002010 free_list = NULL;
2011 numfree = 0;
2012 return i;
Christian Heimes15ebc882008-02-04 18:48:49 +00002013}
2014
2015void
Victor Stinnerbed48172019-08-27 00:12:32 +02002016_PyFloat_Fini(void)
Christian Heimes15ebc882008-02-04 18:48:49 +00002017{
Kristján Valur Jónssondaa06542012-03-30 09:18:15 +00002018 (void)PyFloat_ClearFreeList();
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00002019}
Tim Peters9905b942003-03-20 20:53:32 +00002020
David Malcolm49526f42012-06-22 14:55:41 -04002021/* Print summary info about the state of the optimized allocator */
2022void
2023_PyFloat_DebugMallocStats(FILE *out)
2024{
2025 _PyDebugAllocatorStats(out,
2026 "free PyFloatObject",
2027 numfree, sizeof(PyFloatObject));
2028}
2029
2030
Tim Peters9905b942003-03-20 20:53:32 +00002031/*----------------------------------------------------------------------------
Mark Dickinson7c4e4092016-09-03 17:21:29 +01002032 * _PyFloat_{Pack,Unpack}{2,4,8}. See floatobject.h.
2033 * To match the NPY_HALF_ROUND_TIES_TO_EVEN behavior in:
2034 * https://github.com/numpy/numpy/blob/master/numpy/core/src/npymath/halffloat.c
2035 * We use:
2036 * bits = (unsigned short)f; Note the truncation
2037 * if ((f - bits > 0.5) || (f - bits == 0.5 && bits % 2)) {
2038 * bits++;
2039 * }
Tim Peters9905b942003-03-20 20:53:32 +00002040 */
Mark Dickinson7c4e4092016-09-03 17:21:29 +01002041
2042int
2043_PyFloat_Pack2(double x, unsigned char *p, int le)
2044{
2045 unsigned char sign;
2046 int e;
2047 double f;
2048 unsigned short bits;
2049 int incr = 1;
2050
2051 if (x == 0.0) {
2052 sign = (copysign(1.0, x) == -1.0);
2053 e = 0;
2054 bits = 0;
2055 }
2056 else if (Py_IS_INFINITY(x)) {
2057 sign = (x < 0.0);
2058 e = 0x1f;
2059 bits = 0;
2060 }
2061 else if (Py_IS_NAN(x)) {
2062 /* There are 2046 distinct half-precision NaNs (1022 signaling and
2063 1024 quiet), but there are only two quiet NaNs that don't arise by
2064 quieting a signaling NaN; we get those by setting the topmost bit
2065 of the fraction field and clearing all other fraction bits. We
2066 choose the one with the appropriate sign. */
2067 sign = (copysign(1.0, x) == -1.0);
2068 e = 0x1f;
2069 bits = 512;
2070 }
2071 else {
2072 sign = (x < 0.0);
2073 if (sign) {
2074 x = -x;
2075 }
2076
2077 f = frexp(x, &e);
2078 if (f < 0.5 || f >= 1.0) {
2079 PyErr_SetString(PyExc_SystemError,
2080 "frexp() result out of range");
2081 return -1;
2082 }
2083
2084 /* Normalize f to be in the range [1.0, 2.0) */
2085 f *= 2.0;
2086 e--;
2087
2088 if (e >= 16) {
2089 goto Overflow;
2090 }
2091 else if (e < -25) {
2092 /* |x| < 2**-25. Underflow to zero. */
2093 f = 0.0;
2094 e = 0;
2095 }
2096 else if (e < -14) {
2097 /* |x| < 2**-14. Gradual underflow */
2098 f = ldexp(f, 14 + e);
2099 e = 0;
2100 }
2101 else /* if (!(e == 0 && f == 0.0)) */ {
2102 e += 15;
2103 f -= 1.0; /* Get rid of leading 1 */
2104 }
2105
2106 f *= 1024.0; /* 2**10 */
2107 /* Round to even */
2108 bits = (unsigned short)f; /* Note the truncation */
2109 assert(bits < 1024);
2110 assert(e < 31);
2111 if ((f - bits > 0.5) || ((f - bits == 0.5) && (bits % 2 == 1))) {
2112 ++bits;
2113 if (bits == 1024) {
2114 /* The carry propagated out of a string of 10 1 bits. */
2115 bits = 0;
2116 ++e;
2117 if (e == 31)
2118 goto Overflow;
2119 }
2120 }
2121 }
2122
2123 bits |= (e << 10) | (sign << 15);
2124
2125 /* Write out result. */
2126 if (le) {
2127 p += 1;
2128 incr = -1;
2129 }
2130
2131 /* First byte */
2132 *p = (unsigned char)((bits >> 8) & 0xFF);
2133 p += incr;
2134
2135 /* Second byte */
2136 *p = (unsigned char)(bits & 0xFF);
2137
2138 return 0;
2139
2140 Overflow:
2141 PyErr_SetString(PyExc_OverflowError,
2142 "float too large to pack with e format");
2143 return -1;
2144}
2145
Tim Peters9905b942003-03-20 20:53:32 +00002146int
2147_PyFloat_Pack4(double x, unsigned char *p, int le)
2148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 if (float_format == unknown_format) {
2150 unsigned char sign;
2151 int e;
2152 double f;
2153 unsigned int fbits;
2154 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 if (le) {
2157 p += 3;
2158 incr = -1;
2159 }
Tim Peters9905b942003-03-20 20:53:32 +00002160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 if (x < 0) {
2162 sign = 1;
2163 x = -x;
2164 }
2165 else
2166 sign = 0;
Tim Peters9905b942003-03-20 20:53:32 +00002167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 f = frexp(x, &e);
Tim Peters9905b942003-03-20 20:53:32 +00002169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 /* Normalize f to be in the range [1.0, 2.0) */
2171 if (0.5 <= f && f < 1.0) {
2172 f *= 2.0;
2173 e--;
2174 }
2175 else if (f == 0.0)
2176 e = 0;
2177 else {
2178 PyErr_SetString(PyExc_SystemError,
2179 "frexp() result out of range");
2180 return -1;
2181 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 if (e >= 128)
2184 goto Overflow;
2185 else if (e < -126) {
2186 /* Gradual underflow */
2187 f = ldexp(f, 126 + e);
2188 e = 0;
2189 }
2190 else if (!(e == 0 && f == 0.0)) {
2191 e += 127;
2192 f -= 1.0; /* Get rid of leading 1 */
2193 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 f *= 8388608.0; /* 2**23 */
2196 fbits = (unsigned int)(f + 0.5); /* Round */
2197 assert(fbits <= 8388608);
2198 if (fbits >> 23) {
2199 /* The carry propagated out of a string of 23 1 bits. */
2200 fbits = 0;
2201 ++e;
2202 if (e >= 255)
2203 goto Overflow;
2204 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 /* First byte */
2207 *p = (sign << 7) | (e >> 1);
2208 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 /* Second byte */
2211 *p = (char) (((e & 1) << 7) | (fbits >> 16));
2212 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 /* Third byte */
2215 *p = (fbits >> 8) & 0xFF;
2216 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 /* Fourth byte */
2219 *p = fbits & 0xFF;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 /* Done */
2222 return 0;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 }
2225 else {
Benjamin Peterson2bb69a52017-09-10 23:50:46 -07002226 float y = (float)x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 int i, incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002228
Benjamin Peterson2bb69a52017-09-10 23:50:46 -07002229 if (Py_IS_INFINITY(y) && !Py_IS_INFINITY(x))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 goto Overflow;
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002231
Benjamin Petersona853a8b2017-09-07 11:13:59 -07002232 unsigned char s[sizeof(float)];
Benjamin Petersona853a8b2017-09-07 11:13:59 -07002233 memcpy(s, &y, sizeof(float));
2234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002235 if ((float_format == ieee_little_endian_format && !le)
2236 || (float_format == ieee_big_endian_format && le)) {
2237 p += 3;
2238 incr = -1;
2239 }
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 for (i = 0; i < 4; i++) {
Benjamin Petersona853a8b2017-09-07 11:13:59 -07002242 *p = s[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 p += incr;
2244 }
2245 return 0;
2246 }
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002247 Overflow:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 PyErr_SetString(PyExc_OverflowError,
2249 "float too large to pack with f format");
2250 return -1;
Tim Peters9905b942003-03-20 20:53:32 +00002251}
2252
2253int
2254_PyFloat_Pack8(double x, unsigned char *p, int le)
2255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 if (double_format == unknown_format) {
2257 unsigned char sign;
2258 int e;
2259 double f;
2260 unsigned int fhi, flo;
2261 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 if (le) {
2264 p += 7;
2265 incr = -1;
2266 }
Tim Peters9905b942003-03-20 20:53:32 +00002267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 if (x < 0) {
2269 sign = 1;
2270 x = -x;
2271 }
2272 else
2273 sign = 0;
Tim Peters9905b942003-03-20 20:53:32 +00002274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 f = frexp(x, &e);
Tim Peters9905b942003-03-20 20:53:32 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 /* Normalize f to be in the range [1.0, 2.0) */
2278 if (0.5 <= f && f < 1.0) {
2279 f *= 2.0;
2280 e--;
2281 }
2282 else if (f == 0.0)
2283 e = 0;
2284 else {
2285 PyErr_SetString(PyExc_SystemError,
2286 "frexp() result out of range");
2287 return -1;
2288 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 if (e >= 1024)
2291 goto Overflow;
2292 else if (e < -1022) {
2293 /* Gradual underflow */
2294 f = ldexp(f, 1022 + e);
2295 e = 0;
2296 }
2297 else if (!(e == 0 && f == 0.0)) {
2298 e += 1023;
2299 f -= 1.0; /* Get rid of leading 1 */
2300 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 /* fhi receives the high 28 bits; flo the low 24 bits (== 52 bits) */
2303 f *= 268435456.0; /* 2**28 */
2304 fhi = (unsigned int)f; /* Truncate */
2305 assert(fhi < 268435456);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 f -= (double)fhi;
2308 f *= 16777216.0; /* 2**24 */
2309 flo = (unsigned int)(f + 0.5); /* Round */
2310 assert(flo <= 16777216);
2311 if (flo >> 24) {
2312 /* The carry propagated out of a string of 24 1 bits. */
2313 flo = 0;
2314 ++fhi;
2315 if (fhi >> 28) {
2316 /* And it also progagated out of the next 28 bits. */
2317 fhi = 0;
2318 ++e;
2319 if (e >= 2047)
2320 goto Overflow;
2321 }
2322 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 /* First byte */
2325 *p = (sign << 7) | (e >> 4);
2326 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 /* Second byte */
2329 *p = (unsigned char) (((e & 0xF) << 4) | (fhi >> 24));
2330 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 /* Third byte */
2333 *p = (fhi >> 16) & 0xFF;
2334 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 /* Fourth byte */
2337 *p = (fhi >> 8) & 0xFF;
2338 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 /* Fifth byte */
2341 *p = fhi & 0xFF;
2342 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 /* Sixth byte */
2345 *p = (flo >> 16) & 0xFF;
2346 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 /* Seventh byte */
2349 *p = (flo >> 8) & 0xFF;
2350 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 /* Eighth byte */
2353 *p = flo & 0xFF;
Brett Cannonb94767f2011-02-22 20:15:44 +00002354 /* p += incr; */
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 /* Done */
2357 return 0;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002359 Overflow:
2360 PyErr_SetString(PyExc_OverflowError,
2361 "float too large to pack with d format");
2362 return -1;
2363 }
2364 else {
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002365 const unsigned char *s = (unsigned char*)&x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 int i, incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 if ((double_format == ieee_little_endian_format && !le)
2369 || (double_format == ieee_big_endian_format && le)) {
2370 p += 7;
2371 incr = -1;
2372 }
2373
2374 for (i = 0; i < 8; i++) {
2375 *p = *s++;
2376 p += incr;
2377 }
2378 return 0;
2379 }
Tim Peters9905b942003-03-20 20:53:32 +00002380}
2381
2382double
Mark Dickinson7c4e4092016-09-03 17:21:29 +01002383_PyFloat_Unpack2(const unsigned char *p, int le)
2384{
2385 unsigned char sign;
2386 int e;
2387 unsigned int f;
2388 double x;
2389 int incr = 1;
2390
2391 if (le) {
2392 p += 1;
2393 incr = -1;
2394 }
2395
2396 /* First byte */
2397 sign = (*p >> 7) & 1;
2398 e = (*p & 0x7C) >> 2;
2399 f = (*p & 0x03) << 8;
2400 p += incr;
2401
2402 /* Second byte */
2403 f |= *p;
2404
2405 if (e == 0x1f) {
2406#ifdef PY_NO_SHORT_FLOAT_REPR
2407 if (f == 0) {
2408 /* Infinity */
2409 return sign ? -Py_HUGE_VAL : Py_HUGE_VAL;
2410 }
2411 else {
2412 /* NaN */
2413#ifdef Py_NAN
2414 return sign ? -Py_NAN : Py_NAN;
2415#else
2416 PyErr_SetString(
2417 PyExc_ValueError,
2418 "can't unpack IEEE 754 NaN "
2419 "on platform that does not support NaNs");
2420 return -1;
2421#endif /* #ifdef Py_NAN */
2422 }
2423#else
2424 if (f == 0) {
2425 /* Infinity */
2426 return _Py_dg_infinity(sign);
2427 }
2428 else {
2429 /* NaN */
2430 return _Py_dg_stdnan(sign);
2431 }
2432#endif /* #ifdef PY_NO_SHORT_FLOAT_REPR */
2433 }
2434
2435 x = (double)f / 1024.0;
2436
2437 if (e == 0) {
2438 e = -14;
2439 }
2440 else {
2441 x += 1.0;
2442 e -= 15;
2443 }
2444 x = ldexp(x, e);
2445
2446 if (sign)
2447 x = -x;
2448
2449 return x;
2450}
2451
2452double
Tim Peters9905b942003-03-20 20:53:32 +00002453_PyFloat_Unpack4(const unsigned char *p, int le)
2454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 if (float_format == unknown_format) {
2456 unsigned char sign;
2457 int e;
2458 unsigned int f;
2459 double x;
2460 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 if (le) {
2463 p += 3;
2464 incr = -1;
2465 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 /* First byte */
2468 sign = (*p >> 7) & 1;
2469 e = (*p & 0x7F) << 1;
2470 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 /* Second byte */
2473 e |= (*p >> 7) & 1;
2474 f = (*p & 0x7F) << 16;
2475 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002477 if (e == 255) {
2478 PyErr_SetString(
2479 PyExc_ValueError,
2480 "can't unpack IEEE 754 special value "
2481 "on non-IEEE platform");
2482 return -1;
2483 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 /* Third byte */
2486 f |= *p << 8;
2487 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 /* Fourth byte */
2490 f |= *p;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 x = (double)f / 8388608.0;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 /* XXX This sadly ignores Inf/NaN issues */
2495 if (e == 0)
2496 e = -126;
2497 else {
2498 x += 1.0;
2499 e -= 127;
2500 }
2501 x = ldexp(x, e);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 if (sign)
2504 x = -x;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002506 return x;
2507 }
2508 else {
2509 float x;
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 if ((float_format == ieee_little_endian_format && !le)
2512 || (float_format == ieee_big_endian_format && le)) {
2513 char buf[4];
2514 char *d = &buf[3];
2515 int i;
Tim Peters9905b942003-03-20 20:53:32 +00002516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 for (i = 0; i < 4; i++) {
2518 *d-- = *p++;
2519 }
2520 memcpy(&x, buf, 4);
2521 }
2522 else {
2523 memcpy(&x, p, 4);
2524 }
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 return x;
2527 }
Tim Peters9905b942003-03-20 20:53:32 +00002528}
2529
2530double
2531_PyFloat_Unpack8(const unsigned char *p, int le)
2532{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 if (double_format == unknown_format) {
2534 unsigned char sign;
2535 int e;
2536 unsigned int fhi, flo;
2537 double x;
2538 int incr = 1;
Tim Peters9905b942003-03-20 20:53:32 +00002539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002540 if (le) {
2541 p += 7;
2542 incr = -1;
2543 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 /* First byte */
2546 sign = (*p >> 7) & 1;
2547 e = (*p & 0x7F) << 4;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 /* Second byte */
2552 e |= (*p >> 4) & 0xF;
2553 fhi = (*p & 0xF) << 24;
2554 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 if (e == 2047) {
2557 PyErr_SetString(
2558 PyExc_ValueError,
2559 "can't unpack IEEE 754 special value "
2560 "on non-IEEE platform");
2561 return -1.0;
2562 }
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 /* Third byte */
2565 fhi |= *p << 16;
2566 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 /* Fourth byte */
2569 fhi |= *p << 8;
2570 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 /* Fifth byte */
2573 fhi |= *p;
2574 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002576 /* Sixth byte */
2577 flo = *p << 16;
2578 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002580 /* Seventh byte */
2581 flo |= *p << 8;
2582 p += incr;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 /* Eighth byte */
2585 flo |= *p;
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2588 x /= 268435456.0; /* 2**28 */
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 if (e == 0)
2591 e = -1022;
2592 else {
2593 x += 1.0;
2594 e -= 1023;
2595 }
2596 x = ldexp(x, e);
Michael W. Hudsonba283e22005-05-27 15:23:20 +00002597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002598 if (sign)
2599 x = -x;
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002601 return x;
2602 }
2603 else {
2604 double x;
Michael W. Hudsonb78a5fc2005-12-05 00:27:49 +00002605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 if ((double_format == ieee_little_endian_format && !le)
2607 || (double_format == ieee_big_endian_format && le)) {
2608 char buf[8];
2609 char *d = &buf[7];
2610 int i;
2611
2612 for (i = 0; i < 8; i++) {
2613 *d-- = *p++;
2614 }
2615 memcpy(&x, buf, 8);
2616 }
2617 else {
2618 memcpy(&x, p, 8);
2619 }
2620
2621 return x;
2622 }
Tim Peters9905b942003-03-20 20:53:32 +00002623}