Mercurial > cpython-lru_cache-weakref
annotate Objects/floatobject.c @ 76370:00a07720a570
Issue #14599: Fix an import caching race condition.
| author | Brett Cannon <brett@python.org> |
|---|---|
| date | Mon, 16 Apr 2012 20:50:33 -0400 |
| parents | 37ebe64d39d2 |
| children | 22b56b0b8619 |
| rev | line source |
|---|---|
| 145 | 1 |
| 6 | 2 /* Float object implementation */ |
| 3 | |
| 27 | 4 /* XXX There should be overflow checks here, but it's hard to check |
| 5 for any kind of float exception without losing portability. */ | |
| 6 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
7 #include "Python.h" |
| 6 | 8 |
| 86 | 9 #include <ctype.h> |
|
44086
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
10 #include <float.h> |
| 6 | 11 |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
12 #undef MAX |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
13 #undef MIN |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
14 #define MAX(x, y) ((x) < (y) ? (y) : (x)) |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
15 #define MIN(x, y) ((x) < (y) ? (x) : (y)) |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
16 |
|
60
4f593b38d061
Moved prototyes for fmod and pow, and don't use them for THINK C.
Guido van Rossum <guido@python.org>
parents:
46
diff
changeset
|
17 |
|
62558
ec0fd5a6bb45
Issue #9089: Remove references to intobject.c and intobject.h from comments.
Mark Dickinson <dickinsm@gmail.com>
parents:
61466
diff
changeset
|
18 /* Special free list |
|
ec0fd5a6bb45
Issue #9089: Remove references to intobject.c and intobject.h from comments.
Mark Dickinson <dickinsm@gmail.com>
parents:
61466
diff
changeset
|
19 free_list is a singly-linked list of available PyFloatObjects, linked |
|
ec0fd5a6bb45
Issue #9089: Remove references to intobject.c and intobject.h from comments.
Mark Dickinson <dickinsm@gmail.com>
parents:
61466
diff
changeset
|
20 via abuse of their ob_type members. |
|
ec0fd5a6bb45
Issue #9089: Remove references to intobject.c and intobject.h from comments.
Mark Dickinson <dickinsm@gmail.com>
parents:
61466
diff
changeset
|
21 */ |
|
ec0fd5a6bb45
Issue #9089: Remove references to intobject.c and intobject.h from comments.
Mark Dickinson <dickinsm@gmail.com>
parents:
61466
diff
changeset
|
22 |
|
75993
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
23 #ifndef PyFloat_MAXFREELIST |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
24 #define PyFloat_MAXFREELIST 100 |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
25 #endif |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
26 static int numfree = 0; |
|
10391
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
27 static PyFloatObject *free_list = NULL; |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
28 |
|
44086
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
29 double |
|
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
30 PyFloat_GetMax(void) |
|
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
31 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
32 return DBL_MAX; |
|
44086
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
33 } |
|
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
34 |
|
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
35 double |
|
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
36 PyFloat_GetMin(void) |
|
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
37 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
38 return DBL_MIN; |
|
44086
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
39 } |
|
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
40 |
|
44674
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
41 static PyTypeObject FloatInfoType; |
|
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
42 |
|
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
43 PyDoc_STRVAR(floatinfo__doc__, |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54232
diff
changeset
|
44 "sys.float_info\n\ |
|
44674
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
45 \n\ |
|
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
46 A structseq holding information about the float type. It contains low level\n\ |
|
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
47 information about the precision and internal representation. Please study\n\ |
|
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
48 your system's :file:`float.h` for more information."); |
|
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
49 |
|
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
50 static PyStructSequence_Field floatinfo_fields[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
51 {"max", "DBL_MAX -- maximum representable finite float"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
52 {"max_exp", "DBL_MAX_EXP -- maximum int e such that radix**(e-1) " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
53 "is representable"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
54 {"max_10_exp", "DBL_MAX_10_EXP -- maximum int e such that 10**e " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
55 "is representable"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
56 {"min", "DBL_MIN -- Minimum positive normalizer float"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
57 {"min_exp", "DBL_MIN_EXP -- minimum int e such that radix**(e-1) " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
58 "is a normalized float"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
59 {"min_10_exp", "DBL_MIN_10_EXP -- minimum int e such that 10**e is " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
60 "a normalized"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
61 {"dig", "DBL_DIG -- digits"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
62 {"mant_dig", "DBL_MANT_DIG -- mantissa digits"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
63 {"epsilon", "DBL_EPSILON -- Difference between 1 and the next " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
64 "representable float"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
65 {"radix", "FLT_RADIX -- radix of exponent"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
66 {"rounds", "FLT_ROUNDS -- addition rounds"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
67 {0} |
|
44674
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
68 }; |
|
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
69 |
|
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
70 static PyStructSequence_Desc floatinfo_desc = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
71 "sys.float_info", /* name */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
72 floatinfo__doc__, /* doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
73 floatinfo_fields, /* fields */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
74 11 |
|
44674
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
75 }; |
|
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
76 |
|
44086
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
77 PyObject * |
|
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
78 PyFloat_GetInfo(void) |
|
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
79 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
80 PyObject* floatinfo; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
81 int pos = 0; |
|
44086
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
82 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
83 floatinfo = PyStructSequence_New(&FloatInfoType); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
84 if (floatinfo == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
85 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
86 } |
|
44086
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
87 |
|
44674
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
88 #define SetIntFlag(flag) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
89 PyStructSequence_SET_ITEM(floatinfo, pos++, PyLong_FromLong(flag)) |
|
44674
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
90 #define SetDblFlag(flag) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
91 PyStructSequence_SET_ITEM(floatinfo, pos++, PyFloat_FromDouble(flag)) |
|
44086
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
92 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
93 SetDblFlag(DBL_MAX); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
94 SetIntFlag(DBL_MAX_EXP); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
95 SetIntFlag(DBL_MAX_10_EXP); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
96 SetDblFlag(DBL_MIN); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
97 SetIntFlag(DBL_MIN_EXP); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
98 SetIntFlag(DBL_MIN_10_EXP); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
99 SetIntFlag(DBL_DIG); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
100 SetIntFlag(DBL_MANT_DIG); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
101 SetDblFlag(DBL_EPSILON); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
102 SetIntFlag(FLT_RADIX); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
103 SetIntFlag(FLT_ROUNDS); |
|
44674
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
104 #undef SetIntFlag |
|
1154158a199f
Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
105 #undef SetDblFlag |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
106 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
107 if (PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
108 Py_CLEAR(floatinfo); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
109 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
110 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
111 return floatinfo; |
|
44086
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
112 } |
|
110ff614ec28
Merged revisions 59245-59254 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
113 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
114 PyObject * |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
115 PyFloat_FromDouble(double fval) |
| 6 | 116 { |
|
75993
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
117 register PyFloatObject *op = free_list; |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
118 if (op != NULL) { |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
119 free_list = (PyFloatObject *) Py_TYPE(op); |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
120 numfree--; |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
121 } else { |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
122 op = (PyFloatObject*) PyObject_MALLOC(sizeof(PyFloatObject)); |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
123 if (!op) |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
124 return PyErr_NoMemory(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
125 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
126 /* Inline PyObject_New */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
127 PyObject_INIT(op, &PyFloat_Type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
128 op->ob_fval = fval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
129 return (PyObject *) op; |
| 6 | 130 } |
| 131 | |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
132 PyObject * |
|
41229
1f843890a4e6
Remove the deprecated and useless "pend" argument from
Georg Brandl <georg@python.org>
parents:
40626
diff
changeset
|
133 PyFloat_FromString(PyObject *v) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
134 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
135 const char *s, *last, *end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
136 double x; |
|
66673
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
137 PyObject *s_buffer = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
138 Py_ssize_t len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
139 PyObject *result = NULL; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
140 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
141 if (PyUnicode_Check(v)) { |
| 72475 | 142 s_buffer = _PyUnicode_TransformDecimalAndSpaceToASCII(v); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
143 if (s_buffer == NULL) |
|
66673
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
144 return NULL; |
| 72475 | 145 s = PyUnicode_AsUTF8AndSize(s_buffer, &len); |
|
66673
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
146 if (s == NULL) { |
|
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
147 Py_DECREF(s_buffer); |
|
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
148 return NULL; |
|
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
149 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
150 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
151 else if (PyObject_AsCharBuffer(v, &s, &len)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
152 PyErr_SetString(PyExc_TypeError, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
153 "float() argument must be a string or a number"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
154 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
155 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
156 last = s + len; |
|
66673
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
157 /* strip space */ |
|
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
158 while (s < last && Py_ISSPACE(*s)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
159 s++; |
|
66673
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
160 while (s < last - 1 && Py_ISSPACE(last[-1])) |
|
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
161 last--; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
162 /* We don't care about overflow or underflow. If the platform |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
163 * supports them, infinities and signed zeroes (on underflow) are |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
164 * fine. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
165 x = PyOS_string_to_double(s, (char **)&end, NULL); |
|
66673
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
166 if (end != last) { |
|
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
167 PyErr_Format(PyExc_ValueError, |
|
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
168 "could not convert string to float: " |
|
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
169 "%R", v); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
170 result = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
171 } |
|
66673
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
172 else if (x == -1.0 && PyErr_Occurred()) |
|
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
173 result = NULL; |
|
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
174 else |
|
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
175 result = PyFloat_FromDouble(x); |
|
53707
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53468
diff
changeset
|
176 |
|
66673
7b6af56ee74d
Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66555
diff
changeset
|
177 Py_XDECREF(s_buffer); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
178 return result; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
179 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
180 |
|
1313
6ee380349c84
* Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents:
1271
diff
changeset
|
181 static void |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
182 float_dealloc(PyFloatObject *op) |
|
745
c7b23cc8cded
answer lint's complaints
Guido van Rossum <guido@python.org>
parents:
632
diff
changeset
|
183 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
184 if (PyFloat_CheckExact(op)) { |
|
75993
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
185 if (numfree >= PyFloat_MAXFREELIST) { |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
186 PyObject_FREE(op); |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
187 return; |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
188 } |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
189 numfree++; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
190 Py_TYPE(op) = (struct _typeobject *)free_list; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
191 free_list = op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
192 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
193 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
194 Py_TYPE(op)->tp_free((PyObject *)op); |
|
745
c7b23cc8cded
answer lint's complaints
Guido van Rossum <guido@python.org>
parents:
632
diff
changeset
|
195 } |
|
c7b23cc8cded
answer lint's complaints
Guido van Rossum <guido@python.org>
parents:
632
diff
changeset
|
196 |
| 6 | 197 double |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
198 PyFloat_AsDouble(PyObject *op) |
| 6 | 199 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
200 PyNumberMethods *nb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
201 PyFloatObject *fo; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
202 double val; |
|
20823
c7aa332a2ffa
SF bug #477221: abs and divmod act oddly with -0.0.
Tim Peters <tim.peters@gmail.com>
parents:
20654
diff
changeset
|
203 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
204 if (op && PyFloat_Check(op)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
205 return PyFloat_AS_DOUBLE((PyFloatObject*) op); |
|
20823
c7aa332a2ffa
SF bug #477221: abs and divmod act oddly with -0.0.
Tim Peters <tim.peters@gmail.com>
parents:
20654
diff
changeset
|
206 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
207 if (op == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
208 PyErr_BadArgument(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
209 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
210 } |
|
20823
c7aa332a2ffa
SF bug #477221: abs and divmod act oddly with -0.0.
Tim Peters <tim.peters@gmail.com>
parents:
20654
diff
changeset
|
211 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
212 if ((nb = Py_TYPE(op)->tp_as_number) == NULL || nb->nb_float == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
213 PyErr_SetString(PyExc_TypeError, "a float is required"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
214 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
215 } |
|
26272
fbccef8b3153
Improve exception message raised by PyFloat_AsDouble if the object does not
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
24898
diff
changeset
|
216 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
217 fo = (PyFloatObject*) (*nb->nb_float) (op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
218 if (fo == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
219 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
220 if (!PyFloat_Check(fo)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
221 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
222 "nb_float should return float object"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
223 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
224 } |
|
20823
c7aa332a2ffa
SF bug #477221: abs and divmod act oddly with -0.0.
Tim Peters <tim.peters@gmail.com>
parents:
20654
diff
changeset
|
225 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
226 val = PyFloat_AS_DOUBLE(fo); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
227 Py_DECREF(fo); |
|
20823
c7aa332a2ffa
SF bug #477221: abs and divmod act oddly with -0.0.
Tim Peters <tim.peters@gmail.com>
parents:
20654
diff
changeset
|
228 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
229 return val; |
| 6 | 230 } |
| 231 | |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
232 /* Macro and helper that convert PyObject obj to a C double and store |
|
43420
0ff41b163f5b
Remove more cruft leftover from nb_coerce. Rename nb_coerce to
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
43284
diff
changeset
|
233 the value in dbl. If conversion to double raises an exception, obj is |
|
21354
fbddb64d21c2
float_floor_div: An expression like 3.//1j crashed the interpreter, or
Tim Peters <tim.peters@gmail.com>
parents:
21353
diff
changeset
|
234 set to NULL, and the function invoking this macro returns NULL. If |
|
fbddb64d21c2
float_floor_div: An expression like 3.//1j crashed the interpreter, or
Tim Peters <tim.peters@gmail.com>
parents:
21353
diff
changeset
|
235 obj is not of float, int or long type, Py_NotImplemented is incref'ed, |
|
fbddb64d21c2
float_floor_div: An expression like 3.//1j crashed the interpreter, or
Tim Peters <tim.peters@gmail.com>
parents:
21353
diff
changeset
|
236 stored in obj, and returned from the function invoking this macro. |
|
fbddb64d21c2
float_floor_div: An expression like 3.//1j crashed the interpreter, or
Tim Peters <tim.peters@gmail.com>
parents:
21353
diff
changeset
|
237 */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
238 #define CONVERT_TO_DOUBLE(obj, dbl) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
239 if (PyFloat_Check(obj)) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
240 dbl = PyFloat_AS_DOUBLE(obj); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
241 else if (convert_to_double(&(obj), &(dbl)) < 0) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
242 return obj; |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
243 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53160
diff
changeset
|
244 /* Methods */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53160
diff
changeset
|
245 |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
246 static int |
|
19674
715244108faa
Raise OverflowError when appropriate on long->float conversion. Most of
Tim Peters <tim.peters@gmail.com>
parents:
19673
diff
changeset
|
247 convert_to_double(PyObject **v, double *dbl) |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
248 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
249 register PyObject *obj = *v; |
|
19674
715244108faa
Raise OverflowError when appropriate on long->float conversion. Most of
Tim Peters <tim.peters@gmail.com>
parents:
19673
diff
changeset
|
250 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
251 if (PyLong_Check(obj)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
252 *dbl = PyLong_AsDouble(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
253 if (*dbl == -1.0 && PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
254 *v = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
255 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
256 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
257 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
258 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
259 Py_INCREF(Py_NotImplemented); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
260 *v = Py_NotImplemented; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
261 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
262 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
263 return 0; |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
264 } |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
265 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53160
diff
changeset
|
266 static PyObject * |
|
63750
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
62834
diff
changeset
|
267 float_repr(PyFloatObject *v) |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53160
diff
changeset
|
268 { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53160
diff
changeset
|
269 PyObject *result; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53160
diff
changeset
|
270 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v), |
|
63750
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
62834
diff
changeset
|
271 'r', 0, |
|
53787
c6376d3fa968
Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents:
53714
diff
changeset
|
272 Py_DTSF_ADD_DOT_0, |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53160
diff
changeset
|
273 NULL); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53160
diff
changeset
|
274 if (!buf) |
|
63750
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
62834
diff
changeset
|
275 return PyErr_NoMemory(); |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53160
diff
changeset
|
276 result = PyUnicode_FromString(buf); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53160
diff
changeset
|
277 PyMem_Free(buf); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53160
diff
changeset
|
278 return result; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
53160
diff
changeset
|
279 } |
|
11631
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
280 |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
281 /* Comparison is pretty much a nightmare. When comparing float to float, |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
282 * we do it as straightforwardly (and long-windedly) as conceivable, so |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
283 * that, e.g., Python x == y delivers the same result as the platform |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
284 * C x == y when x and/or y is a NaN. |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
285 * When mixing float with an integer type, there's no good *uniform* approach. |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
286 * Converting the double to an integer obviously doesn't work, since we |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
287 * may lose info from fractional bits. Converting the integer to a double |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
288 * also has two failure modes: (1) a long int may trigger overflow (too |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
289 * large to fit in the dynamic range of a C double); (2) even a C long may have |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
290 * more bits than fit in a C double (e.g., on a a 64-bit box long may have |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
291 * 63 bits of precision, but a C double probably has only 53), and then |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
292 * we can falsely claim equality when low-order integer bits are lost by |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
293 * coercion to double. So this part is painful too. |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
294 */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
295 |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
296 static PyObject* |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
297 float_richcompare(PyObject *v, PyObject *w, int op) |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
298 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
299 double i, j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
300 int r = 0; |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
301 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
302 assert(PyFloat_Check(v)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
303 i = PyFloat_AS_DOUBLE(v); |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
304 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
305 /* Switch on the type of w. Set i and j to doubles to be compared, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
306 * and op to the richcomp to use. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
307 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
308 if (PyFloat_Check(w)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
309 j = PyFloat_AS_DOUBLE(w); |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
310 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
311 else if (!Py_IS_FINITE(i)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
312 if (PyLong_Check(w)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
313 /* If i is an infinity, its magnitude exceeds any |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
314 * finite integer, so it doesn't matter which int we |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
315 * compare i with. If i is a NaN, similarly. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
316 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
317 j = 0.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
318 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
319 goto Unimplemented; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
320 } |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
321 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
322 else if (PyLong_Check(w)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
323 int vsign = i == 0.0 ? 0 : i < 0.0 ? -1 : 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
324 int wsign = _PyLong_Sign(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
325 size_t nbits; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
326 int exponent; |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
327 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
328 if (vsign != wsign) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
329 /* Magnitudes are irrelevant -- the signs alone |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
330 * determine the outcome. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
331 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
332 i = (double)vsign; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
333 j = (double)wsign; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
334 goto Compare; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
335 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
336 /* The signs are the same. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
337 /* Convert w to a double if it fits. In particular, 0 fits. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
338 nbits = _PyLong_NumBits(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
339 if (nbits == (size_t)-1 && PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
340 /* This long is so large that size_t isn't big enough |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
341 * to hold the # of bits. Replace with little doubles |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
342 * that give the same outcome -- w is so large that |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
343 * its magnitude must exceed the magnitude of any |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
344 * finite float. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
345 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
346 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
347 i = (double)vsign; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
348 assert(wsign != 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
349 j = wsign * 2.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
350 goto Compare; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
351 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
352 if (nbits <= 48) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
353 j = PyLong_AsDouble(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
354 /* It's impossible that <= 48 bits overflowed. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
355 assert(j != -1.0 || ! PyErr_Occurred()); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
356 goto Compare; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
357 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
358 assert(wsign != 0); /* else nbits was 0 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
359 assert(vsign != 0); /* if vsign were 0, then since wsign is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
360 * not 0, we would have taken the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
361 * vsign != wsign branch at the start */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
362 /* We want to work with non-negative numbers. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
363 if (vsign < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
364 /* "Multiply both sides" by -1; this also swaps the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
365 * comparator. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
366 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
367 i = -i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
368 op = _Py_SwappedOp[op]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
369 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
370 assert(i > 0.0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
371 (void) frexp(i, &exponent); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
372 /* exponent is the # of bits in v before the radix point; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
373 * we know that nbits (the # of bits in w) > 48 at this point |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
374 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
375 if (exponent < 0 || (size_t)exponent < nbits) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
376 i = 1.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
377 j = 2.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
378 goto Compare; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
379 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
380 if ((size_t)exponent > nbits) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
381 i = 2.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
382 j = 1.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
383 goto Compare; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
384 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
385 /* v and w have the same number of bits before the radix |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
386 * point. Construct two longs that have the same comparison |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
387 * outcome. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
388 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
389 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
390 double fracpart; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
391 double intpart; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
392 PyObject *result = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
393 PyObject *one = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
394 PyObject *vv = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
395 PyObject *ww = w; |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
396 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
397 if (wsign < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
398 ww = PyNumber_Negative(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
399 if (ww == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
400 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
401 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
402 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
403 Py_INCREF(ww); |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
404 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
405 fracpart = modf(i, &intpart); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
406 vv = PyLong_FromDouble(intpart); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
407 if (vv == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
408 goto Error; |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
409 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
410 if (fracpart != 0.0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
411 /* Shift left, and or a 1 bit into vv |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
412 * to represent the lost fraction. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
413 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
414 PyObject *temp; |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
415 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
416 one = PyLong_FromLong(1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
417 if (one == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
418 goto Error; |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
419 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
420 temp = PyNumber_Lshift(ww, one); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
421 if (temp == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
422 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
423 Py_DECREF(ww); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
424 ww = temp; |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
425 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
426 temp = PyNumber_Lshift(vv, one); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
427 if (temp == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
428 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
429 Py_DECREF(vv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
430 vv = temp; |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
431 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
432 temp = PyNumber_Or(vv, one); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
433 if (temp == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
434 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
435 Py_DECREF(vv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
436 vv = temp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
437 } |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
438 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
439 r = PyObject_RichCompareBool(vv, ww, op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
440 if (r < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
441 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
442 result = PyBool_FromLong(r); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
443 Error: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
444 Py_XDECREF(vv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
445 Py_XDECREF(ww); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
446 Py_XDECREF(one); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
447 return result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
448 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
449 } /* else if (PyLong_Check(w)) */ |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
450 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
451 else /* w isn't float, int, or long */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
452 goto Unimplemented; |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
453 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
454 Compare: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
455 PyFPE_START_PROTECT("richcompare", return NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
456 switch (op) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
457 case Py_EQ: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
458 r = i == j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
459 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
460 case Py_NE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
461 r = i != j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
462 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
463 case Py_LE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
464 r = i <= j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
465 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
466 case Py_GE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
467 r = i >= j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
468 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
469 case Py_LT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
470 r = i < j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
471 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
472 case Py_GT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
473 r = i > j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
474 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
475 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
476 PyFPE_END_PROTECT(r) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
477 return PyBool_FromLong(r); |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
478 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
479 Unimplemented: |
|
71810
d0b0fcbb40db
Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents:
69498
diff
changeset
|
480 Py_RETURN_NOTIMPLEMENTED; |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
481 } |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
482 |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
63750
diff
changeset
|
483 static Py_hash_t |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
484 float_hash(PyFloatObject *v) |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1252
diff
changeset
|
485 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
486 return _Py_HashDouble(v->ob_fval); |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1252
diff
changeset
|
487 } |
|
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1252
diff
changeset
|
488 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
489 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
490 float_add(PyObject *v, PyObject *w) |
| 6 | 491 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
492 double a,b; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
493 CONVERT_TO_DOUBLE(v, a); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
494 CONVERT_TO_DOUBLE(w, b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
495 PyFPE_START_PROTECT("add", return 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
496 a = a + b; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
497 PyFPE_END_PROTECT(a) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
498 return PyFloat_FromDouble(a); |
| 6 | 499 } |
| 500 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
501 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
502 float_sub(PyObject *v, PyObject *w) |
| 6 | 503 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
504 double a,b; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
505 CONVERT_TO_DOUBLE(v, a); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
506 CONVERT_TO_DOUBLE(w, b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
507 PyFPE_START_PROTECT("subtract", return 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
508 a = a - b; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
509 PyFPE_END_PROTECT(a) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
510 return PyFloat_FromDouble(a); |
| 6 | 511 } |
| 512 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
513 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
514 float_mul(PyObject *v, PyObject *w) |
| 6 | 515 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
516 double a,b; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
517 CONVERT_TO_DOUBLE(v, a); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
518 CONVERT_TO_DOUBLE(w, b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
519 PyFPE_START_PROTECT("multiply", return 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
520 a = a * b; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
521 PyFPE_END_PROTECT(a) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
522 return PyFloat_FromDouble(a); |
| 6 | 523 } |
| 524 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
525 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
526 float_div(PyObject *v, PyObject *w) |
| 6 | 527 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
528 double a,b; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
529 CONVERT_TO_DOUBLE(v, a); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
530 CONVERT_TO_DOUBLE(w, b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
531 if (b == 0.0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
532 PyErr_SetString(PyExc_ZeroDivisionError, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
533 "float division by zero"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
534 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
535 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
536 PyFPE_START_PROTECT("divide", return 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
537 a = a / b; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
538 PyFPE_END_PROTECT(a) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
539 return PyFloat_FromDouble(a); |
| 6 | 540 } |
| 541 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
542 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
543 float_rem(PyObject *v, PyObject *w) |
| 6 | 544 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
545 double vx, wx; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
546 double mod; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
547 CONVERT_TO_DOUBLE(v, vx); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
548 CONVERT_TO_DOUBLE(w, wx); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
549 if (wx == 0.0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
550 PyErr_SetString(PyExc_ZeroDivisionError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
551 "float modulo"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
552 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
553 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
554 PyFPE_START_PROTECT("modulo", return 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
555 mod = fmod(vx, wx); |
|
66703
f14f619d7050
Merged revisions 87032 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
66701
diff
changeset
|
556 if (mod) { |
|
f14f619d7050
Merged revisions 87032 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
66701
diff
changeset
|
557 /* ensure the remainder has the same sign as the denominator */ |
|
f14f619d7050
Merged revisions 87032 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
66701
diff
changeset
|
558 if ((wx < 0) != (mod < 0)) { |
|
f14f619d7050
Merged revisions 87032 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
66701
diff
changeset
|
559 mod += wx; |
|
f14f619d7050
Merged revisions 87032 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
66701
diff
changeset
|
560 } |
|
f14f619d7050
Merged revisions 87032 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
66701
diff
changeset
|
561 } |
|
f14f619d7050
Merged revisions 87032 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
66701
diff
changeset
|
562 else { |
|
f14f619d7050
Merged revisions 87032 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
66701
diff
changeset
|
563 /* the remainder is zero, and in the presence of signed zeroes |
|
f14f619d7050
Merged revisions 87032 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
66701
diff
changeset
|
564 fmod returns different results across platforms; ensure |
|
66704
b32d19eb4338
Use copysign to produce appropriately signed zeros instead of trying to worm around possible compiler optimizations.
Mark Dickinson <dickinsm@gmail.com>
parents:
66698
diff
changeset
|
565 it has the same sign as the denominator. */ |
|
b32d19eb4338
Use copysign to produce appropriately signed zeros instead of trying to worm around possible compiler optimizations.
Mark Dickinson <dickinsm@gmail.com>
parents:
66698
diff
changeset
|
566 mod = copysign(0.0, wx); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
567 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
568 PyFPE_END_PROTECT(mod) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
569 return PyFloat_FromDouble(mod); |
| 6 | 570 } |
| 571 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
572 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
573 float_divmod(PyObject *v, PyObject *w) |
|
227
7ec6058b539b
Added (dummy) divmod and (functional) abs.
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
574 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
575 double vx, wx; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
576 double div, mod, floordiv; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
577 CONVERT_TO_DOUBLE(v, vx); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
578 CONVERT_TO_DOUBLE(w, wx); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
579 if (wx == 0.0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
580 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
581 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
582 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
583 PyFPE_START_PROTECT("divmod", return 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
584 mod = fmod(vx, wx); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
585 /* fmod is typically exact, so vx-mod is *mathematically* an |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
586 exact multiple of wx. But this is fp arithmetic, and fp |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
587 vx - mod is an approximation; the result is that div may |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
588 not be an exact integral value after the division, although |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
589 it will always be very close to one. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
590 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
591 div = (vx - mod) / wx; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
592 if (mod) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
593 /* ensure the remainder has the same sign as the denominator */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
594 if ((wx < 0) != (mod < 0)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
595 mod += wx; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
596 div -= 1.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
597 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
598 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
599 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
600 /* the remainder is zero, and in the presence of signed zeroes |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
601 fmod returns different results across platforms; ensure |
|
66704
b32d19eb4338
Use copysign to produce appropriately signed zeros instead of trying to worm around possible compiler optimizations.
Mark Dickinson <dickinsm@gmail.com>
parents:
66698
diff
changeset
|
602 it has the same sign as the denominator. */ |
|
b32d19eb4338
Use copysign to produce appropriately signed zeros instead of trying to worm around possible compiler optimizations.
Mark Dickinson <dickinsm@gmail.com>
parents:
66698
diff
changeset
|
603 mod = copysign(0.0, wx); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
604 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
605 /* snap quotient to nearest integral value */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
606 if (div) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
607 floordiv = floor(div); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
608 if (div - floordiv > 0.5) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
609 floordiv += 1.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
610 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
611 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
612 /* div is zero - get the same sign as the true quotient */ |
|
66704
b32d19eb4338
Use copysign to produce appropriately signed zeros instead of trying to worm around possible compiler optimizations.
Mark Dickinson <dickinsm@gmail.com>
parents:
66698
diff
changeset
|
613 floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
614 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
615 PyFPE_END_PROTECT(floordiv) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
616 return Py_BuildValue("(dd)", floordiv, mod); |
|
227
7ec6058b539b
Added (dummy) divmod and (functional) abs.
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
617 } |
|
7ec6058b539b
Added (dummy) divmod and (functional) abs.
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
618 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
619 static PyObject * |
|
21353
257c938900a6
float_int_div(): For clarity, move this closer to the other float
Tim Peters <tim.peters@gmail.com>
parents:
21097
diff
changeset
|
620 float_floor_div(PyObject *v, PyObject *w) |
|
257c938900a6
float_int_div(): For clarity, move this closer to the other float
Tim Peters <tim.peters@gmail.com>
parents:
21097
diff
changeset
|
621 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
622 PyObject *t, *r; |
|
21353
257c938900a6
float_int_div(): For clarity, move this closer to the other float
Tim Peters <tim.peters@gmail.com>
parents:
21097
diff
changeset
|
623 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
624 t = float_divmod(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
625 if (t == NULL || t == Py_NotImplemented) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
626 return t; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
627 assert(PyTuple_CheckExact(t)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
628 r = PyTuple_GET_ITEM(t, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
629 Py_INCREF(r); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
630 Py_DECREF(t); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
631 return r; |
|
21353
257c938900a6
float_int_div(): For clarity, move this closer to the other float
Tim Peters <tim.peters@gmail.com>
parents:
21097
diff
changeset
|
632 } |
|
257c938900a6
float_int_div(): For clarity, move this closer to the other float
Tim Peters <tim.peters@gmail.com>
parents:
21097
diff
changeset
|
633 |
|
58006
740dbae2e30c
Merged revisions 77139-77140 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
57487
diff
changeset
|
634 /* determine whether x is an odd integer or not; assumes that |
|
740dbae2e30c
Merged revisions 77139-77140 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
57487
diff
changeset
|
635 x is not an infinity or nan. */ |
|
740dbae2e30c
Merged revisions 77139-77140 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
57487
diff
changeset
|
636 #define DOUBLE_IS_ODD_INTEGER(x) (fmod(fabs(x), 2.0) == 1.0) |
|
740dbae2e30c
Merged revisions 77139-77140 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
57487
diff
changeset
|
637 |
|
21353
257c938900a6
float_int_div(): For clarity, move this closer to the other float
Tim Peters <tim.peters@gmail.com>
parents:
21097
diff
changeset
|
638 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
639 float_pow(PyObject *v, PyObject *w, PyObject *z) |
| 6 | 640 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
641 double iv, iw, ix; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
642 int negate_result = 0; |
|
19666
cf65ebf87560
New restriction on pow(x, y, z): If z is not None, x and y must be of
Tim Peters <tim.peters@gmail.com>
parents:
19633
diff
changeset
|
643 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
644 if ((PyObject *)z != Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
645 PyErr_SetString(PyExc_TypeError, "pow() 3rd argument not " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
646 "allowed unless all arguments are integers"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
647 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
648 } |
|
19666
cf65ebf87560
New restriction on pow(x, y, z): If z is not None, x and y must be of
Tim Peters <tim.peters@gmail.com>
parents:
19633
diff
changeset
|
649 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
650 CONVERT_TO_DOUBLE(v, iv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
651 CONVERT_TO_DOUBLE(w, iw); |
|
15041
7eefde90ec0e
SF bug 115831 and Ping's SF patch 101751, 0.0**-2.0 returns inf rather than
Tim Peters <tim.peters@gmail.com>
parents:
14869
diff
changeset
|
652 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
653 /* Sort out special cases here instead of relying on pow() */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
654 if (iw == 0) { /* v**0 is 1, even 0**0 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
655 return PyFloat_FromDouble(1.0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
656 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
657 if (Py_IS_NAN(iv)) { /* nan**w = nan, unless w == 0 */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
658 return PyFloat_FromDouble(iv); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
659 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
660 if (Py_IS_NAN(iw)) { /* v**nan = nan, unless v == 1; 1**nan = 1 */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
661 return PyFloat_FromDouble(iv == 1.0 ? 1.0 : iw); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
662 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
663 if (Py_IS_INFINITY(iw)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
664 /* v**inf is: 0.0 if abs(v) < 1; 1.0 if abs(v) == 1; inf if |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
665 * abs(v) > 1 (including case where v infinite) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
666 * |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
667 * v**-inf is: inf if abs(v) < 1; 1.0 if abs(v) == 1; 0.0 if |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
668 * abs(v) > 1 (including case where v infinite) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
669 */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
670 iv = fabs(iv); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
671 if (iv == 1.0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
672 return PyFloat_FromDouble(1.0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
673 else if ((iw > 0.0) == (iv > 1.0)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
674 return PyFloat_FromDouble(fabs(iw)); /* return inf */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
675 else |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
676 return PyFloat_FromDouble(0.0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
677 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
678 if (Py_IS_INFINITY(iv)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
679 /* (+-inf)**w is: inf for w positive, 0 for w negative; in |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
680 * both cases, we need to add the appropriate sign if w is |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
681 * an odd integer. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
682 */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
683 int iw_is_odd = DOUBLE_IS_ODD_INTEGER(iw); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
684 if (iw > 0.0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
685 return PyFloat_FromDouble(iw_is_odd ? iv : fabs(iv)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
686 else |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
687 return PyFloat_FromDouble(iw_is_odd ? |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
688 copysign(0.0, iv) : 0.0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
689 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
690 if (iv == 0.0) { /* 0**w is: 0 for w positive, 1 for w zero |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
691 (already dealt with above), and an error |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
692 if w is negative. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
693 int iw_is_odd = DOUBLE_IS_ODD_INTEGER(iw); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
694 if (iw < 0.0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
695 PyErr_SetString(PyExc_ZeroDivisionError, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
696 "0.0 cannot be raised to a " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
697 "negative power"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
698 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
699 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
700 /* use correct sign if iw is odd */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
701 return PyFloat_FromDouble(iw_is_odd ? iv : 0.0); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
702 } |
|
58006
740dbae2e30c
Merged revisions 77139-77140 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
57487
diff
changeset
|
703 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
704 if (iv < 0.0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
705 /* Whether this is an error is a mess, and bumps into libm |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
706 * bugs so we have to figure it out ourselves. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
707 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
708 if (iw != floor(iw)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
709 /* Negative numbers raised to fractional powers |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
710 * become complex. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
711 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
712 return PyComplex_Type.tp_as_number->nb_power(v, w, z); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
713 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
714 /* iw is an exact integer, albeit perhaps a very large |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
715 * one. Replace iv by its absolute value and remember |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
716 * to negate the pow result if iw is odd. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
717 */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
718 iv = -iv; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
719 negate_result = DOUBLE_IS_ODD_INTEGER(iw); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
720 } |
|
58006
740dbae2e30c
Merged revisions 77139-77140 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
57487
diff
changeset
|
721 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
722 if (iv == 1.0) { /* 1**w is 1, even 1**inf and 1**nan */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
723 /* (-1) ** large_integer also ends up here. Here's an |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
724 * extract from the comments for the previous |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
725 * implementation explaining why this special case is |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
726 * necessary: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
727 * |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
728 * -1 raised to an exact integer should never be exceptional. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
729 * Alas, some libms (chiefly glibc as of early 2003) return |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
730 * NaN and set EDOM on pow(-1, large_int) if the int doesn't |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
731 * happen to be representable in a *C* integer. That's a |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
732 * bug. |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
733 */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
734 return PyFloat_FromDouble(negate_result ? -1.0 : 1.0); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
735 } |
|
58006
740dbae2e30c
Merged revisions 77139-77140 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
57487
diff
changeset
|
736 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
737 /* Now iv and iw are finite, iw is nonzero, and iv is |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
738 * positive and not equal to 1.0. We finally allow |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
739 * the platform pow to step in and do the rest. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
740 */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
741 errno = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
742 PyFPE_START_PROTECT("pow", return NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
743 ix = pow(iv, iw); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
744 PyFPE_END_PROTECT(ix) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
745 Py_ADJUST_ERANGE1(ix); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
746 if (negate_result) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59014
diff
changeset
|
747 ix = -ix; |
|
58006
740dbae2e30c
Merged revisions 77139-77140 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
57487
diff
changeset
|
748 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
749 if (errno != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
750 /* We don't expect any errno value other than ERANGE, but |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
751 * the range of libm bugs appears unbounded. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
752 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
753 PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError : |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
754 PyExc_ValueError); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
755 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
756 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
757 return PyFloat_FromDouble(ix); |
| 6 | 758 } |
| 759 | |
|
58006
740dbae2e30c
Merged revisions 77139-77140 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
57487
diff
changeset
|
760 #undef DOUBLE_IS_ODD_INTEGER |
|
740dbae2e30c
Merged revisions 77139-77140 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
57487
diff
changeset
|
761 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
762 static PyObject * |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
763 float_neg(PyFloatObject *v) |
| 6 | 764 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
765 return PyFloat_FromDouble(-v->ob_fval); |
| 6 | 766 } |
| 767 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
768 static PyObject * |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
769 float_abs(PyFloatObject *v) |
|
227
7ec6058b539b
Added (dummy) divmod and (functional) abs.
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
770 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
771 return PyFloat_FromDouble(fabs(v->ob_fval)); |
| 6 | 772 } |
| 773 | |
| 239 | 774 static int |
|
40401
88133417dfd0
- patch #1600346 submitted by Tomer Filiba
Jack Diederich <jackdied@gmail.com>
parents:
39603
diff
changeset
|
775 float_bool(PyFloatObject *v) |
| 239 | 776 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
777 return v->ob_fval != 0.0; |
| 239 | 778 } |
| 779 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
780 static PyObject * |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
781 float_is_integer(PyObject *v) |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
782 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
783 double x = PyFloat_AsDouble(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
784 PyObject *o; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
785 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
786 if (x == -1.0 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
787 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
788 if (!Py_IS_FINITE(x)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
789 Py_RETURN_FALSE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
790 errno = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
791 PyFPE_START_PROTECT("is_integer", return NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
792 o = (floor(x) == x) ? Py_True : Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
793 PyFPE_END_PROTECT(x) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
794 if (errno != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
795 PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError : |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
796 PyExc_ValueError); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
797 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
798 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
799 Py_INCREF(o); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
800 return o; |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
801 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
802 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
803 #if 0 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
804 static PyObject * |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
805 float_is_inf(PyObject *v) |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
806 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
807 double x = PyFloat_AsDouble(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
808 if (x == -1.0 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
809 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
810 return PyBool_FromLong((long)Py_IS_INFINITY(x)); |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
811 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
812 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
813 static PyObject * |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
814 float_is_nan(PyObject *v) |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
815 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
816 double x = PyFloat_AsDouble(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
817 if (x == -1.0 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
818 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
819 return PyBool_FromLong((long)Py_IS_NAN(x)); |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
820 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
821 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
822 static PyObject * |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
823 float_is_finite(PyObject *v) |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
824 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
825 double x = PyFloat_AsDouble(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
826 if (x == -1.0 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
827 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
828 return PyBool_FromLong((long)Py_IS_FINITE(x)); |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
829 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
830 #endif |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
831 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
832 static PyObject * |
|
42753
077fe7860cc9
Finish the work on __round__ and __trunc__.
Guido van Rossum <guido@python.org>
parents:
42559
diff
changeset
|
833 float_trunc(PyObject *v) |
|
1049
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
955
diff
changeset
|
834 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
835 double x = PyFloat_AsDouble(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
836 double wholepart; /* integral portion of x, rounded toward 0 */ |
|
18838
a8575f358b9f
SF bug #444510: int() should guarantee truncation.
Tim Peters <tim.peters@gmail.com>
parents:
17707
diff
changeset
|
837 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
838 (void)modf(x, &wholepart); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
839 /* Try to get out cheap if this fits in a Python int. The attempt |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
840 * to cast to long must be protected, as C doesn't define what |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
841 * happens if the double is too big to fit in a long. Some rare |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
842 * systems raise an exception then (RISCOS was mentioned as one, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
843 * and someone using a non-default option on Sun also bumped into |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
844 * that). Note that checking for >= and <= LONG_{MIN,MAX} would |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
845 * still be vulnerable: if a long has more bits of precision than |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
846 * a double, casting MIN/MAX to double may yield an approximation, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
847 * and if that's rounded up, then, e.g., wholepart=LONG_MAX+1 would |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
848 * yield true from the C expression wholepart<=LONG_MAX, despite |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
849 * that wholepart is actually greater than LONG_MAX. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
850 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
851 if (LONG_MIN < wholepart && wholepart < LONG_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
852 const long aslong = (long)wholepart; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
853 return PyLong_FromLong(aslong); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
854 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
855 return PyLong_FromDouble(wholepart); |
|
1049
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
955
diff
changeset
|
856 } |
|
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
955
diff
changeset
|
857 |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
858 /* double_round: rounds a finite double to the closest multiple of |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
859 10**-ndigits; here ndigits is within reasonable bounds (typically, -308 <= |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
860 ndigits <= 323). Returns a Python float, or sets a Python error and |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
861 returns NULL on failure (OverflowError and memory errors are possible). */ |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
862 |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
863 #ifndef PY_NO_SHORT_FLOAT_REPR |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
864 /* version of double_round that uses the correctly-rounded string<->double |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
865 conversions from Python/dtoa.c */ |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
866 |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
867 static PyObject * |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
868 double_round(double x, int ndigits) { |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
869 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
870 double rounded; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
871 Py_ssize_t buflen, mybuflen=100; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
872 char *buf, *buf_end, shortbuf[100], *mybuf=shortbuf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
873 int decpt, sign; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
874 PyObject *result = NULL; |
|
74662
5b8800004955
Issue #13889: Add missing _Py_SET_53BIT_PRECISION_* calls around uses of dtoa.c functions in float round.
Mark Dickinson <mdickinson@enthought.com>
parents:
69497
diff
changeset
|
875 _Py_SET_53BIT_PRECISION_HEADER; |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
876 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
877 /* round to a decimal string */ |
|
74662
5b8800004955
Issue #13889: Add missing _Py_SET_53BIT_PRECISION_* calls around uses of dtoa.c functions in float round.
Mark Dickinson <mdickinson@enthought.com>
parents:
69497
diff
changeset
|
878 _Py_SET_53BIT_PRECISION_START; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
879 buf = _Py_dg_dtoa(x, 3, ndigits, &decpt, &sign, &buf_end); |
|
74662
5b8800004955
Issue #13889: Add missing _Py_SET_53BIT_PRECISION_* calls around uses of dtoa.c functions in float round.
Mark Dickinson <mdickinson@enthought.com>
parents:
69497
diff
changeset
|
880 _Py_SET_53BIT_PRECISION_END; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
881 if (buf == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
882 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
883 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
884 } |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
885 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
886 /* Get new buffer if shortbuf is too small. Space needed <= buf_end - |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
887 buf + 8: (1 extra for '0', 1 for sign, 5 for exp, 1 for '\0'). */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
888 buflen = buf_end - buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
889 if (buflen + 8 > mybuflen) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
890 mybuflen = buflen+8; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
891 mybuf = (char *)PyMem_Malloc(mybuflen); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
892 if (mybuf == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
893 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
894 goto exit; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
895 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
896 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
897 /* copy buf to mybuf, adding exponent, sign and leading 0 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
898 PyOS_snprintf(mybuf, mybuflen, "%s0%se%d", (sign ? "-" : ""), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
899 buf, decpt - (int)buflen); |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
900 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
901 /* and convert the resulting string back to a double */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
902 errno = 0; |
|
74662
5b8800004955
Issue #13889: Add missing _Py_SET_53BIT_PRECISION_* calls around uses of dtoa.c functions in float round.
Mark Dickinson <mdickinson@enthought.com>
parents:
69497
diff
changeset
|
903 _Py_SET_53BIT_PRECISION_START; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
904 rounded = _Py_dg_strtod(mybuf, NULL); |
|
74662
5b8800004955
Issue #13889: Add missing _Py_SET_53BIT_PRECISION_* calls around uses of dtoa.c functions in float round.
Mark Dickinson <mdickinson@enthought.com>
parents:
69497
diff
changeset
|
905 _Py_SET_53BIT_PRECISION_END; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
906 if (errno == ERANGE && fabs(rounded) >= 1.) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
907 PyErr_SetString(PyExc_OverflowError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
908 "rounded value too large to represent"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
909 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
910 result = PyFloat_FromDouble(rounded); |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
911 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
912 /* done computing value; now clean up */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
913 if (mybuf != shortbuf) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
914 PyMem_Free(mybuf); |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
915 exit: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
916 _Py_dg_freedtoa(buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
917 return result; |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
918 } |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
919 |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
920 #else /* PY_NO_SHORT_FLOAT_REPR */ |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
921 |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
922 /* fallback version, to be used when correctly rounded binary<->decimal |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
923 conversions aren't available */ |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
924 |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
925 static PyObject * |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
926 double_round(double x, int ndigits) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
927 double pow1, pow2, y, z; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
928 if (ndigits >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
929 if (ndigits > 22) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
930 /* pow1 and pow2 are each safe from overflow, but |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
931 pow1*pow2 ~= pow(10.0, ndigits) might overflow */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
932 pow1 = pow(10.0, (double)(ndigits-22)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
933 pow2 = 1e22; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
934 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
935 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
936 pow1 = pow(10.0, (double)ndigits); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
937 pow2 = 1.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
938 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
939 y = (x*pow1)*pow2; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
940 /* if y overflows, then rounded value is exactly x */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
941 if (!Py_IS_FINITE(y)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
942 return PyFloat_FromDouble(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
943 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
944 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
945 pow1 = pow(10.0, (double)-ndigits); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
946 pow2 = 1.0; /* unused; silences a gcc compiler warning */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
947 y = x / pow1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
948 } |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
949 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
950 z = round(y); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
951 if (fabs(y-z) == 0.5) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
952 /* halfway between two integers; use round-half-even */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
953 z = 2.0*round(y/2.0); |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
954 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
955 if (ndigits >= 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
956 z = (z / pow2) / pow1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
957 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
958 z *= pow1; |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
959 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
960 /* if computation resulted in overflow, raise OverflowError */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
961 if (!Py_IS_FINITE(z)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
962 PyErr_SetString(PyExc_OverflowError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
963 "overflow occurred during round"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
964 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
965 } |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
966 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
967 return PyFloat_FromDouble(z); |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
968 } |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
969 |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
970 #endif /* PY_NO_SHORT_FLOAT_REPR */ |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
971 |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
972 /* round a Python float v to the closest multiple of 10**-ndigits */ |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
973 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
974 static PyObject * |
|
42753
077fe7860cc9
Finish the work on __round__ and __trunc__.
Guido van Rossum <guido@python.org>
parents:
42559
diff
changeset
|
975 float_round(PyObject *v, PyObject *args) |
|
077fe7860cc9
Finish the work on __round__ and __trunc__.
Guido van Rossum <guido@python.org>
parents:
42559
diff
changeset
|
976 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
977 double x, rounded; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
978 PyObject *o_ndigits = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
979 Py_ssize_t ndigits; |
|
42753
077fe7860cc9
Finish the work on __round__ and __trunc__.
Guido van Rossum <guido@python.org>
parents:
42559
diff
changeset
|
980 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
981 x = PyFloat_AsDouble(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
982 if (!PyArg_ParseTuple(args, "|O", &o_ndigits)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
983 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
984 if (o_ndigits == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
985 /* single-argument round: round to nearest integer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
986 rounded = round(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
987 if (fabs(x-rounded) == 0.5) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
988 /* halfway case: round to even */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
989 rounded = 2.0*round(x/2.0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
990 return PyLong_FromDouble(rounded); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
991 } |
|
42753
077fe7860cc9
Finish the work on __round__ and __trunc__.
Guido van Rossum <guido@python.org>
parents:
42559
diff
changeset
|
992 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
993 /* interpret second argument as a Py_ssize_t; clips on overflow */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
994 ndigits = PyNumber_AsSsize_t(o_ndigits, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
995 if (ndigits == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
996 return NULL; |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
997 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
998 /* nans and infinities round to themselves */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
999 if (!Py_IS_FINITE(x)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1000 return PyFloat_FromDouble(x); |
|
42753
077fe7860cc9
Finish the work on __round__ and __trunc__.
Guido van Rossum <guido@python.org>
parents:
42559
diff
changeset
|
1001 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1002 /* Deal with extreme values for ndigits. For ndigits > NDIGITS_MAX, x |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1003 always rounds to itself. For ndigits < NDIGITS_MIN, x always |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1004 rounds to +-0.0. Here 0.30103 is an upper bound for log10(2). */ |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
1005 #define NDIGITS_MAX ((int)((DBL_MANT_DIG-DBL_MIN_EXP) * 0.30103)) |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
1006 #define NDIGITS_MIN (-(int)((DBL_MAX_EXP + 1) * 0.30103)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1007 if (ndigits > NDIGITS_MAX) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1008 /* return x */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1009 return PyFloat_FromDouble(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1010 else if (ndigits < NDIGITS_MIN) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1011 /* return 0.0, but with sign of x */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1012 return PyFloat_FromDouble(0.0*x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1013 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1014 /* finite x, and ndigits is not unreasonably large */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1015 return double_round(x, (int)ndigits); |
|
53218
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
1016 #undef NDIGITS_MAX |
|
d43d64252d36
Issue #1869 (and 4707, 5118, 5473, 1456775): use the new
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
1017 #undef NDIGITS_MIN |
|
42753
077fe7860cc9
Finish the work on __round__ and __trunc__.
Guido van Rossum <guido@python.org>
parents:
42559
diff
changeset
|
1018 } |
|
077fe7860cc9
Finish the work on __round__ and __trunc__.
Guido van Rossum <guido@python.org>
parents:
42559
diff
changeset
|
1019 |
|
077fe7860cc9
Finish the work on __round__ and __trunc__.
Guido van Rossum <guido@python.org>
parents:
42559
diff
changeset
|
1020 static PyObject * |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1021 float_float(PyObject *v) |
|
1049
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
955
diff
changeset
|
1022 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1023 if (PyFloat_CheckExact(v)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1024 Py_INCREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1025 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1026 v = PyFloat_FromDouble(((PyFloatObject *)v)->ob_fval); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1027 return v; |
|
1049
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
955
diff
changeset
|
1028 } |
|
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
955
diff
changeset
|
1029 |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1030 /* turn ASCII hex characters into integer values and vice versa */ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1031 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1032 static char |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1033 char_from_hex(int x) |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1034 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1035 assert(0 <= x && x < 16); |
|
72918
d76338eacf7c
Issue #13088: Add shared Py_hexdigits constant to format a number into base 16
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
1036 return Py_hexdigits[x]; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1037 } |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1038 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1039 static int |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1040 hex_from_char(char c) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1041 int x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1042 switch(c) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1043 case '0': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1044 x = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1045 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1046 case '1': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1047 x = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1048 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1049 case '2': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1050 x = 2; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1051 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1052 case '3': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1053 x = 3; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1054 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1055 case '4': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1056 x = 4; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1057 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1058 case '5': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1059 x = 5; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1060 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1061 case '6': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1062 x = 6; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1063 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1064 case '7': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1065 x = 7; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1066 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1067 case '8': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1068 x = 8; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1069 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1070 case '9': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1071 x = 9; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1072 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1073 case 'a': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1074 case 'A': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1075 x = 10; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1076 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1077 case 'b': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1078 case 'B': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1079 x = 11; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1080 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1081 case 'c': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1082 case 'C': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1083 x = 12; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1084 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1085 case 'd': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1086 case 'D': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1087 x = 13; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1088 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1089 case 'e': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1090 case 'E': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1091 x = 14; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1092 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1093 case 'f': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1094 case 'F': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1095 x = 15; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1096 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1097 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1098 x = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1099 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1100 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1101 return x; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1102 } |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1103 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1104 /* convert a float to a hexadecimal string */ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1105 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1106 /* TOHEX_NBITS is DBL_MANT_DIG rounded up to the next integer |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1107 of the form 4k+1. */ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1108 #define TOHEX_NBITS DBL_MANT_DIG + 3 - (DBL_MANT_DIG+2)%4 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1109 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1110 static PyObject * |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1111 float_hex(PyObject *v) |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1112 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1113 double x, m; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1114 int e, shift, i, si, esign; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1115 /* Space for 1+(TOHEX_NBITS-1)/4 digits, a decimal point, and the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1116 trailing NUL byte. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1117 char s[(TOHEX_NBITS-1)/4+3]; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1118 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1119 CONVERT_TO_DOUBLE(v, x); |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1120 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1121 if (Py_IS_NAN(x) || Py_IS_INFINITY(x)) |
|
63750
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
62834
diff
changeset
|
1122 return float_repr((PyFloatObject *)v); |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1123 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1124 if (x == 0.0) { |
|
62692
aec422111cde
Merged revisions 82448 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
61467
diff
changeset
|
1125 if (copysign(1.0, x) == -1.0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1126 return PyUnicode_FromString("-0x0.0p+0"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1127 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1128 return PyUnicode_FromString("0x0.0p+0"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1129 } |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1130 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1131 m = frexp(fabs(x), &e); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1132 shift = 1 - MAX(DBL_MIN_EXP - e, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1133 m = ldexp(m, shift); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1134 e -= shift; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1135 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1136 si = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1137 s[si] = char_from_hex((int)m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1138 si++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1139 m -= (int)m; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1140 s[si] = '.'; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1141 si++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1142 for (i=0; i < (TOHEX_NBITS-1)/4; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1143 m *= 16.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1144 s[si] = char_from_hex((int)m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1145 si++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1146 m -= (int)m; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1147 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1148 s[si] = '\0'; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1149 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1150 if (e < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1151 esign = (int)'-'; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1152 e = -e; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1153 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1154 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1155 esign = (int)'+'; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1156 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1157 if (x < 0.0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1158 return PyUnicode_FromFormat("-0x%sp%c%d", s, esign, e); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1159 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1160 return PyUnicode_FromFormat("0x%sp%c%d", s, esign, e); |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1161 } |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1162 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1163 PyDoc_STRVAR(float_hex_doc, |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1164 "float.hex() -> string\n\ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1165 \n\ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1166 Return a hexadecimal representation of a floating-point number.\n\ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1167 >>> (-0.1).hex()\n\ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1168 '-0x1.999999999999ap-4'\n\ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1169 >>> 3.14159.hex()\n\ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1170 '0x1.921f9f01b866ep+1'"); |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1171 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1172 /* Convert a hexadecimal string to a float. */ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1173 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1174 static PyObject * |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1175 float_fromhex(PyObject *cls, PyObject *arg) |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1176 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1177 PyObject *result_as_float, *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1178 double x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1179 long exp, top_exp, lsb, key_digit; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1180 char *s, *coeff_start, *s_store, *coeff_end, *exp_start, *s_end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1181 int half_eps, digit, round_up, negate=0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1182 Py_ssize_t length, ndigits, fdigits, i; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1183 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1184 /* |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1185 * For the sake of simplicity and correctness, we impose an artificial |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1186 * limit on ndigits, the total number of hex digits in the coefficient |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1187 * The limit is chosen to ensure that, writing exp for the exponent, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1188 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1189 * (1) if exp > LONG_MAX/2 then the value of the hex string is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1190 * guaranteed to overflow (provided it's nonzero) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1191 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1192 * (2) if exp < LONG_MIN/2 then the value of the hex string is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1193 * guaranteed to underflow to 0. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1194 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1195 * (3) if LONG_MIN/2 <= exp <= LONG_MAX/2 then there's no danger of |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1196 * overflow in the calculation of exp and top_exp below. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1197 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1198 * More specifically, ndigits is assumed to satisfy the following |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1199 * inequalities: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1200 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1201 * 4*ndigits <= DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1202 * 4*ndigits <= LONG_MAX/2 + 1 - DBL_MAX_EXP |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1203 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1204 * If either of these inequalities is not satisfied, a ValueError is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1205 * raised. Otherwise, write x for the value of the hex string, and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1206 * assume x is nonzero. Then |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1207 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1208 * 2**(exp-4*ndigits) <= |x| < 2**(exp+4*ndigits). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1209 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1210 * Now if exp > LONG_MAX/2 then: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1211 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1212 * exp - 4*ndigits >= LONG_MAX/2 + 1 - (LONG_MAX/2 + 1 - DBL_MAX_EXP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1213 * = DBL_MAX_EXP |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1214 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1215 * so |x| >= 2**DBL_MAX_EXP, which is too large to be stored in C |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1216 * double, so overflows. If exp < LONG_MIN/2, then |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1217 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1218 * exp + 4*ndigits <= LONG_MIN/2 - 1 + ( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1219 * DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1220 * = DBL_MIN_EXP - DBL_MANT_DIG - 1 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1221 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1222 * and so |x| < 2**(DBL_MIN_EXP-DBL_MANT_DIG-1), hence underflows to 0 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1223 * when converted to a C double. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1224 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1225 * It's easy to show that if LONG_MIN/2 <= exp <= LONG_MAX/2 then both |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1226 * exp+4*ndigits and exp-4*ndigits are within the range of a long. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1227 */ |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1228 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1229 s = _PyUnicode_AsStringAndSize(arg, &length); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1230 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1231 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1232 s_end = s + length; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1233 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1234 /******************** |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1235 * Parse the string * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1236 ********************/ |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1237 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1238 /* leading whitespace */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1239 while (Py_ISSPACE(*s)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1240 s++; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1241 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1242 /* infinities and nans */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1243 x = _Py_parse_inf_or_nan(s, &coeff_end); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1244 if (coeff_end != s) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1245 s = coeff_end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1246 goto finished; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1247 } |
|
54232
4501b638fc3f
Refactor to remove duplicated nan/inf parsing code in
Mark Dickinson <dickinsm@gmail.com>
parents:
54001
diff
changeset
|
1248 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1249 /* optional sign */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1250 if (*s == '-') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1251 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1252 negate = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1253 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1254 else if (*s == '+') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1255 s++; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1256 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1257 /* [0x] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1258 s_store = s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1259 if (*s == '0') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1260 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1261 if (*s == 'x' || *s == 'X') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1262 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1263 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1264 s = s_store; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1265 } |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1266 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1267 /* coefficient: <integer> [. <fraction>] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1268 coeff_start = s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1269 while (hex_from_char(*s) >= 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1270 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1271 s_store = s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1272 if (*s == '.') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1273 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1274 while (hex_from_char(*s) >= 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1275 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1276 coeff_end = s-1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1277 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1278 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1279 coeff_end = s; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1280 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1281 /* ndigits = total # of hex digits; fdigits = # after point */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1282 ndigits = coeff_end - coeff_start; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1283 fdigits = coeff_end - s_store; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1284 if (ndigits == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1285 goto parse_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1286 if (ndigits > MIN(DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1287 LONG_MAX/2 + 1 - DBL_MAX_EXP)/4) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1288 goto insane_length_error; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1289 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1290 /* [p <exponent>] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1291 if (*s == 'p' || *s == 'P') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1292 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1293 exp_start = s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1294 if (*s == '-' || *s == '+') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1295 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1296 if (!('0' <= *s && *s <= '9')) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1297 goto parse_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1298 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1299 while ('0' <= *s && *s <= '9') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1300 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1301 exp = strtol(exp_start, NULL, 10); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1302 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1303 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1304 exp = 0; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1305 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1306 /* for 0 <= j < ndigits, HEX_DIGIT(j) gives the jth most significant digit */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1307 #define HEX_DIGIT(j) hex_from_char(*((j) < fdigits ? \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1308 coeff_end-(j) : \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1309 coeff_end-1-(j))) |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1310 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1311 /******************************************* |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1312 * Compute rounded value of the hex string * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1313 *******************************************/ |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1314 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1315 /* Discard leading zeros, and catch extreme overflow and underflow */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1316 while (ndigits > 0 && HEX_DIGIT(ndigits-1) == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1317 ndigits--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1318 if (ndigits == 0 || exp < LONG_MIN/2) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1319 x = 0.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1320 goto finished; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1321 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1322 if (exp > LONG_MAX/2) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1323 goto overflow_error; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1324 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1325 /* Adjust exponent for fractional part. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1326 exp = exp - 4*((long)fdigits); |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1327 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1328 /* top_exp = 1 more than exponent of most sig. bit of coefficient */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1329 top_exp = exp + 4*((long)ndigits - 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1330 for (digit = HEX_DIGIT(ndigits-1); digit != 0; digit /= 2) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1331 top_exp++; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1332 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1333 /* catch almost all nonextreme cases of overflow and underflow here */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1334 if (top_exp < DBL_MIN_EXP - DBL_MANT_DIG) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1335 x = 0.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1336 goto finished; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1337 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1338 if (top_exp > DBL_MAX_EXP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1339 goto overflow_error; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1340 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1341 /* lsb = exponent of least significant bit of the *rounded* value. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1342 This is top_exp - DBL_MANT_DIG unless result is subnormal. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1343 lsb = MAX(top_exp, (long)DBL_MIN_EXP) - DBL_MANT_DIG; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1344 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1345 x = 0.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1346 if (exp >= lsb) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1347 /* no rounding required */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1348 for (i = ndigits-1; i >= 0; i--) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1349 x = 16.0*x + HEX_DIGIT(i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1350 x = ldexp(x, (int)(exp)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1351 goto finished; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1352 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1353 /* rounding required. key_digit is the index of the hex digit |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1354 containing the first bit to be rounded away. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1355 half_eps = 1 << (int)((lsb - exp - 1) % 4); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1356 key_digit = (lsb - exp - 1) / 4; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1357 for (i = ndigits-1; i > key_digit; i--) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1358 x = 16.0*x + HEX_DIGIT(i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1359 digit = HEX_DIGIT(key_digit); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1360 x = 16.0*x + (double)(digit & (16-2*half_eps)); |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1361 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1362 /* round-half-even: round up if bit lsb-1 is 1 and at least one of |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1363 bits lsb, lsb-2, lsb-3, lsb-4, ... is 1. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1364 if ((digit & half_eps) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1365 round_up = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1366 if ((digit & (3*half_eps-1)) != 0 || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1367 (half_eps == 8 && (HEX_DIGIT(key_digit+1) & 1) != 0)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1368 round_up = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1369 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1370 for (i = key_digit-1; i >= 0; i--) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1371 if (HEX_DIGIT(i) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1372 round_up = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1373 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1374 } |
| 62834 | 1375 if (round_up) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1376 x += 2*half_eps; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1377 if (top_exp == DBL_MAX_EXP && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1378 x == ldexp((double)(2*half_eps), DBL_MANT_DIG)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1379 /* overflow corner case: pre-rounded value < |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1380 2**DBL_MAX_EXP; rounded=2**DBL_MAX_EXP. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1381 goto overflow_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1382 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1383 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1384 x = ldexp(x, (int)(exp+4*key_digit)); |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1385 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1386 finished: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1387 /* optional trailing whitespace leading to the end of the string */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1388 while (Py_ISSPACE(*s)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1389 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1390 if (s != s_end) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1391 goto parse_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1392 result_as_float = Py_BuildValue("(d)", negate ? -x : x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1393 if (result_as_float == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1394 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1395 result = PyObject_CallObject(cls, result_as_float); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1396 Py_DECREF(result_as_float); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1397 return result; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1398 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1399 overflow_error: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1400 PyErr_SetString(PyExc_OverflowError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1401 "hexadecimal value too large to represent as a float"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1402 return NULL; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1403 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1404 parse_error: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1405 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1406 "invalid hexadecimal floating-point string"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1407 return NULL; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1408 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1409 insane_length_error: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1410 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1411 "hexadecimal string too long to convert"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1412 return NULL; |
|
48497
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1413 } |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1414 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1415 PyDoc_STRVAR(float_fromhex_doc, |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1416 "float.fromhex(string) -> float\n\ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1417 \n\ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1418 Create a floating-point number from a hexadecimal string.\n\ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1419 >>> float.fromhex('0x1.ffffp10')\n\ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1420 2047.984375\n\ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1421 >>> float.fromhex('-0x1p-1074')\n\ |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1422 -4.9406564584124654e-324"); |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1423 |
|
2bb866d282ba
Merged revisions 64974 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48364
diff
changeset
|
1424 |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1425 static PyObject * |
|
45134
bdcf40d1b38e
Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45071
diff
changeset
|
1426 float_as_integer_ratio(PyObject *v, PyObject *unused) |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1427 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1428 double self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1429 double float_part; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1430 int exponent; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1431 int i; |
|
45134
bdcf40d1b38e
Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45071
diff
changeset
|
1432 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1433 PyObject *prev; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1434 PyObject *py_exponent = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1435 PyObject *numerator = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1436 PyObject *denominator = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1437 PyObject *result_pair = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1438 PyNumberMethods *long_methods = PyLong_Type.tp_as_number; |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1439 |
|
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1440 #define INPLACE_UPDATE(obj, call) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1441 prev = obj; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1442 obj = call; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1443 Py_DECREF(prev); \ |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1444 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1445 CONVERT_TO_DOUBLE(v, self); |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1446 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1447 if (Py_IS_INFINITY(self)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1448 PyErr_SetString(PyExc_OverflowError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1449 "Cannot pass infinity to float.as_integer_ratio."); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1450 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1451 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1452 if (Py_IS_NAN(self)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1453 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1454 "Cannot pass NaN to float.as_integer_ratio."); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1455 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1456 } |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1457 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1458 PyFPE_START_PROTECT("as_integer_ratio", goto error); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1459 float_part = frexp(self, &exponent); /* self == float_part * 2**exponent exactly */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1460 PyFPE_END_PROTECT(float_part); |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1461 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1462 for (i=0; i<300 && float_part != floor(float_part) ; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1463 float_part *= 2.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1464 exponent--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1465 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1466 /* self == float_part * 2**exponent exactly and float_part is integral. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1467 If FLT_RADIX != 2, the 300 steps may leave a tiny fractional part |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1468 to be truncated by PyLong_FromDouble(). */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1469 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1470 numerator = PyLong_FromDouble(float_part); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1471 if (numerator == NULL) goto error; |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1472 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1473 /* fold in 2**exponent */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1474 denominator = PyLong_FromLong(1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1475 py_exponent = PyLong_FromLong(labs((long)exponent)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1476 if (py_exponent == NULL) goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1477 INPLACE_UPDATE(py_exponent, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1478 long_methods->nb_lshift(denominator, py_exponent)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1479 if (py_exponent == NULL) goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1480 if (exponent > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1481 INPLACE_UPDATE(numerator, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1482 long_methods->nb_multiply(numerator, py_exponent)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1483 if (numerator == NULL) goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1484 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1485 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1486 Py_DECREF(denominator); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1487 denominator = py_exponent; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1488 py_exponent = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1489 } |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1490 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1491 result_pair = PyTuple_Pack(2, numerator, denominator); |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1492 |
|
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1493 #undef INPLACE_UPDATE |
|
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1494 error: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1495 Py_XDECREF(py_exponent); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1496 Py_XDECREF(denominator); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1497 Py_XDECREF(numerator); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1498 return result_pair; |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1499 } |
|
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1500 |
|
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1501 PyDoc_STRVAR(float_as_integer_ratio_doc, |
|
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1502 "float.as_integer_ratio() -> (int, int)\n" |
|
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1503 "\n" |
|
45134
bdcf40d1b38e
Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45071
diff
changeset
|
1504 "Returns a pair of integers, whose ratio is exactly equal to the original\n" |
|
bdcf40d1b38e
Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45071
diff
changeset
|
1505 "float and with a positive denominator.\n" |
| 49493 | 1506 "Raises OverflowError on infinities and a ValueError on NaNs.\n" |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1507 "\n" |
|
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1508 ">>> (10.0).as_integer_ratio()\n" |
|
45134
bdcf40d1b38e
Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45071
diff
changeset
|
1509 "(10, 1)\n" |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1510 ">>> (0.0).as_integer_ratio()\n" |
|
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1511 "(0, 1)\n" |
|
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1512 ">>> (-.25).as_integer_ratio()\n" |
|
45134
bdcf40d1b38e
Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45071
diff
changeset
|
1513 "(-1, 4)"); |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1514 |
|
1049
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
955
diff
changeset
|
1515 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23832
diff
changeset
|
1516 static PyObject * |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1517 float_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds); |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1518 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1519 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1520 float_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1521 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1522 PyObject *x = Py_False; /* Integer zero */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1523 static char *kwlist[] = {"x", 0}; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1524 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1525 if (type != &PyFloat_Type) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1526 return float_subtype_new(type, args, kwds); /* Wimp out */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1527 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:float", kwlist, &x)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1528 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1529 /* If it's a string, but not a string subclass, use |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1530 PyFloat_FromString. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1531 if (PyUnicode_CheckExact(x)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1532 return PyFloat_FromString(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1533 return PyNumber_Float(x); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1534 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1535 |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1536 /* Wimpy, slow approach to tp_new calls for subtypes of float: |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1537 first create a regular float from whatever arguments we got, |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1538 then allocate a subtype instance and initialize its ob_fval |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1539 from the regular float. The regular float is then thrown away. |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1540 */ |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1541 static PyObject * |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1542 float_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1543 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1544 PyObject *tmp, *newobj; |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1545 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1546 assert(PyType_IsSubtype(type, &PyFloat_Type)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1547 tmp = float_new(&PyFloat_Type, args, kwds); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1548 if (tmp == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1549 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1550 assert(PyFloat_CheckExact(tmp)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1551 newobj = type->tp_alloc(type, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1552 if (newobj == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1553 Py_DECREF(tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1554 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1555 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1556 ((PyFloatObject *)newobj)->ob_fval = ((PyFloatObject *)tmp)->ob_fval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1557 Py_DECREF(tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1558 return newobj; |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1559 } |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1560 |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1561 static PyObject * |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1562 float_getnewargs(PyFloatObject *v) |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1563 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1564 return Py_BuildValue("(d)", v->ob_fval); |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1565 } |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1566 |
| 34972 | 1567 /* this is for the benefit of the pack/unpack routines below */ |
| 1568 | |
| 1569 typedef enum { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1570 unknown_format, ieee_big_endian_format, ieee_little_endian_format |
| 34972 | 1571 } float_format_type; |
| 1572 | |
| 1573 static float_format_type double_format, float_format; | |
| 1574 static float_format_type detected_double_format, detected_float_format; | |
| 1575 | |
| 1576 static PyObject * | |
| 1577 float_getformat(PyTypeObject *v, PyObject* arg) | |
| 1578 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1579 char* s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1580 float_format_type r; |
| 34972 | 1581 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1582 if (!PyUnicode_Check(arg)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1583 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1584 "__getformat__() argument must be string, not %.500s", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1585 Py_TYPE(arg)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1586 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1587 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1588 s = _PyUnicode_AsString(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1589 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1590 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1591 if (strcmp(s, "double") == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1592 r = double_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1593 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1594 else if (strcmp(s, "float") == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1595 r = float_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1596 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1597 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1598 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1599 "__getformat__() argument 1 must be " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1600 "'double' or 'float'"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1601 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1602 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1603 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1604 switch (r) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1605 case unknown_format: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1606 return PyUnicode_FromString("unknown"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1607 case ieee_little_endian_format: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1608 return PyUnicode_FromString("IEEE, little-endian"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1609 case ieee_big_endian_format: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1610 return PyUnicode_FromString("IEEE, big-endian"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1611 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1612 Py_FatalError("insane float_format or double_format"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1613 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1614 } |
| 34972 | 1615 } |
| 1616 | |
| 1617 PyDoc_STRVAR(float_getformat_doc, | |
| 1618 "float.__getformat__(typestr) -> string\n" | |
| 1619 "\n" | |
| 1620 "You probably don't want to use this function. It exists mainly to be\n" | |
| 1621 "used in Python's test suite.\n" | |
| 1622 "\n" | |
| 1623 "typestr must be 'double' or 'float'. This function returns whichever of\n" | |
| 1624 "'unknown', 'IEEE, big-endian' or 'IEEE, little-endian' best describes the\n" | |
| 1625 "format of floating point numbers used by the C type named by typestr."); | |
| 1626 | |
| 1627 static PyObject * | |
| 1628 float_setformat(PyTypeObject *v, PyObject* args) | |
| 1629 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1630 char* typestr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1631 char* format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1632 float_format_type f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1633 float_format_type detected; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1634 float_format_type *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1635 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1636 if (!PyArg_ParseTuple(args, "ss:__setformat__", &typestr, &format)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1637 return NULL; |
| 34972 | 1638 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1639 if (strcmp(typestr, "double") == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1640 p = &double_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1641 detected = detected_double_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1642 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1643 else if (strcmp(typestr, "float") == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1644 p = &float_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1645 detected = detected_float_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1646 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1647 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1648 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1649 "__setformat__() argument 1 must " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1650 "be 'double' or 'float'"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1651 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1652 } |
| 34972 | 1653 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1654 if (strcmp(format, "unknown") == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1655 f = unknown_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1656 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1657 else if (strcmp(format, "IEEE, little-endian") == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1658 f = ieee_little_endian_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1659 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1660 else if (strcmp(format, "IEEE, big-endian") == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1661 f = ieee_big_endian_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1662 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1663 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1664 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1665 "__setformat__() argument 2 must be " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1666 "'unknown', 'IEEE, little-endian' or " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1667 "'IEEE, big-endian'"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1668 return NULL; |
| 34972 | 1669 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1670 } |
| 34972 | 1671 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1672 if (f != unknown_format && f != detected) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1673 PyErr_Format(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1674 "can only set %s format to 'unknown' or the " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1675 "detected platform value", typestr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1676 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1677 } |
| 34972 | 1678 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1679 *p = f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1680 Py_RETURN_NONE; |
| 34972 | 1681 } |
| 1682 | |
| 1683 PyDoc_STRVAR(float_setformat_doc, | |
| 1684 "float.__setformat__(typestr, fmt) -> None\n" | |
| 1685 "\n" | |
| 1686 "You probably don't want to use this function. It exists mainly to be\n" | |
| 1687 "used in Python's test suite.\n" | |
| 1688 "\n" | |
| 1689 "typestr must be 'double' or 'float'. fmt must be one of 'unknown',\n" | |
| 1690 "'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be\n" | |
| 1691 "one of the latter two if it appears to match the underlying C reality.\n" | |
| 1692 "\n" | |
| 1693 "Overrides the automatic determination of C-level floating point type.\n" | |
| 1694 "This affects how floats are converted to and from binary strings."); | |
| 1695 | |
|
42417
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1696 static PyObject * |
|
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1697 float_getzero(PyObject *v, void *closure) |
|
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1698 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1699 return PyFloat_FromDouble(0.0); |
|
42417
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1700 } |
|
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1701 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42753
diff
changeset
|
1702 static PyObject * |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42753
diff
changeset
|
1703 float__format__(PyObject *self, PyObject *args) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42753
diff
changeset
|
1704 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1705 PyObject *format_spec; |
|
47393
0da27fdf0192
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents:
46790
diff
changeset
|
1706 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1707 if (!PyArg_ParseTuple(args, "U:__format__", &format_spec)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1708 return NULL; |
| 72475 | 1709 return _PyFloat_FormatAdvanced(self, format_spec, 0, |
| 1710 PyUnicode_GET_LENGTH(format_spec)); | |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42753
diff
changeset
|
1711 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42753
diff
changeset
|
1712 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42753
diff
changeset
|
1713 PyDoc_STRVAR(float__format__doc, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42753
diff
changeset
|
1714 "float.__format__(format_spec) -> string\n" |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42753
diff
changeset
|
1715 "\n" |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42753
diff
changeset
|
1716 "Formats the float according to format_spec."); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42753
diff
changeset
|
1717 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42753
diff
changeset
|
1718 |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1719 static PyMethodDef float_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1720 {"conjugate", (PyCFunction)float_float, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1721 "Returns self, the complex conjugate of any float."}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1722 {"__trunc__", (PyCFunction)float_trunc, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1723 "Returns the Integral closest to x between 0 and x."}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1724 {"__round__", (PyCFunction)float_round, METH_VARARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1725 "Returns the Integral closest to x, rounding half toward even.\n" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1726 "When an argument is passed, works like built-in round(x, ndigits)."}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1727 {"as_integer_ratio", (PyCFunction)float_as_integer_ratio, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1728 float_as_integer_ratio_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1729 {"fromhex", (PyCFunction)float_fromhex, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1730 METH_O|METH_CLASS, float_fromhex_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1731 {"hex", (PyCFunction)float_hex, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1732 METH_NOARGS, float_hex_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1733 {"is_integer", (PyCFunction)float_is_integer, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1734 "Returns True if the float is an integer."}, |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
1735 #if 0 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1736 {"is_inf", (PyCFunction)float_is_inf, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1737 "Returns True if the float is positive or negative infinite."}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1738 {"is_finite", (PyCFunction)float_is_finite, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1739 "Returns True if the float is finite, neither infinite nor NaN."}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1740 {"is_nan", (PyCFunction)float_is_nan, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1741 "Returns True if the float is not a number (NaN)."}, |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
1742 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1743 {"__getnewargs__", (PyCFunction)float_getnewargs, METH_NOARGS}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1744 {"__getformat__", (PyCFunction)float_getformat, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1745 METH_O|METH_CLASS, float_getformat_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1746 {"__setformat__", (PyCFunction)float_setformat, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1747 METH_VARARGS|METH_CLASS, float_setformat_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1748 {"__format__", (PyCFunction)float__format__, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1749 METH_VARARGS, float__format__doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1750 {NULL, NULL} /* sentinel */ |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1751 }; |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1752 |
|
42417
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1753 static PyGetSetDef float_getset[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1754 {"real", |
|
42417
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1755 (getter)float_float, (setter)NULL, |
|
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1756 "the real part of a complex number", |
|
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1757 NULL}, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1758 {"imag", |
|
42417
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1759 (getter)float_getzero, (setter)NULL, |
|
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1760 "the imaginary part of a complex number", |
|
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1761 NULL}, |
|
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1762 {NULL} /* Sentinel */ |
|
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1763 }; |
|
d3a5c796c8ba
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
1764 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23344
diff
changeset
|
1765 PyDoc_STRVAR(float_doc, |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1766 "float(x) -> floating point number\n\ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1767 \n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23344
diff
changeset
|
1768 Convert a string or number to a floating point number, if possible."); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1769 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1770 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1771 static PyNumberMethods float_as_number = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1772 float_add, /*nb_add*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1773 float_sub, /*nb_subtract*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1774 float_mul, /*nb_multiply*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1775 float_rem, /*nb_remainder*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1776 float_divmod, /*nb_divmod*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1777 float_pow, /*nb_power*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1778 (unaryfunc)float_neg, /*nb_negative*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1779 (unaryfunc)float_float, /*nb_positive*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1780 (unaryfunc)float_abs, /*nb_absolute*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1781 (inquiry)float_bool, /*nb_bool*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1782 0, /*nb_invert*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1783 0, /*nb_lshift*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1784 0, /*nb_rshift*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1785 0, /*nb_and*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1786 0, /*nb_xor*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1787 0, /*nb_or*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1788 float_trunc, /*nb_int*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1789 0, /*nb_reserved*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1790 float_float, /*nb_float*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1791 0, /* nb_inplace_add */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1792 0, /* nb_inplace_subtract */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1793 0, /* nb_inplace_multiply */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1794 0, /* nb_inplace_remainder */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1795 0, /* nb_inplace_power */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1796 0, /* nb_inplace_lshift */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1797 0, /* nb_inplace_rshift */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1798 0, /* nb_inplace_and */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1799 0, /* nb_inplace_xor */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1800 0, /* nb_inplace_or */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1801 float_floor_div, /* nb_floor_divide */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1802 float_div, /* nb_true_divide */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1803 0, /* nb_inplace_floor_divide */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1804 0, /* nb_inplace_true_divide */ |
| 6 | 1805 }; |
| 1806 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1807 PyTypeObject PyFloat_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1808 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1809 "float", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1810 sizeof(PyFloatObject), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1811 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1812 (destructor)float_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1813 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1814 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1815 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1816 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1817 (reprfunc)float_repr, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1818 &float_as_number, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1819 0, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1820 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1821 (hashfunc)float_hash, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1822 0, /* tp_call */ |
|
63750
eafe07d40eb7
Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents:
62834
diff
changeset
|
1823 (reprfunc)float_repr, /* tp_str */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1824 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1825 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1826 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1827 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1828 float_doc, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1829 0, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1830 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1831 float_richcompare, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1832 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1833 0, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1834 0, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1835 float_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1836 0, /* tp_members */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1837 float_getset, /* tp_getset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1838 0, /* tp_base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1839 0, /* tp_dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1840 0, /* tp_descr_get */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1841 0, /* tp_descr_set */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1842 0, /* tp_dictoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1843 0, /* tp_init */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1844 0, /* tp_alloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1845 float_new, /* tp_new */ |
| 6 | 1846 }; |
|
5936
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5504
diff
changeset
|
1847 |
|
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5504
diff
changeset
|
1848 void |
| 34972 | 1849 _PyFloat_Init(void) |
| 1850 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1851 /* We attempt to determine if this machine is using IEEE |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1852 floating point formats by peering at the bits of some |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1853 carefully chosen values. If it looks like we are on an |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1854 IEEE platform, the float packing/unpacking routines can |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1855 just copy bits, if not they resort to arithmetic & shifts |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1856 and masks. The shifts & masks approach works on all finite |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1857 values, but what happens to infinities, NaNs and signed |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1858 zeroes on packing is an accident, and attempting to unpack |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1859 a NaN or an infinity will raise an exception. |
| 34972 | 1860 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1861 Note that if we're on some whacked-out platform which uses |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1862 IEEE formats but isn't strictly little-endian or big- |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1863 endian, we will fall back to the portable shifts & masks |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1864 method. */ |
| 34972 | 1865 |
| 1866 #if SIZEOF_DOUBLE == 8 | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1867 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1868 double x = 9006104071832581.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1869 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1870 detected_double_format = ieee_big_endian_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1871 else if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1872 detected_double_format = ieee_little_endian_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1873 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1874 detected_double_format = unknown_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1875 } |
| 34972 | 1876 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1877 detected_double_format = unknown_format; |
| 34972 | 1878 #endif |
| 1879 | |
| 1880 #if SIZEOF_FLOAT == 4 | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1881 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1882 float y = 16711938.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1883 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1884 detected_float_format = ieee_big_endian_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1885 else if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1886 detected_float_format = ieee_little_endian_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1887 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1888 detected_float_format = unknown_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1889 } |
| 34972 | 1890 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1891 detected_float_format = unknown_format; |
| 34972 | 1892 #endif |
| 1893 | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1894 double_format = detected_double_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1895 float_format = detected_float_format; |
|
44268
7ae604b3533b
Merged revisions 59450-59464 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44260
diff
changeset
|
1896 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1897 /* Init float info */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1898 if (FloatInfoType.tp_name == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1899 PyStructSequence_InitType(&FloatInfoType, &floatinfo_desc); |
| 34972 | 1900 } |
| 1901 | |
|
48499
de0bf60f1245
Merged revisions 64722,64729,64753,64845-64846,64849,64871,64880-64882,64885,64888,64897,64900-64901,64915,64926-64929,64938-64941,64944,64961,64966,64973 via svnmerge from
Georg Brandl <georg@python.org>
parents:
48497
diff
changeset
|
1902 int |
|
de0bf60f1245
Merged revisions 64722,64729,64753,64845-64846,64849,64871,64880-64882,64885,64888,64897,64900-64901,64915,64926-64929,64938-64941,64944,64961,64966,64973 via svnmerge from
Georg Brandl <georg@python.org>
parents:
48497
diff
changeset
|
1903 PyFloat_ClearFreeList(void) |
|
5936
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5504
diff
changeset
|
1904 { |
|
75993
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
1905 PyFloatObject *f = free_list, *next; |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
1906 int i = numfree; |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
1907 while (f) { |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
1908 next = (PyFloatObject*) Py_TYPE(f); |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
1909 PyObject_FREE(f); |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
1910 f = next; |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
1911 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1912 free_list = NULL; |
|
75993
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
1913 numfree = 0; |
|
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
1914 return i; |
|
45145
3d7b84daa34a
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552-60567 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45134
diff
changeset
|
1915 } |
|
3d7b84daa34a
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552-60567 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45134
diff
changeset
|
1916 |
|
3d7b84daa34a
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552-60567 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45134
diff
changeset
|
1917 void |
|
3d7b84daa34a
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552-60567 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45134
diff
changeset
|
1918 PyFloat_Fini(void) |
|
3d7b84daa34a
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552-60567 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45134
diff
changeset
|
1919 { |
|
75993
37ebe64d39d2
Issue #14435: Remove special block allocation code from floatobject.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74663
diff
changeset
|
1920 (void)PyFloat_ClearFreeList(); |
|
5936
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5504
diff
changeset
|
1921 } |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1922 |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1923 /*---------------------------------------------------------------------------- |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1924 * _PyFloat_{Pack,Unpack}{4,8}. See floatobject.h. |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1925 */ |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1926 int |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1927 _PyFloat_Pack4(double x, unsigned char *p, int le) |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1928 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1929 if (float_format == unknown_format) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1930 unsigned char sign; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1931 int e; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1932 double f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1933 unsigned int fbits; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1934 int incr = 1; |
| 34972 | 1935 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1936 if (le) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1937 p += 3; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1938 incr = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1939 } |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1940 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1941 if (x < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1942 sign = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1943 x = -x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1944 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1945 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1946 sign = 0; |
| 34972 | 1947 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1948 f = frexp(x, &e); |
| 34972 | 1949 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1950 /* Normalize f to be in the range [1.0, 2.0) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1951 if (0.5 <= f && f < 1.0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1952 f *= 2.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1953 e--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1954 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1955 else if (f == 0.0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1956 e = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1957 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1958 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1959 "frexp() result out of range"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1960 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1961 } |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1962 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1963 if (e >= 128) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1964 goto Overflow; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1965 else if (e < -126) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1966 /* Gradual underflow */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1967 f = ldexp(f, 126 + e); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1968 e = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1969 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1970 else if (!(e == 0 && f == 0.0)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1971 e += 127; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1972 f -= 1.0; /* Get rid of leading 1 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1973 } |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1974 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1975 f *= 8388608.0; /* 2**23 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1976 fbits = (unsigned int)(f + 0.5); /* Round */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1977 assert(fbits <= 8388608); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1978 if (fbits >> 23) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1979 /* The carry propagated out of a string of 23 1 bits. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1980 fbits = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1981 ++e; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1982 if (e >= 255) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1983 goto Overflow; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1984 } |
| 34972 | 1985 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1986 /* First byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1987 *p = (sign << 7) | (e >> 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1988 p += incr; |
| 34972 | 1989 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1990 /* Second byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1991 *p = (char) (((e & 1) << 7) | (fbits >> 16)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1992 p += incr; |
| 34972 | 1993 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1994 /* Third byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1995 *p = (fbits >> 8) & 0xFF; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1996 p += incr; |
| 34972 | 1997 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1998 /* Fourth byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
1999 *p = fbits & 0xFF; |
| 34972 | 2000 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2001 /* Done */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2002 return 0; |
| 34972 | 2003 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2004 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2005 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2006 float y = (float)x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2007 const char *s = (char*)&y; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2008 int i, incr = 1; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2009 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2010 if (Py_IS_INFINITY(y) && !Py_IS_INFINITY(x)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2011 goto Overflow; |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45145
diff
changeset
|
2012 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2013 if ((float_format == ieee_little_endian_format && !le) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2014 || (float_format == ieee_big_endian_format && le)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2015 p += 3; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2016 incr = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2017 } |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45145
diff
changeset
|
2018 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2019 for (i = 0; i < 4; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2020 *p = *s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2021 p += incr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2022 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2023 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2024 } |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45145
diff
changeset
|
2025 Overflow: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2026 PyErr_SetString(PyExc_OverflowError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2027 "float too large to pack with f format"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2028 return -1; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2029 } |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2030 |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2031 int |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2032 _PyFloat_Pack8(double x, unsigned char *p, int le) |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2033 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2034 if (double_format == unknown_format) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2035 unsigned char sign; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2036 int e; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2037 double f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2038 unsigned int fhi, flo; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2039 int incr = 1; |
| 34972 | 2040 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2041 if (le) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2042 p += 7; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2043 incr = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2044 } |
| 34972 | 2045 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2046 if (x < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2047 sign = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2048 x = -x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2049 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2050 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2051 sign = 0; |
| 34972 | 2052 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2053 f = frexp(x, &e); |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2054 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2055 /* Normalize f to be in the range [1.0, 2.0) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2056 if (0.5 <= f && f < 1.0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2057 f *= 2.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2058 e--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2059 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2060 else if (f == 0.0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2061 e = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2062 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2063 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2064 "frexp() result out of range"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2065 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2066 } |
| 34972 | 2067 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2068 if (e >= 1024) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2069 goto Overflow; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2070 else if (e < -1022) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2071 /* Gradual underflow */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2072 f = ldexp(f, 1022 + e); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2073 e = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2074 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2075 else if (!(e == 0 && f == 0.0)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2076 e += 1023; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2077 f -= 1.0; /* Get rid of leading 1 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2078 } |
| 34972 | 2079 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2080 /* fhi receives the high 28 bits; flo the low 24 bits (== 52 bits) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2081 f *= 268435456.0; /* 2**28 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2082 fhi = (unsigned int)f; /* Truncate */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2083 assert(fhi < 268435456); |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2084 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2085 f -= (double)fhi; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2086 f *= 16777216.0; /* 2**24 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2087 flo = (unsigned int)(f + 0.5); /* Round */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2088 assert(flo <= 16777216); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2089 if (flo >> 24) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2090 /* The carry propagated out of a string of 24 1 bits. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2091 flo = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2092 ++fhi; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2093 if (fhi >> 28) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2094 /* And it also progagated out of the next 28 bits. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2095 fhi = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2096 ++e; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2097 if (e >= 2047) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2098 goto Overflow; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2099 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2100 } |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2101 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2102 /* First byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2103 *p = (sign << 7) | (e >> 4); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2104 p += incr; |
| 34972 | 2105 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2106 /* Second byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2107 *p = (unsigned char) (((e & 0xF) << 4) | (fhi >> 24)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2108 p += incr; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2109 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2110 /* Third byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2111 *p = (fhi >> 16) & 0xFF; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2112 p += incr; |
| 34972 | 2113 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2114 /* Fourth byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2115 *p = (fhi >> 8) & 0xFF; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2116 p += incr; |
| 34972 | 2117 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2118 /* Fifth byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2119 *p = fhi & 0xFF; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2120 p += incr; |
| 34972 | 2121 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2122 /* Sixth byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2123 *p = (flo >> 16) & 0xFF; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2124 p += incr; |
| 34972 | 2125 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2126 /* Seventh byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2127 *p = (flo >> 8) & 0xFF; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2128 p += incr; |
| 34972 | 2129 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2130 /* Eighth byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2131 *p = flo & 0xFF; |
|
68102
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
66704
diff
changeset
|
2132 /* p += incr; */ |
| 34972 | 2133 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2134 /* Done */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2135 return 0; |
| 34972 | 2136 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2137 Overflow: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2138 PyErr_SetString(PyExc_OverflowError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2139 "float too large to pack with d format"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2140 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2141 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2142 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2143 const char *s = (char*)&x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2144 int i, incr = 1; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2145 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2146 if ((double_format == ieee_little_endian_format && !le) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2147 || (double_format == ieee_big_endian_format && le)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2148 p += 7; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2149 incr = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2150 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2151 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2152 for (i = 0; i < 8; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2153 *p = *s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2154 p += incr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2155 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2156 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2157 } |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2158 } |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2159 |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2160 double |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2161 _PyFloat_Unpack4(const unsigned char *p, int le) |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2162 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2163 if (float_format == unknown_format) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2164 unsigned char sign; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2165 int e; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2166 unsigned int f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2167 double x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2168 int incr = 1; |
| 34972 | 2169 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2170 if (le) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2171 p += 3; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2172 incr = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2173 } |
| 34972 | 2174 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2175 /* First byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2176 sign = (*p >> 7) & 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2177 e = (*p & 0x7F) << 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2178 p += incr; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2179 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2180 /* Second byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2181 e |= (*p >> 7) & 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2182 f = (*p & 0x7F) << 16; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2183 p += incr; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2184 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2185 if (e == 255) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2186 PyErr_SetString( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2187 PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2188 "can't unpack IEEE 754 special value " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2189 "on non-IEEE platform"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2190 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2191 } |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2192 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2193 /* Third byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2194 f |= *p << 8; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2195 p += incr; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2196 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2197 /* Fourth byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2198 f |= *p; |
| 34972 | 2199 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2200 x = (double)f / 8388608.0; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2201 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2202 /* XXX This sadly ignores Inf/NaN issues */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2203 if (e == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2204 e = -126; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2205 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2206 x += 1.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2207 e -= 127; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2208 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2209 x = ldexp(x, e); |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2210 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2211 if (sign) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2212 x = -x; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2213 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2214 return x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2215 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2216 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2217 float x; |
| 35987 | 2218 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2219 if ((float_format == ieee_little_endian_format && !le) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2220 || (float_format == ieee_big_endian_format && le)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2221 char buf[4]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2222 char *d = &buf[3]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2223 int i; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2224 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2225 for (i = 0; i < 4; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2226 *d-- = *p++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2227 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2228 memcpy(&x, buf, 4); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2229 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2230 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2231 memcpy(&x, p, 4); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2232 } |
| 35987 | 2233 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2234 return x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2235 } |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2236 } |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2237 |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2238 double |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2239 _PyFloat_Unpack8(const unsigned char *p, int le) |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2240 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2241 if (double_format == unknown_format) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2242 unsigned char sign; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2243 int e; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2244 unsigned int fhi, flo; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2245 double x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2246 int incr = 1; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2247 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2248 if (le) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2249 p += 7; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2250 incr = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2251 } |
| 34972 | 2252 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2253 /* First byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2254 sign = (*p >> 7) & 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2255 e = (*p & 0x7F) << 4; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2256 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2257 p += incr; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2258 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2259 /* Second byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2260 e |= (*p >> 4) & 0xF; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2261 fhi = (*p & 0xF) << 24; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2262 p += incr; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2263 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2264 if (e == 2047) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2265 PyErr_SetString( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2266 PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2267 "can't unpack IEEE 754 special value " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2268 "on non-IEEE platform"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2269 return -1.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2270 } |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2271 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2272 /* Third byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2273 fhi |= *p << 16; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2274 p += incr; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2275 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2276 /* Fourth byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2277 fhi |= *p << 8; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2278 p += incr; |
| 34972 | 2279 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2280 /* Fifth byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2281 fhi |= *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2282 p += incr; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2283 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2284 /* Sixth byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2285 flo = *p << 16; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2286 p += incr; |
| 34972 | 2287 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2288 /* Seventh byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2289 flo |= *p << 8; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2290 p += incr; |
| 34972 | 2291 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2292 /* Eighth byte */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2293 flo |= *p; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2294 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2295 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2296 x /= 268435456.0; /* 2**28 */ |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2297 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2298 if (e == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2299 e = -1022; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2300 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2301 x += 1.0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2302 e -= 1023; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2303 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2304 x = ldexp(x, e); |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2305 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2306 if (sign) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2307 x = -x; |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2308 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2309 return x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2310 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2311 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2312 double x; |
| 35987 | 2313 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2314 if ((double_format == ieee_little_endian_format && !le) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2315 || (double_format == ieee_big_endian_format && le)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2316 char buf[8]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2317 char *d = &buf[7]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2318 int i; |
| 35987 | 2319 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2320 for (i = 0; i < 8; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2321 *d-- = *p++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2322 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2323 memcpy(&x, buf, 8); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2324 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2325 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2326 memcpy(&x, p, 8); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2327 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2328 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2329 return x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54232
diff
changeset
|
2330 } |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2331 } |
