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