Mercurial > cpython-lru_cache-weakref
annotate Objects/floatobject.c @ 46004:04c2148564e4 legacy-trunk
Test decimal.rst doctests as far as possible with sphinx doctest.
| author | Georg Brandl <georg@python.org> |
|---|---|
| date | Sat, 22 Mar 2008 11:47:10 +0000 |
| parents | 354e377c9590 |
| children | 6f131d2c3628 |
| 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" |
|
44670
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
8 #include "structseq.h" |
| 6 | 9 |
| 86 | 10 #include <ctype.h> |
| 44085 | 11 #include <float.h> |
| 6 | 12 |
|
45381
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
13 #include "formatter_string.h" |
|
44670
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
14 |
|
30979
86fdf8fe7f17
Getting rid of all the code inside #ifdef macintosh too.
Jack Jansen <jack.jansen@cwi.nl>
parents:
29641
diff
changeset
|
15 #if !defined(__STDC__) |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13256
diff
changeset
|
16 extern double fmod(double, double); |
|
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13256
diff
changeset
|
17 extern double pow(double, double); |
|
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 #endif |
|
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
|
19 |
|
44940
12099143724f
Add prototypes to get the mathmodule.c to compile on OSF1 5.1 (Tru64)
Neal Norwitz <nnorwitz@gmail.com>
parents:
44670
diff
changeset
|
20 #ifdef _OSF_SOURCE |
|
12099143724f
Add prototypes to get the mathmodule.c to compile on OSF1 5.1 (Tru64)
Neal Norwitz <nnorwitz@gmail.com>
parents:
44670
diff
changeset
|
21 /* OSF1 5.1 doesn't make this available with XOPEN_SOURCE_EXTENDED defined */ |
|
12099143724f
Add prototypes to get the mathmodule.c to compile on OSF1 5.1 (Tru64)
Neal Norwitz <nnorwitz@gmail.com>
parents:
44670
diff
changeset
|
22 extern int finite(double); |
|
12099143724f
Add prototypes to get the mathmodule.c to compile on OSF1 5.1 (Tru64)
Neal Norwitz <nnorwitz@gmail.com>
parents:
44670
diff
changeset
|
23 #endif |
|
12099143724f
Add prototypes to get the mathmodule.c to compile on OSF1 5.1 (Tru64)
Neal Norwitz <nnorwitz@gmail.com>
parents:
44670
diff
changeset
|
24 |
|
5504
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
25 /* Special free list -- see comments for same code in intobject.c. */ |
|
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
26 #define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */ |
|
10391
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
27 #define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */ |
|
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
|
28 #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
|
29 |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
30 struct _floatblock { |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
31 struct _floatblock *next; |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
32 PyFloatObject objects[N_FLOATOBJECTS]; |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
33 }; |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
34 |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
35 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
|
36 |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
37 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
|
38 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
|
39 |
|
5504
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
40 static PyFloatObject * |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
41 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
|
42 { |
|
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
43 PyFloatObject *p, *q; |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12248
diff
changeset
|
44 /* XXX Float blocks escape the object heap. Use PyObject_MALLOC ??? */ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12248
diff
changeset
|
45 p = (PyFloatObject *) PyMem_MALLOC(sizeof(PyFloatBlock)); |
|
5504
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
46 if (p == NULL) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12248
diff
changeset
|
47 return (PyFloatObject *) PyErr_NoMemory(); |
|
10391
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
48 ((PyFloatBlock *)p)->next = block_list; |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
49 block_list = (PyFloatBlock *)p; |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
50 p = &((PyFloatBlock *)p)->objects[0]; |
|
5504
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
51 q = p + N_FLOATOBJECTS; |
|
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
52 while (--q > p) |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
44344
diff
changeset
|
53 Py_TYPE(q) = (struct _typeobject *)(q-1); |
|
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
44344
diff
changeset
|
54 Py_TYPE(q) = NULL; |
|
5504
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
55 return p + N_FLOATOBJECTS - 1; |
|
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
56 } |
|
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
57 |
| 44085 | 58 double |
| 59 PyFloat_GetMax(void) | |
| 60 { | |
| 61 return DBL_MAX; | |
| 62 } | |
| 63 | |
| 64 double | |
| 65 PyFloat_GetMin(void) | |
| 66 { | |
| 67 return DBL_MIN; | |
| 68 } | |
| 69 | |
|
45060
c05ee77b39f2
The previous change was causing a segfault after multiple calls to Py_Initialize() and Py_Finalize().
Christian Heimes <christian@cheimes.de>
parents:
45059
diff
changeset
|
70 static PyTypeObject FloatInfoType = {0, 0, 0, 0, 0, 0}; |
|
44670
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
71 |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
72 PyDoc_STRVAR(floatinfo__doc__, |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
73 "sys.floatinfo\n\ |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
74 \n\ |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
75 A structseq holding information about the float type. It contains low level\n\ |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
76 information about the precision and internal representation. Please study\n\ |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
77 your system's :file:`float.h` for more information."); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
78 |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
79 static PyStructSequence_Field floatinfo_fields[] = { |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
80 {"max", "DBL_MAX -- maximum representable finite float"}, |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
81 {"max_exp", "DBL_MAX_EXP -- maximum int e such that radix**(e-1) " |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
82 "is representable"}, |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
83 {"max_10_exp", "DBL_MAX_10_EXP -- maximum int e such that 10**e " |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
84 "is representable"}, |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
85 {"min", "DBL_MIN -- Minimum positive normalizer float"}, |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
86 {"min_exp", "DBL_MIN_EXP -- minimum int e such that radix**(e-1) " |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
87 "is a normalized float"}, |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
88 {"min_10_exp", "DBL_MIN_10_EXP -- minimum int e such that 10**e is " |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
89 "a normalized"}, |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
90 {"dig", "DBL_DIG -- digits"}, |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
91 {"mant_dig", "DBL_MANT_DIG -- mantissa digits"}, |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
92 {"epsilon", "DBL_EPSILON -- Difference between 1 and the next " |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
93 "representable float"}, |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
94 {"radix", "FLT_RADIX -- radix of exponent"}, |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
95 {"rounds", "FLT_ROUNDS -- addition rounds"}, |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
96 {0} |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
97 }; |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
98 |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
99 static PyStructSequence_Desc floatinfo_desc = { |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
100 "sys.floatinfo", /* name */ |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
101 floatinfo__doc__, /* doc */ |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
102 floatinfo_fields, /* fields */ |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
103 11 |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
104 }; |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
105 |
| 44085 | 106 PyObject * |
| 107 PyFloat_GetInfo(void) | |
| 108 { | |
|
45060
c05ee77b39f2
The previous change was causing a segfault after multiple calls to Py_Initialize() and Py_Finalize().
Christian Heimes <christian@cheimes.de>
parents:
45059
diff
changeset
|
109 PyObject* floatinfo; |
|
44670
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
110 int pos = 0; |
| 44085 | 111 |
|
44670
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
112 floatinfo = PyStructSequence_New(&FloatInfoType); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
113 if (floatinfo == NULL) { |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
114 return NULL; |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
115 } |
| 44085 | 116 |
|
44670
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
117 #define SetIntFlag(flag) \ |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
118 PyStructSequence_SET_ITEM(floatinfo, pos++, PyInt_FromLong(flag)) |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
119 #define SetDblFlag(flag) \ |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
120 PyStructSequence_SET_ITEM(floatinfo, pos++, PyFloat_FromDouble(flag)) |
| 44085 | 121 |
|
44670
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
122 SetDblFlag(DBL_MAX); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
123 SetIntFlag(DBL_MAX_EXP); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
124 SetIntFlag(DBL_MAX_10_EXP); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
125 SetDblFlag(DBL_MIN); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
126 SetIntFlag(DBL_MIN_EXP); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
127 SetIntFlag(DBL_MIN_10_EXP); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
128 SetIntFlag(DBL_DIG); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
129 SetIntFlag(DBL_MANT_DIG); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
130 SetDblFlag(DBL_EPSILON); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
131 SetIntFlag(FLT_RADIX); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
132 SetIntFlag(FLT_ROUNDS); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
133 #undef SetIntFlag |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
134 #undef SetDblFlag |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
135 |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
136 if (PyErr_Occurred()) { |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
137 Py_CLEAR(floatinfo); |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
138 return NULL; |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
139 } |
|
d66e5837aa57
Now that I've learnt about structseq objects I felt like converting sys.float_info to a structseq. It's
Christian Heimes <christian@cheimes.de>
parents:
44488
diff
changeset
|
140 return floatinfo; |
| 44085 | 141 } |
| 142 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
143 PyObject * |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
144 PyFloat_FromDouble(double fval) |
| 6 | 145 { |
|
5504
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
146 register PyFloatObject *op; |
|
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
147 if (free_list == NULL) { |
|
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
148 if ((free_list = fill_free_list()) == NULL) |
|
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
149 return NULL; |
|
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
150 } |
|
24898
a869d2de536f
Call me anal, but there was a particular phrase that was speading to
Guido van Rossum <guido@python.org>
parents:
24280
diff
changeset
|
151 /* Inline PyObject_New */ |
|
5504
c88b9b868995
Faster floating point allocator, same idea as the int allocator.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
152 op = free_list; |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
44344
diff
changeset
|
153 free_list = (PyFloatObject *)Py_TYPE(op); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12248
diff
changeset
|
154 PyObject_INIT(op, &PyFloat_Type); |
| 27 | 155 op->ob_fval = fval; |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
156 return (PyObject *) op; |
| 6 | 157 } |
| 158 | |
|
14783
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
159 /************************************************************************** |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
160 RED_FLAG 22-Sep-2000 tim |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
161 PyFloat_FromString's pend argument is braindead. Prior to this RED_FLAG, |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
162 |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
163 1. If v was a regular string, *pend was set to point to its terminating |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
164 null byte. That's useless (the caller can find that without any |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
165 help from this function!). |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
166 |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
167 2. If v was a Unicode string, or an object convertible to a character |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
168 buffer, *pend was set to point into stack trash (the auto temp |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
169 vector holding the character buffer). That was downright dangerous. |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
170 |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
171 Since we can't change the interface of a public API function, pend is |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
172 still supported but now *officially* useless: if pend is not NULL, |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
173 *pend is set to NULL. |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
174 **************************************************************************/ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
175 PyObject * |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
176 PyFloat_FromString(PyObject *v, char **pend) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
177 { |
|
44344
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
178 const char *s, *last, *end, *sp; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
179 double x; |
|
14783
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
180 char buffer[256]; /* for errors */ |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
19051
diff
changeset
|
181 #ifdef Py_USING_UNICODE |
|
14783
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
182 char s_buffer[256]; /* for objects convertible to a char buffer */ |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
19051
diff
changeset
|
183 #endif |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36235
diff
changeset
|
184 Py_ssize_t len; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
185 |
|
14783
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
186 if (pend) |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
187 *pend = NULL; |
|
11969
74b7213fb609
Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
188 if (PyString_Check(v)) { |
|
74b7213fb609
Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
189 s = PyString_AS_STRING(v); |
|
74b7213fb609
Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
190 len = PyString_GET_SIZE(v); |
|
74b7213fb609
Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
191 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
19051
diff
changeset
|
192 #ifdef Py_USING_UNICODE |
|
12248
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
193 else if (PyUnicode_Check(v)) { |
|
37815
20cb13bdf1f0
C++ compiler cleanup: bunch-o-casts, plus use of unsigned loop index var in a couple places
Skip Montanaro <skip@pobox.com>
parents:
37589
diff
changeset
|
194 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) { |
|
12248
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
195 PyErr_SetString(PyExc_ValueError, |
|
14783
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
196 "Unicode float() literal too long to convert"); |
|
12248
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
197 return NULL; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
198 } |
|
14783
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
199 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v), |
|
12248
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
200 PyUnicode_GET_SIZE(v), |
|
20823
c7aa332a2ffa
SF bug #477221: abs and divmod act oddly with -0.0.
Tim Peters <tim.peters@gmail.com>
parents:
20654
diff
changeset
|
201 s_buffer, |
|
12248
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
202 NULL)) |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
203 return NULL; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
204 s = s_buffer; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36235
diff
changeset
|
205 len = strlen(s); |
|
12248
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
206 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
19051
diff
changeset
|
207 #endif |
|
11969
74b7213fb609
Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
208 else if (PyObject_AsCharBuffer(v, &s, &len)) { |
|
74b7213fb609
Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
209 PyErr_SetString(PyExc_TypeError, |
|
23344
bffc7236c4ba
clarify message when raising TypeError to indicate that float() accepts
Skip Montanaro <skip@pobox.com>
parents:
22228
diff
changeset
|
210 "float() argument must be a string or a number"); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
211 return NULL; |
|
11969
74b7213fb609
Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
212 } |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
213 |
|
11969
74b7213fb609
Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
214 last = s + len; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
215 while (*s && isspace(Py_CHARMASK(*s))) |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
216 s++; |
|
14783
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
217 if (*s == '\0') { |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
218 PyErr_SetString(PyExc_ValueError, "empty string for float()"); |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
219 return NULL; |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
220 } |
|
44344
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
221 sp = s; |
|
14783
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
222 /* We don't care about overflow or underflow. If the platform supports |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
223 * them, infinities and signed zeroes (on underflow) are fine. |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
224 * However, strtod can return 0 for denormalized numbers, where atof |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
225 * does not. So (alas!) we special-case a zero result. Note that |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
226 * whether strtod sets errno on underflow is not defined, so we can't |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
227 * key off errno. |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
228 */ |
|
14851
5449302c4d2e
Replace SIGFPE paranoia around strtod and atof. I don't believe these
Tim Peters <tim.peters@gmail.com>
parents:
14783
diff
changeset
|
229 PyFPE_START_PROTECT("strtod", return NULL) |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
32150
diff
changeset
|
230 x = PyOS_ascii_strtod(s, (char **)&end); |
|
14851
5449302c4d2e
Replace SIGFPE paranoia around strtod and atof. I don't believe these
Tim Peters <tim.peters@gmail.com>
parents:
14783
diff
changeset
|
231 PyFPE_END_PROTECT(x) |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
232 errno = 0; |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
233 /* Believe it or not, Solaris 2.6 can move end *beyond* the null |
|
14783
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
234 byte at the end of the string, when the input is inf(inity). */ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
235 if (end > last) |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
236 end = last; |
|
44344
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
237 /* Check for inf and nan. This is done late because it rarely happens. */ |
|
14783
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
238 if (end == s) { |
|
44344
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
239 char *p = (char*)sp; |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
240 int sign = 1; |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
241 |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
242 if (*p == '-') { |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
243 sign = -1; |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
244 p++; |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
245 } |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
246 if (*p == '+') { |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
247 p++; |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
248 } |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
249 if (PyOS_strnicmp(p, "inf", 4) == 0) { |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
250 return PyFloat_FromDouble(sign * Py_HUGE_VAL); |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
251 } |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
252 #ifdef Py_NAN |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
253 if(PyOS_strnicmp(p, "nan", 4) == 0) { |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
254 return PyFloat_FromDouble(Py_NAN); |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
255 } |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
256 #endif |
|
21079
8cef75cacb01
PyFloat_FromString(): Conversion of sprintf() to PyOS_snprintf() for
Barry Warsaw <barry@python.org>
parents:
20829
diff
changeset
|
257 PyOS_snprintf(buffer, sizeof(buffer), |
|
8cef75cacb01
PyFloat_FromString(): Conversion of sprintf() to PyOS_snprintf() for
Barry Warsaw <barry@python.org>
parents:
20829
diff
changeset
|
258 "invalid literal for float(): %.200s", s); |
|
14783
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
259 PyErr_SetString(PyExc_ValueError, buffer); |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
260 return NULL; |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
261 } |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
262 /* Since end != s, the platform made *some* kind of sense out |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
263 of the input. Trust it. */ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
264 while (*end && isspace(Py_CHARMASK(*end))) |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
265 end++; |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
266 if (*end != '\0') { |
|
21079
8cef75cacb01
PyFloat_FromString(): Conversion of sprintf() to PyOS_snprintf() for
Barry Warsaw <barry@python.org>
parents:
20829
diff
changeset
|
267 PyOS_snprintf(buffer, sizeof(buffer), |
|
8cef75cacb01
PyFloat_FromString(): Conversion of sprintf() to PyOS_snprintf() for
Barry Warsaw <barry@python.org>
parents:
20829
diff
changeset
|
268 "invalid literal for float(): %.200s", s); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
269 PyErr_SetString(PyExc_ValueError, buffer); |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
270 return NULL; |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
271 } |
|
11969
74b7213fb609
Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
272 else if (end != last) { |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
273 PyErr_SetString(PyExc_ValueError, |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
274 "null byte in argument for float()"); |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
275 return NULL; |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
276 } |
|
14783
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
277 if (x == 0.0) { |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
278 /* See above -- may have been strtod being anal |
|
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
279 about denorms. */ |
|
14851
5449302c4d2e
Replace SIGFPE paranoia around strtod and atof. I don't believe these
Tim Peters <tim.peters@gmail.com>
parents:
14783
diff
changeset
|
280 PyFPE_START_PROTECT("atof", return NULL) |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
32150
diff
changeset
|
281 x = PyOS_ascii_atof(s); |
|
14851
5449302c4d2e
Replace SIGFPE paranoia around strtod and atof. I don't believe these
Tim Peters <tim.peters@gmail.com>
parents:
14783
diff
changeset
|
282 PyFPE_END_PROTECT(x) |
|
14783
77eddddbb7cc
Fix for SF bug 110624: float literals behave inconsistently.
Tim Peters <tim.peters@gmail.com>
parents:
14616
diff
changeset
|
283 errno = 0; /* whether atof ever set errno is undefined */ |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
284 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
285 return PyFloat_FromDouble(x); |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
286 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
10833
diff
changeset
|
287 |
|
1313
6ee380349c84
* Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents:
1271
diff
changeset
|
288 static void |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
289 float_dealloc(PyFloatObject *op) |
|
745
c7b23cc8cded
answer lint's complaints
Guido van Rossum <guido@python.org>
parents:
632
diff
changeset
|
290 { |
|
20277
2983b54256c7
Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents:
19976
diff
changeset
|
291 if (PyFloat_CheckExact(op)) { |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
44344
diff
changeset
|
292 Py_TYPE(op) = (struct _typeobject *)free_list; |
|
20277
2983b54256c7
Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents:
19976
diff
changeset
|
293 free_list = op; |
|
2983b54256c7
Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents:
19976
diff
changeset
|
294 } |
|
2983b54256c7
Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents:
19976
diff
changeset
|
295 else |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
44344
diff
changeset
|
296 Py_TYPE(op)->tp_free((PyObject *)op); |
|
745
c7b23cc8cded
answer lint's complaints
Guido van Rossum <guido@python.org>
parents:
632
diff
changeset
|
297 } |
|
c7b23cc8cded
answer lint's complaints
Guido van Rossum <guido@python.org>
parents:
632
diff
changeset
|
298 |
| 6 | 299 double |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
300 PyFloat_AsDouble(PyObject *op) |
| 6 | 301 { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
302 PyNumberMethods *nb; |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
303 PyFloatObject *fo; |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1347
diff
changeset
|
304 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
|
305 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
306 if (op && PyFloat_Check(op)) |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
307 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
|
308 |
|
26272
fbccef8b3153
Improve exception message raised by PyFloat_AsDouble if the object does not
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
24898
diff
changeset
|
309 if (op == NULL) { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
310 PyErr_BadArgument(); |
| 6 | 311 return -1; |
| 312 } | |
|
20823
c7aa332a2ffa
SF bug #477221: abs and divmod act oddly with -0.0.
Tim Peters <tim.peters@gmail.com>
parents:
20654
diff
changeset
|
313 |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
44344
diff
changeset
|
314 if ((nb = Py_TYPE(op)->tp_as_number) == NULL || nb->nb_float == NULL) { |
|
26272
fbccef8b3153
Improve exception message raised by PyFloat_AsDouble if the object does not
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
24898
diff
changeset
|
315 PyErr_SetString(PyExc_TypeError, "a float is required"); |
|
fbccef8b3153
Improve exception message raised by PyFloat_AsDouble if the object does not
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
24898
diff
changeset
|
316 return -1; |
|
fbccef8b3153
Improve exception message raised by PyFloat_AsDouble if the object does not
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
24898
diff
changeset
|
317 } |
|
fbccef8b3153
Improve exception message raised by PyFloat_AsDouble if the object does not
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
24898
diff
changeset
|
318 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
319 fo = (PyFloatObject*) (*nb->nb_float) (op); |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1347
diff
changeset
|
320 if (fo == NULL) |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1347
diff
changeset
|
321 return -1; |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
322 if (!PyFloat_Check(fo)) { |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
323 PyErr_SetString(PyExc_TypeError, |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
324 "nb_float should return float object"); |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1347
diff
changeset
|
325 return -1; |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1347
diff
changeset
|
326 } |
|
20823
c7aa332a2ffa
SF bug #477221: abs and divmod act oddly with -0.0.
Tim Peters <tim.peters@gmail.com>
parents:
20654
diff
changeset
|
327 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
328 val = PyFloat_AS_DOUBLE(fo); |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
329 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
|
330 |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1347
diff
changeset
|
331 return val; |
| 6 | 332 } |
| 333 | |
| 334 /* Methods */ | |
| 335 | |
|
21097
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
336 static void |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
337 format_float(char *buf, size_t buflen, PyFloatObject *v, int precision) |
| 6 | 338 { |
| 339 register char *cp; | |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
32150
diff
changeset
|
340 char format[32]; |
|
44344
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
341 int i; |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
342 |
| 6 | 343 /* Subroutine for float_repr and float_print. |
| 344 We want float numbers to be recognizable as such, | |
| 345 i.e., they should contain a decimal point or an exponent. | |
| 346 However, %g may print the number as an integer; | |
| 347 in such cases, we append ".0" to the string. */ | |
|
21097
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
348 |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
349 assert(PyFloat_Check(v)); |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
32150
diff
changeset
|
350 PyOS_snprintf(format, 32, "%%.%ig", precision); |
|
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
32150
diff
changeset
|
351 PyOS_ascii_formatd(buf, buflen, format, v->ob_fval); |
| 6 | 352 cp = buf; |
| 353 if (*cp == '-') | |
| 354 cp++; | |
| 355 for (; *cp != '\0'; cp++) { | |
| 356 /* Any non-digit means it's not an integer; | |
| 357 this takes care of NAN and INF as well. */ | |
|
2308
14b126d0b5be
use Py_CHARMASK; and don't check for neg. float to the float power here
Guido van Rossum <guido@python.org>
parents:
2156
diff
changeset
|
358 if (!isdigit(Py_CHARMASK(*cp))) |
| 6 | 359 break; |
| 360 } | |
| 361 if (*cp == '\0') { | |
| 362 *cp++ = '.'; | |
| 363 *cp++ = '0'; | |
| 364 *cp++ = '\0'; | |
|
44344
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
365 return; |
| 6 | 366 } |
|
44344
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
367 /* Checking the next three chars should be more than enough to |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
368 * detect inf or nan, even on Windows. We check for inf or nan |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
369 * at last because they are rare cases. |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
370 */ |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
371 for (i=0; *cp != '\0' && i<3; cp++, i++) { |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
372 if (isdigit(Py_CHARMASK(*cp)) || *cp == '.') |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
373 continue; |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
374 /* found something that is neither a digit nor point |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
375 * it might be a NaN or INF |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
376 */ |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
377 #ifdef Py_NAN |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
378 if (Py_IS_NAN(v->ob_fval)) { |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
379 strcpy(buf, "nan"); |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
380 } |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
381 else |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
382 #endif |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
383 if (Py_IS_INFINITY(v->ob_fval)) { |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
384 cp = buf; |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
385 if (*cp == '-') |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
386 cp++; |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
387 strcpy(cp, "inf"); |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
388 } |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
389 break; |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
390 } |
|
1d69aabf6f7f
Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).
Christian Heimes <christian@cheimes.de>
parents:
44267
diff
changeset
|
391 |
| 6 | 392 } |
| 393 | |
|
21097
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
394 /* XXX PyFloat_AsStringEx should not be a public API function (for one |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
395 XXX thing, its signature passes a buffer without a length; for another, |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
396 XXX it isn't useful outside this file). |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
397 */ |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
398 void |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
399 PyFloat_AsStringEx(char *buf, PyFloatObject *v, int precision) |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
400 { |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
401 format_float(buf, 100, v, precision); |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
402 } |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
403 |
|
44267
f909872917b9
The new float repr causes too much trouble and pain. I'm disabling the feature until we have sorted out the issues on all machines. 64bit machines seem to have issues and Guido has reported even worse.
Christian Heimes <christian@cheimes.de>
parents:
44262
diff
changeset
|
404 #ifdef Py_BROKEN_REPR |
|
44262
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
405 /* The following function is based on Tcl_PrintDouble, |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
406 * from tclUtil.c. |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
407 */ |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
408 |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
409 #define is_infinite(d) ( (d) > DBL_MAX || (d) < -DBL_MAX ) |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
410 #define is_nan(d) ((d) != (d)) |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
411 |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
412 static void |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
413 format_double_repr(char *dst, double value) |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
414 { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
415 char *p, c; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
416 int exp; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
417 int signum; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
418 char buffer[30]; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
419 |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
420 /* |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
421 * Handle NaN. |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
422 */ |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
423 |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
424 if (is_nan(value)) { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
425 strcpy(dst, "nan"); |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
426 return; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
427 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
428 |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
429 /* |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
430 * Handle infinities. |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
431 */ |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
432 |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
433 if (is_infinite(value)) { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
434 if (value < 0) { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
435 strcpy(dst, "-inf"); |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
436 } else { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
437 strcpy(dst, "inf"); |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
438 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
439 return; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
440 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
441 |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
442 /* |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
443 * Ordinary (normal and denormal) values. |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
444 */ |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
445 |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
446 exp = _PyFloat_Digits(buffer, value, &signum)+1; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
447 if (signum) { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
448 *dst++ = '-'; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
449 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
450 p = buffer; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
451 if (exp < -3 || exp > 17) { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
452 /* |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
453 * E format for numbers < 1e-3 or >= 1e17. |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
454 */ |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
455 |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
456 *dst++ = *p++; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
457 c = *p; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
458 if (c != '\0') { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
459 *dst++ = '.'; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
460 while (c != '\0') { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
461 *dst++ = c; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
462 c = *++p; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
463 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
464 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
465 sprintf(dst, "e%+d", exp-1); |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
466 } else { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
467 /* |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
468 * F format for others. |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
469 */ |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
470 |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
471 if (exp <= 0) { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
472 *dst++ = '0'; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
473 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
474 c = *p; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
475 while (exp-- > 0) { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
476 if (c != '\0') { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
477 *dst++ = c; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
478 c = *++p; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
479 } else { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
480 *dst++ = '0'; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
481 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
482 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
483 *dst++ = '.'; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
484 if (c == '\0') { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
485 *dst++ = '0'; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
486 } else { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
487 while (++exp < 0) { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
488 *dst++ = '0'; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
489 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
490 while (c != '\0') { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
491 *dst++ = c; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
492 c = *++p; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
493 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
494 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
495 *dst++ = '\0'; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
496 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
497 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
498 |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
499 static void |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
500 format_float_repr(char *buf, PyFloatObject *v) |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
501 { |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
502 assert(PyFloat_Check(v)); |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
503 format_double_repr(buf, PyFloat_AS_DOUBLE(v)); |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
504 } |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
505 |
|
44267
f909872917b9
The new float repr causes too much trouble and pain. I'm disabling the feature until we have sorted out the issues on all machines. 64bit machines seem to have issues and Guido has reported even worse.
Christian Heimes <christian@cheimes.de>
parents:
44262
diff
changeset
|
506 #endif /* Py_BROKEN_REPR */ |
|
f909872917b9
The new float repr causes too much trouble and pain. I'm disabling the feature until we have sorted out the issues on all machines. 64bit machines seem to have issues and Guido has reported even worse.
Christian Heimes <christian@cheimes.de>
parents:
44262
diff
changeset
|
507 |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
508 /* Macro and helper that convert PyObject obj to a C double and store |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
509 the value in dbl; this replaces the functionality of the coercion |
|
21354
fbddb64d21c2
float_floor_div: An expression like 3.//1j crashed the interpreter, or
Tim Peters <tim.peters@gmail.com>
parents:
21353
diff
changeset
|
510 slot function. If conversion to double raises an exception, obj is |
|
fbddb64d21c2
float_floor_div: An expression like 3.//1j crashed the interpreter, or
Tim Peters <tim.peters@gmail.com>
parents:
21353
diff
changeset
|
511 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
|
512 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
|
513 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
|
514 */ |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
515 #define CONVERT_TO_DOUBLE(obj, dbl) \ |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
516 if (PyFloat_Check(obj)) \ |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
517 dbl = PyFloat_AS_DOUBLE(obj); \ |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
518 else if (convert_to_double(&(obj), &(dbl)) < 0) \ |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
519 return obj; |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
520 |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
521 static int |
|
19674
715244108faa
Raise OverflowError when appropriate on long->float conversion. Most of
Tim Peters <tim.peters@gmail.com>
parents:
19673
diff
changeset
|
522 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
|
523 { |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
524 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
|
525 |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
526 if (PyInt_Check(obj)) { |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
527 *dbl = (double)PyInt_AS_LONG(obj); |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
528 } |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
529 else if (PyLong_Check(obj)) { |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
530 *dbl = PyLong_AsDouble(obj); |
|
19674
715244108faa
Raise OverflowError when appropriate on long->float conversion. Most of
Tim Peters <tim.peters@gmail.com>
parents:
19673
diff
changeset
|
531 if (*dbl == -1.0 && PyErr_Occurred()) { |
|
715244108faa
Raise OverflowError when appropriate on long->float conversion. Most of
Tim Peters <tim.peters@gmail.com>
parents:
19673
diff
changeset
|
532 *v = NULL; |
|
715244108faa
Raise OverflowError when appropriate on long->float conversion. Most of
Tim Peters <tim.peters@gmail.com>
parents:
19673
diff
changeset
|
533 return -1; |
|
715244108faa
Raise OverflowError when appropriate on long->float conversion. Most of
Tim Peters <tim.peters@gmail.com>
parents:
19673
diff
changeset
|
534 } |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
535 } |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
536 else { |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
537 Py_INCREF(Py_NotImplemented); |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
538 *v = Py_NotImplemented; |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
539 return -1; |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
540 } |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
541 return 0; |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
542 } |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
543 |
|
11631
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
544 /* Precisions used by repr() and str(), respectively. |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
545 |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
546 The repr() precision (17 significant decimal digits) is the minimal number |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
547 that is guaranteed to have enough precision so that if the number is read |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
548 back in the exact same binary value is recreated. This is true for IEEE |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
549 floating point by design, and also happens to work for all other modern |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
550 hardware. |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
551 |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
552 The str() precision is chosen so that in most cases, the rounding noise |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
553 created by various operations is suppressed, while giving plenty of |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
554 precision for practical use. |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
555 |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
556 */ |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
557 |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
558 #define PREC_REPR 17 |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
559 #define PREC_STR 12 |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
560 |
|
21097
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
561 /* XXX PyFloat_AsString and PyFloat_AsReprString should be deprecated: |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
562 XXX they pass a char buffer without passing a length. |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
563 */ |
|
11631
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
564 void |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
565 PyFloat_AsString(char *buf, 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
|
566 { |
|
21097
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
567 format_float(buf, 100, v, PREC_STR); |
|
11631
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
568 } |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
569 |
|
17707
fe4c1034b480
SF bug #422177: Results from .pyc differs from .py
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
570 void |
|
fe4c1034b480
SF bug #422177: Results from .pyc differs from .py
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
571 PyFloat_AsReprString(char *buf, PyFloatObject *v) |
|
fe4c1034b480
SF bug #422177: Results from .pyc differs from .py
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
572 { |
|
21097
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
573 format_float(buf, 100, v, PREC_REPR); |
|
17707
fe4c1034b480
SF bug #422177: Results from .pyc differs from .py
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
574 } |
|
fe4c1034b480
SF bug #422177: Results from .pyc differs from .py
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
575 |
|
745
c7b23cc8cded
answer lint's complaints
Guido van Rossum <guido@python.org>
parents:
632
diff
changeset
|
576 /* ARGSUSED */ |
|
284
6ac402023cac
printobject now returns an error code
Guido van Rossum <guido@python.org>
parents:
268
diff
changeset
|
577 static int |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
578 float_print(PyFloatObject *v, FILE *fp, int flags) |
| 6 | 579 { |
| 580 char buf[100]; | |
|
21097
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
581 format_float(buf, sizeof(buf), v, |
|
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
582 (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR); |
|
43378
7630248b593c
Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents:
42333
diff
changeset
|
583 Py_BEGIN_ALLOW_THREADS |
| 6 | 584 fputs(buf, fp); |
|
43378
7630248b593c
Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents:
42333
diff
changeset
|
585 Py_END_ALLOW_THREADS |
|
284
6ac402023cac
printobject now returns an error code
Guido van Rossum <guido@python.org>
parents:
268
diff
changeset
|
586 return 0; |
| 6 | 587 } |
| 588 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
589 static PyObject * |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
590 float_repr(PyFloatObject *v) |
| 6 | 591 { |
|
44267
f909872917b9
The new float repr causes too much trouble and pain. I'm disabling the feature until we have sorted out the issues on all machines. 64bit machines seem to have issues and Guido has reported even worse.
Christian Heimes <christian@cheimes.de>
parents:
44262
diff
changeset
|
592 #ifdef Py_BROKEN_REPR |
|
44262
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
593 char buf[30]; |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
594 format_float_repr(buf, v); |
|
44267
f909872917b9
The new float repr causes too much trouble and pain. I'm disabling the feature until we have sorted out the issues on all machines. 64bit machines seem to have issues and Guido has reported even worse.
Christian Heimes <christian@cheimes.de>
parents:
44262
diff
changeset
|
595 #else |
|
f909872917b9
The new float repr causes too much trouble and pain. I'm disabling the feature until we have sorted out the issues on all machines. 64bit machines seem to have issues and Guido has reported even worse.
Christian Heimes <christian@cheimes.de>
parents:
44262
diff
changeset
|
596 char buf[100]; |
|
f909872917b9
The new float repr causes too much trouble and pain. I'm disabling the feature until we have sorted out the issues on all machines. 64bit machines seem to have issues and Guido has reported even worse.
Christian Heimes <christian@cheimes.de>
parents:
44262
diff
changeset
|
597 format_float(buf, sizeof(buf), v, PREC_REPR); |
|
f909872917b9
The new float repr causes too much trouble and pain. I'm disabling the feature until we have sorted out the issues on all machines. 64bit machines seem to have issues and Guido has reported even worse.
Christian Heimes <christian@cheimes.de>
parents:
44262
diff
changeset
|
598 #endif |
|
f909872917b9
The new float repr causes too much trouble and pain. I'm disabling the feature until we have sorted out the issues on all machines. 64bit machines seem to have issues and Guido has reported even worse.
Christian Heimes <christian@cheimes.de>
parents:
44262
diff
changeset
|
599 |
|
11631
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
600 return PyString_FromString(buf); |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
601 } |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
602 |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
603 static PyObject * |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
604 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
|
605 { |
|
cf7a0f1b7b48
Implement the other easy thing: repr() of a float now uses %.17g,
Guido van Rossum <guido@python.org>
parents:
11383
diff
changeset
|
606 char buf[100]; |
|
21097
9ba3c82946b8
PyFloat_AsStringEx(): This function takes an output char* but doesn't
Tim Peters <tim.peters@gmail.com>
parents:
21079
diff
changeset
|
607 format_float(buf, sizeof(buf), v, PREC_STR); |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
608 return PyString_FromString(buf); |
| 6 | 609 } |
| 610 | |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
611 /* 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
|
612 * 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
|
613 * 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
|
614 * 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
|
615 * 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
|
616 * 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
|
617 * 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
|
618 * 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
|
619 * 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
|
620 * 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
|
621 * 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
|
622 * 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
|
623 * 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
|
624 */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
625 |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
626 static PyObject* |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
627 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
|
628 { |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
629 double i, j; |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
630 int r = 0; |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
631 |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
632 assert(PyFloat_Check(v)); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
633 i = PyFloat_AS_DOUBLE(v); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
634 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
635 /* Switch on the type of w. Set i and j to doubles to be compared, |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
636 * and op to the richcomp to use. |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
637 */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
638 if (PyFloat_Check(w)) |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
639 j = PyFloat_AS_DOUBLE(w); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
640 |
|
38293
688f25757104
Added a new macro, Py_IS_FINITE(X). On windows there is an intrinsic for this and it is more efficient than to use !Py_IS_INFINITE(X) && !Py_IS_NAN(X). No change on other platforms
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
37815
diff
changeset
|
641 else if (!Py_IS_FINITE(i)) { |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
642 if (PyInt_Check(w) || PyLong_Check(w)) |
|
33549
ecaf0e8fa737
float_richcompare(): Use the new Py_IS_NAN macro to ensure that, on
Tim Peters <tim.peters@gmail.com>
parents:
33547
diff
changeset
|
643 /* If i is an infinity, its magnitude exceeds any |
|
ecaf0e8fa737
float_richcompare(): Use the new Py_IS_NAN macro to ensure that, on
Tim Peters <tim.peters@gmail.com>
parents:
33547
diff
changeset
|
644 * finite integer, so it doesn't matter which int we |
|
ecaf0e8fa737
float_richcompare(): Use the new Py_IS_NAN macro to ensure that, on
Tim Peters <tim.peters@gmail.com>
parents:
33547
diff
changeset
|
645 * compare i with. If i is a NaN, similarly. |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
646 */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
647 j = 0.0; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
648 else |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
649 goto Unimplemented; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
650 } |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
651 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
652 else if (PyInt_Check(w)) { |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
653 long jj = PyInt_AS_LONG(w); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
654 /* In the worst realistic case I can imagine, C double is a |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
655 * Cray single with 48 bits of precision, and long has 64 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
656 * bits. |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
657 */ |
|
33549
ecaf0e8fa737
float_richcompare(): Use the new Py_IS_NAN macro to ensure that, on
Tim Peters <tim.peters@gmail.com>
parents:
33547
diff
changeset
|
658 #if SIZEOF_LONG > 6 |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
659 unsigned long abs = (unsigned long)(jj < 0 ? -jj : jj); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
660 if (abs >> 48) { |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
661 /* Needs more than 48 bits. Make it take the |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
662 * PyLong path. |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
663 */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
664 PyObject *result; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
665 PyObject *ww = PyLong_FromLong(jj); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
666 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
667 if (ww == NULL) |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
668 return NULL; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
669 result = float_richcompare(v, ww, op); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
670 Py_DECREF(ww); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
671 return result; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
672 } |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
673 #endif |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
674 j = (double)jj; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
675 assert((long)j == jj); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
676 } |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
677 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
678 else if (PyLong_Check(w)) { |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
679 int vsign = i == 0.0 ? 0 : i < 0.0 ? -1 : 1; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
680 int wsign = _PyLong_Sign(w); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
681 size_t nbits; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
682 int exponent; |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
683 |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
684 if (vsign != wsign) { |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
685 /* Magnitudes are irrelevant -- the signs alone |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
686 * determine the outcome. |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
687 */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
688 i = (double)vsign; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
689 j = (double)wsign; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
690 goto Compare; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
691 } |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
692 /* The signs are the same. */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
693 /* Convert w to a double if it fits. In particular, 0 fits. */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
694 nbits = _PyLong_NumBits(w); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
695 if (nbits == (size_t)-1 && PyErr_Occurred()) { |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
696 /* This long is so large that size_t isn't big enough |
|
33549
ecaf0e8fa737
float_richcompare(): Use the new Py_IS_NAN macro to ensure that, on
Tim Peters <tim.peters@gmail.com>
parents:
33547
diff
changeset
|
697 * to hold the # of bits. Replace with little doubles |
|
ecaf0e8fa737
float_richcompare(): Use the new Py_IS_NAN macro to ensure that, on
Tim Peters <tim.peters@gmail.com>
parents:
33547
diff
changeset
|
698 * that give the same outcome -- w is so large that |
|
ecaf0e8fa737
float_richcompare(): Use the new Py_IS_NAN macro to ensure that, on
Tim Peters <tim.peters@gmail.com>
parents:
33547
diff
changeset
|
699 * its magnitude must exceed the magnitude of any |
|
ecaf0e8fa737
float_richcompare(): Use the new Py_IS_NAN macro to ensure that, on
Tim Peters <tim.peters@gmail.com>
parents:
33547
diff
changeset
|
700 * finite float. |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
701 */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
702 PyErr_Clear(); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
703 i = (double)vsign; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
704 assert(wsign != 0); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
705 j = wsign * 2.0; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
706 goto Compare; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
707 } |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
708 if (nbits <= 48) { |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
709 j = PyLong_AsDouble(w); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
710 /* It's impossible that <= 48 bits overflowed. */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
711 assert(j != -1.0 || ! PyErr_Occurred()); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
712 goto Compare; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
713 } |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
714 assert(wsign != 0); /* else nbits was 0 */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
715 assert(vsign != 0); /* if vsign were 0, then since wsign is |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
716 * not 0, we would have taken the |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
717 * vsign != wsign branch at the start */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
718 /* We want to work with non-negative numbers. */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
719 if (vsign < 0) { |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
720 /* "Multiply both sides" by -1; this also swaps the |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
721 * comparator. |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
722 */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
723 i = -i; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
724 op = _Py_SwappedOp[op]; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
725 } |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
726 assert(i > 0.0); |
|
36235
9f66bdd5a061
Fix icc warnings: remove unused variable
Neal Norwitz <nnorwitz@gmail.com>
parents:
35999
diff
changeset
|
727 (void) frexp(i, &exponent); |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
728 /* exponent is the # of bits in v before the radix point; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
729 * we know that nbits (the # of bits in w) > 48 at this point |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
730 */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
731 if (exponent < 0 || (size_t)exponent < nbits) { |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
732 i = 1.0; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
733 j = 2.0; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
734 goto Compare; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
735 } |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
736 if ((size_t)exponent > nbits) { |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
737 i = 2.0; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
738 j = 1.0; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
739 goto Compare; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
740 } |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
741 /* v and w have the same number of bits before the radix |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
742 * point. Construct two longs that have the same comparison |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
743 * outcome. |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
744 */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
745 { |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
746 double fracpart; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
747 double intpart; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
748 PyObject *result = NULL; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
749 PyObject *one = NULL; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
750 PyObject *vv = NULL; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
751 PyObject *ww = w; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
752 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
753 if (wsign < 0) { |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
754 ww = PyNumber_Negative(w); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
755 if (ww == NULL) |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
756 goto Error; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
757 } |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
758 else |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
759 Py_INCREF(ww); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
760 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
761 fracpart = modf(i, &intpart); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
762 vv = PyLong_FromDouble(intpart); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
763 if (vv == NULL) |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
764 goto Error; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
765 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
766 if (fracpart != 0.0) { |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
767 /* Shift left, and or a 1 bit into vv |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
768 * to represent the lost fraction. |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
769 */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
770 PyObject *temp; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
771 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
772 one = PyInt_FromLong(1); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
773 if (one == NULL) |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
774 goto Error; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
775 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
776 temp = PyNumber_Lshift(ww, one); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
777 if (temp == NULL) |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
778 goto Error; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
779 Py_DECREF(ww); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
780 ww = temp; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
781 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
782 temp = PyNumber_Lshift(vv, one); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
783 if (temp == NULL) |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
784 goto Error; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
785 Py_DECREF(vv); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
786 vv = temp; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
787 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
788 temp = PyNumber_Or(vv, one); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
789 if (temp == NULL) |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
790 goto Error; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
791 Py_DECREF(vv); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
792 vv = temp; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
793 } |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
794 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
795 r = PyObject_RichCompareBool(vv, ww, op); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
796 if (r < 0) |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
797 goto Error; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
798 result = PyBool_FromLong(r); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
799 Error: |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
800 Py_XDECREF(vv); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
801 Py_XDECREF(ww); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
802 Py_XDECREF(one); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
803 return result; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
804 } |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
805 } /* else if (PyLong_Check(w)) */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
806 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
807 else /* w isn't float, int, or long */ |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
808 goto Unimplemented; |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
809 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
810 Compare: |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
811 PyFPE_START_PROTECT("richcompare", return NULL) |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
812 switch (op) { |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
813 case Py_EQ: |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
814 r = i == j; |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
815 break; |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
816 case Py_NE: |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
817 r = i != j; |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
818 break; |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
819 case Py_LE: |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
820 r = i <= j; |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
821 break; |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
822 case Py_GE: |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
823 r = i >= j; |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
824 break; |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
825 case Py_LT: |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
826 r = i < j; |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
827 break; |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
828 case Py_GT: |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
829 r = i > j; |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
830 break; |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
831 } |
|
31589
ca3c998afa55
Pass a variable that actually exists to PyFPE_END_PROTECT in
Michael W. Hudson <mwh@python.net>
parents:
31553
diff
changeset
|
832 PyFPE_END_PROTECT(r) |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
833 return PyBool_FromLong(r); |
|
33547
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
834 |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
835 Unimplemented: |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
836 Py_INCREF(Py_NotImplemented); |
|
702367da2c72
SF bug #513866: Float/long comparison anomaly.
Tim Peters <tim.peters@gmail.com>
parents:
32533
diff
changeset
|
837 return Py_NotImplemented; |
|
31553
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
838 } |
|
a6d8d5ace6a7
"Fix" (for certain configurations of the planets, including
Michael W. Hudson <mwh@python.net>
parents:
31384
diff
changeset
|
839 |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1252
diff
changeset
|
840 static long |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
841 float_hash(PyFloatObject *v) |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1252
diff
changeset
|
842 { |
|
13976
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13944
diff
changeset
|
843 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
|
844 } |
|
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1252
diff
changeset
|
845 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
846 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
847 float_add(PyObject *v, PyObject *w) |
| 6 | 848 { |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
849 double a,b; |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
850 CONVERT_TO_DOUBLE(v, a); |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
851 CONVERT_TO_DOUBLE(w, b); |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
852 PyFPE_START_PROTECT("add", return 0) |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
853 a = a + b; |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
854 PyFPE_END_PROTECT(a) |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
855 return PyFloat_FromDouble(a); |
| 6 | 856 } |
| 857 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
858 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
859 float_sub(PyObject *v, PyObject *w) |
| 6 | 860 { |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
861 double a,b; |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
862 CONVERT_TO_DOUBLE(v, a); |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
863 CONVERT_TO_DOUBLE(w, b); |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
864 PyFPE_START_PROTECT("subtract", return 0) |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
865 a = a - b; |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
866 PyFPE_END_PROTECT(a) |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
867 return PyFloat_FromDouble(a); |
| 6 | 868 } |
| 869 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
870 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
871 float_mul(PyObject *v, PyObject *w) |
| 6 | 872 { |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
873 double a,b; |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
874 CONVERT_TO_DOUBLE(v, a); |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
875 CONVERT_TO_DOUBLE(w, b); |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
876 PyFPE_START_PROTECT("multiply", return 0) |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
877 a = a * b; |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
878 PyFPE_END_PROTECT(a) |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
879 return PyFloat_FromDouble(a); |
| 6 | 880 } |
| 881 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
882 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
883 float_div(PyObject *v, PyObject *w) |
| 6 | 884 { |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
885 double a,b; |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
886 CONVERT_TO_DOUBLE(v, a); |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
887 CONVERT_TO_DOUBLE(w, b); |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
888 if (b == 0.0) { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
889 PyErr_SetString(PyExc_ZeroDivisionError, "float division"); |
| 6 | 890 return NULL; |
| 891 } | |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
892 PyFPE_START_PROTECT("divide", return 0) |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
893 a = a / b; |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
894 PyFPE_END_PROTECT(a) |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
895 return PyFloat_FromDouble(a); |
| 6 | 896 } |
| 897 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
898 static PyObject * |
|
19633
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
899 float_classic_div(PyObject *v, PyObject *w) |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
900 { |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
901 double a,b; |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
902 CONVERT_TO_DOUBLE(v, a); |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
903 CONVERT_TO_DOUBLE(w, b); |
|
19673
b3271297b984
PEP 238 documented -Qwarn as warning only for classic int or long
Guido van Rossum <guido@python.org>
parents:
19666
diff
changeset
|
904 if (Py_DivisionWarningFlag >= 2 && |
|
19633
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
905 PyErr_Warn(PyExc_DeprecationWarning, "classic float division") < 0) |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
906 return NULL; |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
907 if (b == 0.0) { |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
908 PyErr_SetString(PyExc_ZeroDivisionError, "float division"); |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
909 return NULL; |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
910 } |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
911 PyFPE_START_PROTECT("divide", return 0) |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
912 a = a / b; |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
913 PyFPE_END_PROTECT(a) |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
914 return PyFloat_FromDouble(a); |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
915 } |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
916 |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
917 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
918 float_rem(PyObject *v, PyObject *w) |
| 6 | 919 { |
|
632
0c1938f2e0c0
Get rid of redundant type checks.
Guido van Rossum <guido@python.org>
parents:
496
diff
changeset
|
920 double vx, wx; |
| 10833 | 921 double mod; |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
922 CONVERT_TO_DOUBLE(v, vx); |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
923 CONVERT_TO_DOUBLE(w, wx); |
|
632
0c1938f2e0c0
Get rid of redundant type checks.
Guido van Rossum <guido@python.org>
parents:
496
diff
changeset
|
924 if (wx == 0.0) { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
925 PyErr_SetString(PyExc_ZeroDivisionError, "float modulo"); |
| 6 | 926 return NULL; |
| 927 } | |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
928 PyFPE_START_PROTECT("modulo", return 0) |
|
632
0c1938f2e0c0
Get rid of redundant type checks.
Guido van Rossum <guido@python.org>
parents:
496
diff
changeset
|
929 mod = fmod(vx, wx); |
| 10833 | 930 /* note: checking mod*wx < 0 is incorrect -- underflows to |
| 931 0 if wx < sqrt(smallest nonzero double) */ | |
| 932 if (mod && ((wx < 0) != (mod < 0))) { | |
|
632
0c1938f2e0c0
Get rid of redundant type checks.
Guido van Rossum <guido@python.org>
parents:
496
diff
changeset
|
933 mod += wx; |
| 6 | 934 } |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5118
diff
changeset
|
935 PyFPE_END_PROTECT(mod) |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
936 return PyFloat_FromDouble(mod); |
| 6 | 937 } |
| 938 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
939 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
940 float_divmod(PyObject *v, PyObject *w) |
|
227
7ec6058b539b
Added (dummy) divmod and (functional) abs.
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
941 { |
|
391
caf8466dcc9c
Finally implemented divmod().
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
942 double vx, wx; |
| 10833 | 943 double div, mod, floordiv; |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
944 CONVERT_TO_DOUBLE(v, vx); |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
945 CONVERT_TO_DOUBLE(w, wx); |
|
391
caf8466dcc9c
Finally implemented divmod().
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
946 if (wx == 0.0) { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
947 PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()"); |
|
391
caf8466dcc9c
Finally implemented divmod().
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
948 return NULL; |
|
caf8466dcc9c
Finally implemented divmod().
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
949 } |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
950 PyFPE_START_PROTECT("divmod", return 0) |
|
391
caf8466dcc9c
Finally implemented divmod().
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
951 mod = fmod(vx, wx); |
|
14616
284508c653c7
Fixed legit gripe from c.l.py that math.fmod docs aren't confusing enough.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
952 /* fmod is typically exact, so vx-mod is *mathematically* an |
| 10833 | 953 exact multiple of wx. But this is fp arithmetic, and fp |
| 954 vx - mod is an approximation; the result is that div may | |
| 955 not be an exact integral value after the division, although | |
| 956 it will always be very close to one. | |
| 957 */ | |
|
391
caf8466dcc9c
Finally implemented divmod().
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
958 div = (vx - mod) / wx; |
|
20827
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
959 if (mod) { |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
960 /* ensure the remainder has the same sign as the denominator */ |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
961 if ((wx < 0) != (mod < 0)) { |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
962 mod += wx; |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
963 div -= 1.0; |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
964 } |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
965 } |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
966 else { |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
967 /* the remainder is zero, and in the presence of signed zeroes |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
968 fmod returns different results across platforms; ensure |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
969 it has the same sign as the denominator; we'd like to do |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
970 "mod = wx * 0.0", but that may get optimized away */ |
|
20829
14dc693af532
float_divmod(): the code wasn't sick enough to stop the MS optimizer
Tim Peters <tim.peters@gmail.com>
parents:
20827
diff
changeset
|
971 mod *= mod; /* hide "mod = +0" from optimizer */ |
|
20827
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
972 if (wx < 0.0) |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
973 mod = -mod; |
|
391
caf8466dcc9c
Finally implemented divmod().
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
974 } |
| 10833 | 975 /* snap quotient to nearest integral value */ |
|
20827
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
976 if (div) { |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
977 floordiv = floor(div); |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
978 if (div - floordiv > 0.5) |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
979 floordiv += 1.0; |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
980 } |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
981 else { |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
982 /* div is zero - get the same sign as the true quotient */ |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
983 div *= div; /* hide "div = +0" from optimizers */ |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
984 floordiv = div * vx / wx; /* zero w/ sign of vx/wx */ |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
985 } |
|
95201153251c
SF bug #477221: abs and divmod act oddly with -0.0
Tim Peters <tim.peters@gmail.com>
parents:
20826
diff
changeset
|
986 PyFPE_END_PROTECT(floordiv) |
| 10833 | 987 return Py_BuildValue("(dd)", floordiv, mod); |
|
227
7ec6058b539b
Added (dummy) divmod and (functional) abs.
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
988 } |
|
7ec6058b539b
Added (dummy) divmod and (functional) abs.
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
989 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
990 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
|
991 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
|
992 { |
|
257c938900a6
float_int_div(): For clarity, move this closer to the other float
Tim Peters <tim.peters@gmail.com>
parents:
21097
diff
changeset
|
993 PyObject *t, *r; |
|
257c938900a6
float_int_div(): For clarity, move this closer to the other float
Tim Peters <tim.peters@gmail.com>
parents:
21097
diff
changeset
|
994 |
|
257c938900a6
float_int_div(): For clarity, move this closer to the other float
Tim Peters <tim.peters@gmail.com>
parents:
21097
diff
changeset
|
995 t = float_divmod(v, w); |
|
21354
fbddb64d21c2
float_floor_div: An expression like 3.//1j crashed the interpreter, or
Tim Peters <tim.peters@gmail.com>
parents:
21353
diff
changeset
|
996 if (t == NULL || t == Py_NotImplemented) |
|
fbddb64d21c2
float_floor_div: An expression like 3.//1j crashed the interpreter, or
Tim Peters <tim.peters@gmail.com>
parents:
21353
diff
changeset
|
997 return t; |
|
fbddb64d21c2
float_floor_div: An expression like 3.//1j crashed the interpreter, or
Tim Peters <tim.peters@gmail.com>
parents:
21353
diff
changeset
|
998 assert(PyTuple_CheckExact(t)); |
|
fbddb64d21c2
float_floor_div: An expression like 3.//1j crashed the interpreter, or
Tim Peters <tim.peters@gmail.com>
parents:
21353
diff
changeset
|
999 r = PyTuple_GET_ITEM(t, 0); |
|
fbddb64d21c2
float_floor_div: An expression like 3.//1j crashed the interpreter, or
Tim Peters <tim.peters@gmail.com>
parents:
21353
diff
changeset
|
1000 Py_INCREF(r); |
|
fbddb64d21c2
float_floor_div: An expression like 3.//1j crashed the interpreter, or
Tim Peters <tim.peters@gmail.com>
parents:
21353
diff
changeset
|
1001 Py_DECREF(t); |
|
fbddb64d21c2
float_floor_div: An expression like 3.//1j crashed the interpreter, or
Tim Peters <tim.peters@gmail.com>
parents:
21353
diff
changeset
|
1002 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
|
1003 } |
|
257c938900a6
float_int_div(): For clarity, move this closer to the other float
Tim Peters <tim.peters@gmail.com>
parents:
21097
diff
changeset
|
1004 |
|
257c938900a6
float_int_div(): For clarity, move this closer to the other float
Tim Peters <tim.peters@gmail.com>
parents:
21097
diff
changeset
|
1005 static PyObject * |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1006 float_pow(PyObject *v, PyObject *w, PyObject *z) |
| 6 | 1007 { |
| 1008 double iv, iw, ix; | |
|
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
|
1009 |
|
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
|
1010 if ((PyObject *)z != Py_None) { |
|
19719
cdfdd5359411
Make the error msgs in our pow() implementations consistent.
Tim Peters <tim.peters@gmail.com>
parents:
19674
diff
changeset
|
1011 PyErr_SetString(PyExc_TypeError, "pow() 3rd argument not " |
|
19753
c0580d8c193e
Better error msg for 3-arg pow with a float argument.
Tim Peters <tim.peters@gmail.com>
parents:
19750
diff
changeset
|
1012 "allowed unless all arguments are integers"); |
|
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
|
1013 return NULL; |
|
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
|
1014 } |
|
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
|
1015 |
|
15723
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1016 CONVERT_TO_DOUBLE(v, iv); |
|
ac7ae3ead88a
Make float a new style number type.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1017 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
|
1018 |
|
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
|
1019 /* Sort out special cases here instead of relying on pow() */ |
|
19457
6c2b7b624ef2
float_pow: Put *all* of the burden on the libm pow in normal
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
1020 if (iw == 0) { /* v**0 is 1, even 0**0 */ |
|
41580
a68467cc06d3
Remove dead code. This code couldn't be reached because earlier in
Neal Norwitz <nnorwitz@gmail.com>
parents:
39642
diff
changeset
|
1021 return PyFloat_FromDouble(1.0); |
|
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
|
1022 } |
|
19457
6c2b7b624ef2
float_pow: Put *all* of the burden on the libm pow in normal
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
1023 if (iv == 0.0) { /* 0**w is error if w<0, else 1 */ |
|
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
|
1024 if (iw < 0.0) { |
|
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
|
1025 PyErr_SetString(PyExc_ZeroDivisionError, |
| 15318 | 1026 "0.0 cannot be raised to a negative power"); |
|
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
|
1027 return NULL; |
|
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
|
1028 } |
|
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
|
1029 return PyFloat_FromDouble(0.0); |
|
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
|
1030 } |
|
29252
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1031 if (iv < 0.0) { |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1032 /* Whether this is an error is a mess, and bumps into libm |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1033 * bugs so we have to figure it out ourselves. |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1034 */ |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1035 if (iw != floor(iw)) { |
|
44488
94eeaeeb3ce9
Continue rolling back pep-3141 changes that changed behavior from 2.5. This
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44432
diff
changeset
|
1036 PyErr_SetString(PyExc_ValueError, "negative number " |
|
94eeaeeb3ce9
Continue rolling back pep-3141 changes that changed behavior from 2.5. This
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44432
diff
changeset
|
1037 "cannot be raised to a fractional power"); |
|
94eeaeeb3ce9
Continue rolling back pep-3141 changes that changed behavior from 2.5. This
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44432
diff
changeset
|
1038 return NULL; |
|
29252
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1039 } |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1040 /* iw is an exact integer, albeit perhaps a very large one. |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1041 * -1 raised to an exact integer should never be exceptional. |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1042 * Alas, some libms (chiefly glibc as of early 2003) return |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1043 * NaN and set EDOM on pow(-1, large_int) if the int doesn't |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1044 * happen to be representable in a *C* integer. That's a |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1045 * bug; we let that slide in math.pow() (which currently |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1046 * reflects all platform accidents), but not for Python's **. |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1047 */ |
|
38293
688f25757104
Added a new macro, Py_IS_FINITE(X). On windows there is an intrinsic for this and it is more efficient than to use !Py_IS_INFINITE(X) && !Py_IS_NAN(X). No change on other platforms
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
37815
diff
changeset
|
1048 if (iv == -1.0 && Py_IS_FINITE(iw)) { |
|
29252
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1049 /* Return 1 if iw is even, -1 if iw is odd; there's |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1050 * no guarantee that any C integral type is big |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1051 * enough to hold iw, so we have to check this |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1052 * indirectly. |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1053 */ |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1054 ix = floor(iw * 0.5) * 2.0; |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1055 return PyFloat_FromDouble(ix == iw ? 1.0 : -1.0); |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1056 } |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1057 /* Else iv != -1.0, and overflow or underflow are possible. |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1058 * Unless we're to write pow() ourselves, we have to trust |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1059 * the platform to do this correctly. |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1060 */ |
|
3984
0613f17dcfd8
Correct wrong calculation of pow(0.0, 0.0, negative_number)
Guido van Rossum <guido@python.org>
parents:
3704
diff
changeset
|
1061 } |
|
19457
6c2b7b624ef2
float_pow: Put *all* of the burden on the libm pow in normal
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
1062 errno = 0; |
|
6c2b7b624ef2
float_pow: Put *all* of the burden on the libm pow in normal
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
1063 PyFPE_START_PROTECT("pow", return NULL) |
|
6c2b7b624ef2
float_pow: Put *all* of the burden on the libm pow in normal
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
1064 ix = pow(iv, iw); |
|
6c2b7b624ef2
float_pow: Put *all* of the burden on the libm pow in normal
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
1065 PyFPE_END_PROTECT(ix) |
|
22228
4b6eda7d0c8f
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21354
diff
changeset
|
1066 Py_ADJUST_ERANGE1(ix); |
|
39642
981181d2a4fe
Reverting the patch that tried to fix the issue whereby x**2 raises
Alex Martelli <aleaxit@gmail.com>
parents:
39639
diff
changeset
|
1067 if (errno != 0) { |
|
29252
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1068 /* We don't expect any errno value other than ERANGE, but |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1069 * the range of libm bugs appears unbounded. |
|
0b76679bf3f9
SF bug 705231: Assertion failed, python aborts.
Tim Peters <tim.peters@gmail.com>
parents:
28368
diff
changeset
|
1070 */ |
|
39642
981181d2a4fe
Reverting the patch that tried to fix the issue whereby x**2 raises
Alex Martelli <aleaxit@gmail.com>
parents:
39639
diff
changeset
|
1071 PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError : |
|
981181d2a4fe
Reverting the patch that tried to fix the issue whereby x**2 raises
Alex Martelli <aleaxit@gmail.com>
parents:
39639
diff
changeset
|
1072 PyExc_ValueError); |
| 6 | 1073 return NULL; |
| 27 | 1074 } |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1075 return PyFloat_FromDouble(ix); |
| 6 | 1076 } |
| 1077 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1078 static PyObject * |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1079 float_neg(PyFloatObject *v) |
| 6 | 1080 { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1081 return PyFloat_FromDouble(-v->ob_fval); |
| 6 | 1082 } |
| 1083 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1084 static PyObject * |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1085 float_abs(PyFloatObject *v) |
|
227
7ec6058b539b
Added (dummy) divmod and (functional) abs.
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
1086 { |
|
20826
3751366c2f39
float_abs() again: Guido pointed out that this could screw up in the
Tim Peters <tim.peters@gmail.com>
parents:
20823
diff
changeset
|
1087 return PyFloat_FromDouble(fabs(v->ob_fval)); |
| 6 | 1088 } |
| 1089 | |
| 239 | 1090 static int |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1091 float_nonzero(PyFloatObject *v) |
| 239 | 1092 { |
| 1093 return v->ob_fval != 0.0; | |
| 1094 } | |
| 1095 | |
|
1313
6ee380349c84
* Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents:
1271
diff
changeset
|
1096 static int |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1097 float_coerce(PyObject **pv, PyObject **pw) |
|
955
03de67080c95
* classobject.[ch], {float,long,int}object.c, bltinmodule.c:
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1098 { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1099 if (PyInt_Check(*pw)) { |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1100 long x = PyInt_AsLong(*pw); |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1101 *pw = PyFloat_FromDouble((double)x); |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1102 Py_INCREF(*pv); |
|
955
03de67080c95
* classobject.[ch], {float,long,int}object.c, bltinmodule.c:
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1103 return 0; |
|
03de67080c95
* classobject.[ch], {float,long,int}object.c, bltinmodule.c:
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1104 } |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1105 else if (PyLong_Check(*pw)) { |
|
27484
5ba7934a7ba0
Fix SF bug# 676155, RuntimeWarning with tp_compare
Neal Norwitz <nnorwitz@gmail.com>
parents:
26328
diff
changeset
|
1106 double x = PyLong_AsDouble(*pw); |
|
5ba7934a7ba0
Fix SF bug# 676155, RuntimeWarning with tp_compare
Neal Norwitz <nnorwitz@gmail.com>
parents:
26328
diff
changeset
|
1107 if (x == -1.0 && PyErr_Occurred()) |
|
5ba7934a7ba0
Fix SF bug# 676155, RuntimeWarning with tp_compare
Neal Norwitz <nnorwitz@gmail.com>
parents:
26328
diff
changeset
|
1108 return -1; |
|
5ba7934a7ba0
Fix SF bug# 676155, RuntimeWarning with tp_compare
Neal Norwitz <nnorwitz@gmail.com>
parents:
26328
diff
changeset
|
1109 *pw = PyFloat_FromDouble(x); |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1110 Py_INCREF(*pv); |
|
955
03de67080c95
* classobject.[ch], {float,long,int}object.c, bltinmodule.c:
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1111 return 0; |
|
03de67080c95
* classobject.[ch], {float,long,int}object.c, bltinmodule.c:
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1112 } |
|
19976
da00188d5270
Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents:
19889
diff
changeset
|
1113 else if (PyFloat_Check(*pw)) { |
|
da00188d5270
Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents:
19889
diff
changeset
|
1114 Py_INCREF(*pv); |
|
da00188d5270
Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents:
19889
diff
changeset
|
1115 Py_INCREF(*pw); |
|
da00188d5270
Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents:
19889
diff
changeset
|
1116 return 0; |
|
da00188d5270
Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents:
19889
diff
changeset
|
1117 } |
|
955
03de67080c95
* classobject.[ch], {float,long,int}object.c, bltinmodule.c:
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1118 return 1; /* Can't do it */ |
|
03de67080c95
* classobject.[ch], {float,long,int}object.c, bltinmodule.c:
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1119 } |
|
03de67080c95
* classobject.[ch], {float,long,int}object.c, bltinmodule.c:
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1120 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1121 static PyObject * |
|
44432
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1122 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
|
1123 { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1124 double x = PyFloat_AsDouble(v); |
|
18838
a8575f358b9f
SF bug #444510: int() should guarantee truncation.
Tim Peters <tim.peters@gmail.com>
parents:
17707
diff
changeset
|
1125 double wholepart; /* integral portion of x, rounded toward 0 */ |
|
a8575f358b9f
SF bug #444510: int() should guarantee truncation.
Tim Peters <tim.peters@gmail.com>
parents:
17707
diff
changeset
|
1126 |
|
a8575f358b9f
SF bug #444510: int() should guarantee truncation.
Tim Peters <tim.peters@gmail.com>
parents:
17707
diff
changeset
|
1127 (void)modf(x, &wholepart); |
|
26328
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1128 /* Try to get out cheap if this fits in a Python int. The attempt |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1129 * to cast to long must be protected, as C doesn't define what |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1130 * happens if the double is too big to fit in a long. Some rare |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1131 * systems raise an exception then (RISCOS was mentioned as one, |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1132 * and someone using a non-default option on Sun also bumped into |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1133 * that). Note that checking for >= and <= LONG_{MIN,MAX} would |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1134 * still be vulnerable: if a long has more bits of precision than |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1135 * a double, casting MIN/MAX to double may yield an approximation, |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1136 * and if that's rounded up, then, e.g., wholepart=LONG_MAX+1 would |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1137 * yield true from the C expression wholepart<=LONG_MAX, despite |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1138 * that wholepart is actually greater than LONG_MAX. |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1139 */ |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1140 if (LONG_MIN < wholepart && wholepart < LONG_MAX) { |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1141 const long aslong = (long)wholepart; |
|
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1142 return PyInt_FromLong(aslong); |
|
20654
edd9d0b3c47e
SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents:
20277
diff
changeset
|
1143 } |
|
26328
f3a69037fdf0
float_int(): Some systems raise an exception if a double is cast to
Tim Peters <tim.peters@gmail.com>
parents:
26291
diff
changeset
|
1144 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
|
1145 } |
|
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
955
diff
changeset
|
1146 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1147 static PyObject * |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1148 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
|
1149 { |
|
34931
9a1b1e1ae653
Make subclasses of int, long, complex, float, and unicode perform type
Brett Cannon <bcannon@gmail.com>
parents:
33549
diff
changeset
|
1150 if (PyFloat_CheckExact(v)) |
|
9a1b1e1ae653
Make subclasses of int, long, complex, float, and unicode perform type
Brett Cannon <bcannon@gmail.com>
parents:
33549
diff
changeset
|
1151 Py_INCREF(v); |
|
9a1b1e1ae653
Make subclasses of int, long, complex, float, and unicode perform type
Brett Cannon <bcannon@gmail.com>
parents:
33549
diff
changeset
|
1152 else |
|
9a1b1e1ae653
Make subclasses of int, long, complex, float, and unicode perform type
Brett Cannon <bcannon@gmail.com>
parents:
33549
diff
changeset
|
1153 v = PyFloat_FromDouble(((PyFloatObject *)v)->ob_fval); |
|
1049
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
955
diff
changeset
|
1154 return v; |
|
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
955
diff
changeset
|
1155 } |
|
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
955
diff
changeset
|
1156 |
|
45024
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1157 static PyObject * |
|
45094
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1158 float_as_integer_ratio(PyObject *v, PyObject *unused) |
|
45024
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1159 { |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1160 double self; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1161 double float_part; |
|
45099
d0b31f24694d
Fix int/long typecase. Add check for non-binary floating point.
Raymond Hettinger <python@rcn.com>
parents:
45096
diff
changeset
|
1162 int exponent; |
|
45100
0b4e8afed663
Add protection from weirdness while scaling the mantissa to an integer.
Raymond Hettinger <python@rcn.com>
parents:
45099
diff
changeset
|
1163 int i; |
|
45094
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1164 |
|
45024
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1165 PyObject *prev; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1166 PyObject *py_exponent = NULL; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1167 PyObject *numerator = NULL; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1168 PyObject *denominator = NULL; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1169 PyObject *result_pair = NULL; |
|
45094
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1170 PyNumberMethods *long_methods = PyLong_Type.tp_as_number; |
|
45024
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1171 |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1172 #define INPLACE_UPDATE(obj, call) \ |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1173 prev = obj; \ |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1174 obj = call; \ |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1175 Py_DECREF(prev); \ |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1176 |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1177 CONVERT_TO_DOUBLE(v, self); |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1178 |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1179 if (Py_IS_INFINITY(self)) { |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1180 PyErr_SetString(PyExc_OverflowError, |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1181 "Cannot pass infinity to float.as_integer_ratio."); |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1182 return NULL; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1183 } |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1184 #ifdef Py_NAN |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1185 if (Py_IS_NAN(self)) { |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1186 PyErr_SetString(PyExc_ValueError, |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1187 "Cannot pass nan to float.as_integer_ratio."); |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1188 return NULL; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1189 } |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1190 #endif |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1191 |
|
45094
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1192 PyFPE_START_PROTECT("as_integer_ratio", goto error); |
|
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1193 float_part = frexp(self, &exponent); /* self == float_part * 2**exponent exactly */ |
|
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1194 PyFPE_END_PROTECT(float_part); |
|
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1195 |
|
45100
0b4e8afed663
Add protection from weirdness while scaling the mantissa to an integer.
Raymond Hettinger <python@rcn.com>
parents:
45099
diff
changeset
|
1196 for (i=0; i<300 && float_part != floor(float_part) ; i++) { |
|
45094
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1197 float_part *= 2.0; |
|
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1198 exponent--; |
|
45100
0b4e8afed663
Add protection from weirdness while scaling the mantissa to an integer.
Raymond Hettinger <python@rcn.com>
parents:
45099
diff
changeset
|
1199 } |
|
45101
f5e18c9bde70
Simpler solution to handling non-IEEE 754 environments.
Raymond Hettinger <python@rcn.com>
parents:
45100
diff
changeset
|
1200 /* self == float_part * 2**exponent exactly and float_part is integral. |
|
f5e18c9bde70
Simpler solution to handling non-IEEE 754 environments.
Raymond Hettinger <python@rcn.com>
parents:
45100
diff
changeset
|
1201 If FLT_RADIX != 2, the 300 steps may leave a tiny fractional part |
|
f5e18c9bde70
Simpler solution to handling non-IEEE 754 environments.
Raymond Hettinger <python@rcn.com>
parents:
45100
diff
changeset
|
1202 to be truncated by PyLong_FromDouble(). */ |
|
45024
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1203 |
|
45094
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1204 numerator = PyLong_FromDouble(float_part); |
|
45024
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1205 if (numerator == NULL) goto error; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1206 |
|
45100
0b4e8afed663
Add protection from weirdness while scaling the mantissa to an integer.
Raymond Hettinger <python@rcn.com>
parents:
45099
diff
changeset
|
1207 /* fold in 2**exponent */ |
|
45095
5cb8288360e7
Integer ratio should return ints instead of longs whereever possible.
Raymond Hettinger <python@rcn.com>
parents:
45094
diff
changeset
|
1208 denominator = PyLong_FromLong(1); |
|
45099
d0b31f24694d
Fix int/long typecase. Add check for non-binary floating point.
Raymond Hettinger <python@rcn.com>
parents:
45096
diff
changeset
|
1209 py_exponent = PyLong_FromLong(labs((long)exponent)); |
|
45024
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1210 if (py_exponent == NULL) goto error; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1211 INPLACE_UPDATE(py_exponent, |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1212 long_methods->nb_lshift(denominator, py_exponent)); |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1213 if (py_exponent == NULL) goto error; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1214 if (exponent > 0) { |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1215 INPLACE_UPDATE(numerator, |
|
45100
0b4e8afed663
Add protection from weirdness while scaling the mantissa to an integer.
Raymond Hettinger <python@rcn.com>
parents:
45099
diff
changeset
|
1216 long_methods->nb_multiply(numerator, py_exponent)); |
|
45024
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1217 if (numerator == NULL) goto error; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1218 } |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1219 else { |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1220 Py_DECREF(denominator); |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1221 denominator = py_exponent; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1222 py_exponent = NULL; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1223 } |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1224 |
|
45095
5cb8288360e7
Integer ratio should return ints instead of longs whereever possible.
Raymond Hettinger <python@rcn.com>
parents:
45094
diff
changeset
|
1225 /* Returns ints instead of longs where possible */ |
|
5cb8288360e7
Integer ratio should return ints instead of longs whereever possible.
Raymond Hettinger <python@rcn.com>
parents:
45094
diff
changeset
|
1226 INPLACE_UPDATE(numerator, PyNumber_Int(numerator)); |
|
5cb8288360e7
Integer ratio should return ints instead of longs whereever possible.
Raymond Hettinger <python@rcn.com>
parents:
45094
diff
changeset
|
1227 if (numerator == NULL) goto error; |
|
5cb8288360e7
Integer ratio should return ints instead of longs whereever possible.
Raymond Hettinger <python@rcn.com>
parents:
45094
diff
changeset
|
1228 INPLACE_UPDATE(denominator, PyNumber_Int(denominator)); |
|
5cb8288360e7
Integer ratio should return ints instead of longs whereever possible.
Raymond Hettinger <python@rcn.com>
parents:
45094
diff
changeset
|
1229 if (denominator == NULL) goto error; |
|
5cb8288360e7
Integer ratio should return ints instead of longs whereever possible.
Raymond Hettinger <python@rcn.com>
parents:
45094
diff
changeset
|
1230 |
|
45024
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1231 result_pair = PyTuple_Pack(2, numerator, denominator); |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1232 |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1233 #undef INPLACE_UPDATE |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1234 error: |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1235 Py_XDECREF(py_exponent); |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1236 Py_XDECREF(denominator); |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1237 Py_XDECREF(numerator); |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1238 return result_pair; |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1239 } |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1240 |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1241 PyDoc_STRVAR(float_as_integer_ratio_doc, |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1242 "float.as_integer_ratio() -> (int, int)\n" |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1243 "\n" |
|
45094
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1244 "Returns a pair of integers, whose ratio is exactly equal to the original\n" |
|
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1245 "float and with a positive denominator.\n" |
|
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1246 "Raises OverflowError on infinities and a ValueError on nans.\n" |
|
45024
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1247 "\n" |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1248 ">>> (10.0).as_integer_ratio()\n" |
|
45094
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1249 "(10, 1)\n" |
|
45024
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1250 ">>> (0.0).as_integer_ratio()\n" |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1251 "(0, 1)\n" |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1252 ">>> (-.25).as_integer_ratio()\n" |
|
45094
beea73ca2b88
Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
Raymond Hettinger <python@rcn.com>
parents:
45060
diff
changeset
|
1253 "(-1, 4)"); |
|
45024
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1254 |
|
1049
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
955
diff
changeset
|
1255 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23832
diff
changeset
|
1256 static PyObject * |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1257 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
|
1258 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1259 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1260 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
|
1261 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1262 PyObject *x = Py_False; /* Integer zero */ |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36501
diff
changeset
|
1263 static char *kwlist[] = {"x", 0}; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1264 |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1265 if (type != &PyFloat_Type) |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1266 return float_subtype_new(type, args, kwds); /* Wimp out */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1267 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:float", kwlist, &x)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1268 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1269 if (PyString_Check(x)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1270 return PyFloat_FromString(x, NULL); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1271 return PyNumber_Float(x); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1272 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1273 |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1274 /* 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
|
1275 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
|
1276 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
|
1277 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
|
1278 */ |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1279 static PyObject * |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1280 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
|
1281 { |
|
37589
aeee85b6a5dd
More C++-compliance. Note especially listobject.c - to get C++ to accept the
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37304
diff
changeset
|
1282 PyObject *tmp, *newobj; |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1283 |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1284 assert(PyType_IsSubtype(type, &PyFloat_Type)); |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1285 tmp = float_new(&PyFloat_Type, args, kwds); |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1286 if (tmp == NULL) |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1287 return NULL; |
|
19889
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19879
diff
changeset
|
1288 assert(PyFloat_CheckExact(tmp)); |
|
37589
aeee85b6a5dd
More C++-compliance. Note especially listobject.c - to get C++ to accept the
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37304
diff
changeset
|
1289 newobj = type->tp_alloc(type, 0); |
|
aeee85b6a5dd
More C++-compliance. Note especially listobject.c - to get C++ to accept the
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37304
diff
changeset
|
1290 if (newobj == NULL) { |
|
29641
4909aa64405f
SF patch 703666: Several objects don't decref tmp on failure in subtype_new
Raymond Hettinger <python@rcn.com>
parents:
29252
diff
changeset
|
1291 Py_DECREF(tmp); |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1292 return NULL; |
|
29641
4909aa64405f
SF patch 703666: Several objects don't decref tmp on failure in subtype_new
Raymond Hettinger <python@rcn.com>
parents:
29252
diff
changeset
|
1293 } |
|
37589
aeee85b6a5dd
More C++-compliance. Note especially listobject.c - to get C++ to accept the
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37304
diff
changeset
|
1294 ((PyFloatObject *)newobj)->ob_fval = ((PyFloatObject *)tmp)->ob_fval; |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1295 Py_DECREF(tmp); |
|
37589
aeee85b6a5dd
More C++-compliance. Note especially listobject.c - to get C++ to accept the
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37304
diff
changeset
|
1296 return newobj; |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1297 } |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1298 |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1299 static PyObject * |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1300 float_getnewargs(PyFloatObject *v) |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1301 { |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1302 return Py_BuildValue("(d)", v->ob_fval); |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1303 } |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1304 |
| 34972 | 1305 /* this is for the benefit of the pack/unpack routines below */ |
| 1306 | |
| 1307 typedef enum { | |
| 1308 unknown_format, ieee_big_endian_format, ieee_little_endian_format | |
| 1309 } float_format_type; | |
| 1310 | |
| 1311 static float_format_type double_format, float_format; | |
| 1312 static float_format_type detected_double_format, detected_float_format; | |
| 1313 | |
| 1314 static PyObject * | |
| 1315 float_getformat(PyTypeObject *v, PyObject* arg) | |
| 1316 { | |
| 1317 char* s; | |
| 1318 float_format_type r; | |
| 1319 | |
| 1320 if (!PyString_Check(arg)) { | |
| 1321 PyErr_Format(PyExc_TypeError, | |
| 1322 "__getformat__() argument must be string, not %.500s", | |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
44344
diff
changeset
|
1323 Py_TYPE(arg)->tp_name); |
| 34972 | 1324 return NULL; |
| 1325 } | |
| 1326 s = PyString_AS_STRING(arg); | |
| 1327 if (strcmp(s, "double") == 0) { | |
| 1328 r = double_format; | |
| 1329 } | |
| 1330 else if (strcmp(s, "float") == 0) { | |
| 1331 r = float_format; | |
| 1332 } | |
| 1333 else { | |
| 1334 PyErr_SetString(PyExc_ValueError, | |
| 1335 "__getformat__() argument 1 must be " | |
| 1336 "'double' or 'float'"); | |
| 1337 return NULL; | |
| 1338 } | |
| 1339 | |
| 1340 switch (r) { | |
| 1341 case unknown_format: | |
| 1342 return PyString_FromString("unknown"); | |
| 1343 case ieee_little_endian_format: | |
| 1344 return PyString_FromString("IEEE, little-endian"); | |
| 1345 case ieee_big_endian_format: | |
| 1346 return PyString_FromString("IEEE, big-endian"); | |
| 1347 default: | |
| 1348 Py_FatalError("insane float_format or double_format"); | |
| 1349 return NULL; | |
| 1350 } | |
| 1351 } | |
| 1352 | |
| 1353 PyDoc_STRVAR(float_getformat_doc, | |
| 1354 "float.__getformat__(typestr) -> string\n" | |
| 1355 "\n" | |
| 1356 "You probably don't want to use this function. It exists mainly to be\n" | |
| 1357 "used in Python's test suite.\n" | |
| 1358 "\n" | |
| 1359 "typestr must be 'double' or 'float'. This function returns whichever of\n" | |
| 1360 "'unknown', 'IEEE, big-endian' or 'IEEE, little-endian' best describes the\n" | |
| 1361 "format of floating point numbers used by the C type named by typestr."); | |
| 1362 | |
| 1363 static PyObject * | |
| 1364 float_setformat(PyTypeObject *v, PyObject* args) | |
| 1365 { | |
| 1366 char* typestr; | |
| 1367 char* format; | |
| 1368 float_format_type f; | |
| 1369 float_format_type detected; | |
| 1370 float_format_type *p; | |
| 1371 | |
| 1372 if (!PyArg_ParseTuple(args, "ss:__setformat__", &typestr, &format)) | |
| 1373 return NULL; | |
| 1374 | |
| 1375 if (strcmp(typestr, "double") == 0) { | |
| 1376 p = &double_format; | |
| 1377 detected = detected_double_format; | |
| 1378 } | |
| 1379 else if (strcmp(typestr, "float") == 0) { | |
| 1380 p = &float_format; | |
| 1381 detected = detected_float_format; | |
| 1382 } | |
| 1383 else { | |
| 1384 PyErr_SetString(PyExc_ValueError, | |
| 1385 "__setformat__() argument 1 must " | |
| 1386 "be 'double' or 'float'"); | |
| 1387 return NULL; | |
| 1388 } | |
| 1389 | |
| 1390 if (strcmp(format, "unknown") == 0) { | |
| 1391 f = unknown_format; | |
| 1392 } | |
| 1393 else if (strcmp(format, "IEEE, little-endian") == 0) { | |
| 1394 f = ieee_little_endian_format; | |
| 1395 } | |
| 1396 else if (strcmp(format, "IEEE, big-endian") == 0) { | |
| 1397 f = ieee_big_endian_format; | |
| 1398 } | |
| 1399 else { | |
| 1400 PyErr_SetString(PyExc_ValueError, | |
| 1401 "__setformat__() argument 2 must be " | |
| 1402 "'unknown', 'IEEE, little-endian' or " | |
| 1403 "'IEEE, big-endian'"); | |
| 1404 return NULL; | |
| 1405 | |
| 1406 } | |
| 1407 | |
| 1408 if (f != unknown_format && f != detected) { | |
| 1409 PyErr_Format(PyExc_ValueError, | |
| 1410 "can only set %s format to 'unknown' or the " | |
| 1411 "detected platform value", typestr); | |
| 1412 return NULL; | |
| 1413 } | |
| 1414 | |
| 1415 *p = f; | |
| 1416 Py_RETURN_NONE; | |
| 1417 } | |
| 1418 | |
| 1419 PyDoc_STRVAR(float_setformat_doc, | |
| 1420 "float.__setformat__(typestr, fmt) -> None\n" | |
| 1421 "\n" | |
| 1422 "You probably don't want to use this function. It exists mainly to be\n" | |
| 1423 "used in Python's test suite.\n" | |
| 1424 "\n" | |
| 1425 "typestr must be 'double' or 'float'. fmt must be one of 'unknown',\n" | |
| 1426 "'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be\n" | |
| 1427 "one of the latter two if it appears to match the underlying C reality.\n" | |
| 1428 "\n" | |
| 1429 "Overrides the automatic determination of C-level floating point type.\n" | |
| 1430 "This affects how floats are converted to and from binary strings."); | |
| 1431 | |
|
44432
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1432 static PyObject * |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1433 float_getzero(PyObject *v, void *closure) |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1434 { |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1435 return PyFloat_FromDouble(0.0); |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1436 } |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1437 |
|
45381
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1438 static PyObject * |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1439 float__format__(PyObject *self, PyObject *args) |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1440 { |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1441 PyObject *format_spec; |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1442 |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1443 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec)) |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1444 return NULL; |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1445 if (PyString_Check(format_spec)) |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1446 return string_float__format__(self, args); |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1447 if (PyUnicode_Check(format_spec)) { |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1448 /* Convert format_spec to a str */ |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1449 PyObject *result = NULL; |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1450 PyObject *newargs = NULL; |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1451 PyObject *string_format_spec = NULL; |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1452 |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1453 string_format_spec = PyObject_Str(format_spec); |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1454 if (string_format_spec == NULL) |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1455 goto done; |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1456 |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1457 newargs = Py_BuildValue("(O)", string_format_spec); |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1458 if (newargs == NULL) |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1459 goto done; |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1460 |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1461 result = string_float__format__(self, newargs); |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1462 |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1463 done: |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1464 Py_XDECREF(string_format_spec); |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1465 Py_XDECREF(newargs); |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1466 return result; |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1467 } |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1468 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode"); |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1469 return NULL; |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1470 } |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1471 |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1472 PyDoc_STRVAR(float__format__doc, |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1473 "float.__format__(format_spec) -> string\n" |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1474 "\n" |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1475 "Formats the float according to format_spec."); |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1476 |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1477 |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1478 static PyMethodDef float_methods[] = { |
|
44432
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1479 {"conjugate", (PyCFunction)float_float, METH_NOARGS, |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1480 "Returns self, the complex conjugate of any float."}, |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1481 {"__trunc__", (PyCFunction)float_trunc, METH_NOARGS, |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1482 "Returns the Integral closest to x between 0 and x."}, |
|
45024
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1483 {"as_integer_ratio", (PyCFunction)float_as_integer_ratio, METH_NOARGS, |
|
f062dda54894
Moved Rational._binary_float_to_ratio() to float.as_integer_ratio() because
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44940
diff
changeset
|
1484 float_as_integer_ratio_doc}, |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1485 {"__getnewargs__", (PyCFunction)float_getnewargs, METH_NOARGS}, |
| 34972 | 1486 {"__getformat__", (PyCFunction)float_getformat, |
| 1487 METH_O|METH_CLASS, float_getformat_doc}, | |
| 1488 {"__setformat__", (PyCFunction)float_setformat, | |
| 1489 METH_VARARGS|METH_CLASS, float_setformat_doc}, | |
|
45381
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1490 {"__format__", (PyCFunction)float__format__, |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1491 METH_VARARGS, float__format__doc}, |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1492 {NULL, NULL} /* sentinel */ |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1493 }; |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1494 |
|
44432
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1495 static PyGetSetDef float_getset[] = { |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1496 {"real", |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1497 (getter)float_float, (setter)NULL, |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1498 "the real part of a complex number", |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1499 NULL}, |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1500 {"imag", |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1501 (getter)float_getzero, (setter)NULL, |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1502 "the imaginary part of a complex number", |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1503 NULL}, |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1504 {NULL} /* Sentinel */ |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1505 }; |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1506 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23344
diff
changeset
|
1507 PyDoc_STRVAR(float_doc, |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1508 "float(x) -> floating point number\n\ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1509 \n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23344
diff
changeset
|
1510 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
|
1511 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1512 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1513 static PyNumberMethods float_as_number = { |
|
37304
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
36759
diff
changeset
|
1514 float_add, /*nb_add*/ |
|
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
36759
diff
changeset
|
1515 float_sub, /*nb_subtract*/ |
|
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
36759
diff
changeset
|
1516 float_mul, /*nb_multiply*/ |
|
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
36759
diff
changeset
|
1517 float_classic_div, /*nb_divide*/ |
|
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
36759
diff
changeset
|
1518 float_rem, /*nb_remainder*/ |
|
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
36759
diff
changeset
|
1519 float_divmod, /*nb_divmod*/ |
|
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
36759
diff
changeset
|
1520 float_pow, /*nb_power*/ |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1347
diff
changeset
|
1521 (unaryfunc)float_neg, /*nb_negative*/ |
|
44432
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1522 (unaryfunc)float_float, /*nb_positive*/ |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1347
diff
changeset
|
1523 (unaryfunc)float_abs, /*nb_absolute*/ |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1347
diff
changeset
|
1524 (inquiry)float_nonzero, /*nb_nonzero*/ |
|
405
d3d328680328
Added NULL function pointers for shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
391
diff
changeset
|
1525 0, /*nb_invert*/ |
|
d3d328680328
Added NULL function pointers for shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
391
diff
changeset
|
1526 0, /*nb_lshift*/ |
|
d3d328680328
Added NULL function pointers for shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
391
diff
changeset
|
1527 0, /*nb_rshift*/ |
|
d3d328680328
Added NULL function pointers for shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
391
diff
changeset
|
1528 0, /*nb_and*/ |
|
d3d328680328
Added NULL function pointers for shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
391
diff
changeset
|
1529 0, /*nb_xor*/ |
|
d3d328680328
Added NULL function pointers for shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
391
diff
changeset
|
1530 0, /*nb_or*/ |
|
37304
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
36759
diff
changeset
|
1531 float_coerce, /*nb_coerce*/ |
|
44432
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1532 float_trunc, /*nb_int*/ |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1533 float_trunc, /*nb_long*/ |
|
37304
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
36759
diff
changeset
|
1534 float_float, /*nb_float*/ |
|
19051
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1535 0, /* nb_oct */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1536 0, /* nb_hex */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1537 0, /* nb_inplace_add */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1538 0, /* nb_inplace_subtract */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1539 0, /* nb_inplace_multiply */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1540 0, /* nb_inplace_divide */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1541 0, /* nb_inplace_remainder */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1542 0, /* nb_inplace_power */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1543 0, /* nb_inplace_lshift */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1544 0, /* nb_inplace_rshift */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1545 0, /* nb_inplace_and */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1546 0, /* nb_inplace_xor */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1547 0, /* nb_inplace_or */ |
|
21353
257c938900a6
float_int_div(): For clarity, move this closer to the other float
Tim Peters <tim.peters@gmail.com>
parents:
21097
diff
changeset
|
1548 float_floor_div, /* nb_floor_divide */ |
|
19051
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1549 float_div, /* nb_true_divide */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1550 0, /* nb_inplace_floor_divide */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1551 0, /* nb_inplace_true_divide */ |
| 6 | 1552 }; |
| 1553 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1554 PyTypeObject PyFloat_Type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41580
diff
changeset
|
1555 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
| 6 | 1556 "float", |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1557 sizeof(PyFloatObject), |
| 6 | 1558 0, |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1559 (destructor)float_dealloc, /* tp_dealloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1560 (printfunc)float_print, /* tp_print */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1561 0, /* tp_getattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1562 0, /* tp_setattr */ |
|
32150
65f9ad9bc829
Remove float_compare as per
Michael W. Hudson <mwh@python.net>
parents:
31590
diff
changeset
|
1563 0, /* tp_compare */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1564 (reprfunc)float_repr, /* tp_repr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1565 &float_as_number, /* tp_as_number */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1566 0, /* tp_as_sequence */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1567 0, /* tp_as_mapping */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1568 (hashfunc)float_hash, /* tp_hash */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1569 0, /* tp_call */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1570 (reprfunc)float_str, /* tp_str */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1571 PyObject_GenericGetAttr, /* tp_getattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1572 0, /* tp_setattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1573 0, /* tp_as_buffer */ |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1574 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19457
diff
changeset
|
1575 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1576 float_doc, /* tp_doc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1577 0, /* tp_traverse */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1578 0, /* tp_clear */ |
|
37304
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
36759
diff
changeset
|
1579 float_richcompare, /* tp_richcompare */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1580 0, /* tp_weaklistoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1581 0, /* tp_iter */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1582 0, /* tp_iternext */ |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27484
diff
changeset
|
1583 float_methods, /* tp_methods */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1584 0, /* tp_members */ |
|
44432
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1585 float_getset, /* tp_getset */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1586 0, /* tp_base */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1587 0, /* tp_dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1588 0, /* tp_descr_get */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1589 0, /* tp_descr_set */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1590 0, /* tp_dictoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1591 0, /* tp_init */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1592 0, /* tp_alloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18838
diff
changeset
|
1593 float_new, /* tp_new */ |
| 6 | 1594 }; |
|
5936
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5504
diff
changeset
|
1595 |
|
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5504
diff
changeset
|
1596 void |
| 34972 | 1597 _PyFloat_Init(void) |
| 1598 { | |
| 1599 /* We attempt to determine if this machine is using IEEE | |
| 1600 floating point formats by peering at the bits of some | |
| 1601 carefully chosen values. If it looks like we are on an | |
| 1602 IEEE platform, the float packing/unpacking routines can | |
| 1603 just copy bits, if not they resort to arithmetic & shifts | |
| 1604 and masks. The shifts & masks approach works on all finite | |
| 1605 values, but what happens to infinities, NaNs and signed | |
| 1606 zeroes on packing is an accident, and attempting to unpack | |
| 1607 a NaN or an infinity will raise an exception. | |
| 1608 | |
| 1609 Note that if we're on some whacked-out platform which uses | |
| 1610 IEEE formats but isn't strictly little-endian or big- | |
| 1611 endian, we will fall back to the portable shifts & masks | |
| 1612 method. */ | |
| 1613 | |
| 1614 #if SIZEOF_DOUBLE == 8 | |
| 1615 { | |
| 1616 double x = 9006104071832581.0; | |
| 1617 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0) | |
| 1618 detected_double_format = ieee_big_endian_format; | |
| 1619 else if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0) | |
| 1620 detected_double_format = ieee_little_endian_format; | |
| 1621 else | |
| 1622 detected_double_format = unknown_format; | |
| 1623 } | |
| 1624 #else | |
| 1625 detected_double_format = unknown_format; | |
| 1626 #endif | |
| 1627 | |
| 1628 #if SIZEOF_FLOAT == 4 | |
| 1629 { | |
| 1630 float y = 16711938.0; | |
| 1631 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0) | |
| 1632 detected_float_format = ieee_big_endian_format; | |
| 1633 else if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0) | |
| 1634 detected_float_format = ieee_little_endian_format; | |
| 1635 else | |
| 1636 detected_float_format = unknown_format; | |
| 1637 } | |
| 1638 #else | |
| 1639 detected_float_format = unknown_format; | |
| 1640 #endif | |
| 1641 | |
| 1642 double_format = detected_double_format; | |
| 1643 float_format = detected_float_format; | |
|
44267
f909872917b9
The new float repr causes too much trouble and pain. I'm disabling the feature until we have sorted out the issues on all machines. 64bit machines seem to have issues and Guido has reported even worse.
Christian Heimes <christian@cheimes.de>
parents:
44262
diff
changeset
|
1644 |
|
f909872917b9
The new float repr causes too much trouble and pain. I'm disabling the feature until we have sorted out the issues on all machines. 64bit machines seem to have issues and Guido has reported even worse.
Christian Heimes <christian@cheimes.de>
parents:
44262
diff
changeset
|
1645 #ifdef Py_BROKEN_REPR |
|
44262
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
1646 /* Initialize floating point repr */ |
|
24749a380409
Backport of r59456:59458 from py3k to trunk
Christian Heimes <christian@cheimes.de>
parents:
44085
diff
changeset
|
1647 _PyFloat_DigitsInit(); |
|
44267
f909872917b9
The new float repr causes too much trouble and pain. I'm disabling the feature until we have sorted out the issues on all machines. 64bit machines seem to have issues and Guido has reported even worse.
Christian Heimes <christian@cheimes.de>
parents:
44262
diff
changeset
|
1648 #endif |
|
45060
c05ee77b39f2
The previous change was causing a segfault after multiple calls to Py_Initialize() and Py_Finalize().
Christian Heimes <christian@cheimes.de>
parents:
45059
diff
changeset
|
1649 /* Init float info */ |
|
c05ee77b39f2
The previous change was causing a segfault after multiple calls to Py_Initialize() and Py_Finalize().
Christian Heimes <christian@cheimes.de>
parents:
45059
diff
changeset
|
1650 if (FloatInfoType.tp_name == 0) |
|
c05ee77b39f2
The previous change was causing a segfault after multiple calls to Py_Initialize() and Py_Finalize().
Christian Heimes <christian@cheimes.de>
parents:
45059
diff
changeset
|
1651 PyStructSequence_InitType(&FloatInfoType, &floatinfo_desc); |
| 34972 | 1652 } |
| 1653 | |
| 1654 void | |
| 45143 | 1655 PyFloat_CompactFreeList(size_t *pbc, size_t *pbf, size_t *bsum) |
|
5936
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5504
diff
changeset
|
1656 { |
|
10391
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1657 PyFloatObject *p; |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1658 PyFloatBlock *list, *next; |
|
32533
201986d6d9d6
Fix a couple of signed/unsigned comparison warnings
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
1659 unsigned i; |
| 45143 | 1660 size_t bc = 0, bf = 0; /* block count, number of freed blocks */ |
| 1661 size_t fsum = 0; /* total unfreed ints */ | |
| 1662 int frem; /* remaining unfreed ints per block */ | |
|
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
|
1663 |
|
e2a08a81e56f
OK, try again. Vladimir gave me a fix for the alignment bus error,
Guido van Rossum <guido@python.org>
parents:
10375
diff
changeset
|
1664 list = block_list; |
|
e2a08a81e56f
OK, try again. Vladimir gave me a fix for the alignment bus error,
Guido van Rossum <guido@python.org>
parents:
10375
diff
changeset
|
1665 block_list = NULL; |
|
10432
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1666 free_list = NULL; |
|
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
|
1667 while (list != NULL) { |
|
e2a08a81e56f
OK, try again. Vladimir gave me a fix for the alignment bus error,
Guido van Rossum <guido@python.org>
parents:
10375
diff
changeset
|
1668 bc++; |
|
e2a08a81e56f
OK, try again. Vladimir gave me a fix for the alignment bus error,
Guido van Rossum <guido@python.org>
parents:
10375
diff
changeset
|
1669 frem = 0; |
|
10432
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1670 for (i = 0, p = &list->objects[0]; |
|
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1671 i < N_FLOATOBJECTS; |
|
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1672 i++, p++) { |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
44344
diff
changeset
|
1673 if (PyFloat_CheckExact(p) && Py_REFCNT(p) != 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
|
1674 frem++; |
|
e2a08a81e56f
OK, try again. Vladimir gave me a fix for the alignment bus error,
Guido van Rossum <guido@python.org>
parents:
10375
diff
changeset
|
1675 } |
|
10391
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1676 next = list->next; |
|
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
|
1677 if (frem) { |
|
10391
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1678 list->next = block_list; |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1679 block_list = list; |
|
10432
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1680 for (i = 0, p = &list->objects[0]; |
|
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1681 i < N_FLOATOBJECTS; |
|
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1682 i++, p++) { |
|
19865
f2a3009b528e
Replace a few places where X->ob_type was compared to &PyXXX_Type with
Guido van Rossum <guido@python.org>
parents:
19753
diff
changeset
|
1683 if (!PyFloat_CheckExact(p) || |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
44344
diff
changeset
|
1684 Py_REFCNT(p) == 0) { |
|
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
44344
diff
changeset
|
1685 Py_TYPE(p) = (struct _typeobject *) |
|
10432
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1686 free_list; |
|
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1687 free_list = p; |
|
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1688 } |
|
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1689 } |
|
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
|
1690 } |
|
e2a08a81e56f
OK, try again. Vladimir gave me a fix for the alignment bus error,
Guido van Rossum <guido@python.org>
parents:
10375
diff
changeset
|
1691 else { |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12248
diff
changeset
|
1692 PyMem_FREE(list); /* XXX PyObject_FREE ??? */ |
|
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
|
1693 bf++; |
|
e2a08a81e56f
OK, try again. Vladimir gave me a fix for the alignment bus error,
Guido van Rossum <guido@python.org>
parents:
10375
diff
changeset
|
1694 } |
|
e2a08a81e56f
OK, try again. Vladimir gave me a fix for the alignment bus error,
Guido van Rossum <guido@python.org>
parents:
10375
diff
changeset
|
1695 fsum += frem; |
|
10391
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1696 list = next; |
|
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
|
1697 } |
| 45143 | 1698 *pbc = bc; |
| 1699 *pbf = bf; | |
| 1700 *bsum = fsum; | |
| 1701 } | |
| 1702 | |
| 1703 void | |
| 1704 PyFloat_Fini(void) | |
| 1705 { | |
| 1706 PyFloatObject *p; | |
| 1707 PyFloatBlock *list; | |
| 1708 unsigned i; | |
| 1709 size_t bc, bf; /* block count, number of freed blocks */ | |
| 1710 size_t fsum; /* total unfreed floats per block */ | |
| 1711 | |
| 1712 PyFloat_CompactFreeList(&bc, &bf, &fsum); | |
| 1713 | |
|
10391
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1714 if (!Py_VerboseFlag) |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1715 return; |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1716 fprintf(stderr, "# cleanup floats"); |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1717 if (!fsum) { |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1718 fprintf(stderr, "\n"); |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1719 } |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1720 else { |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1721 fprintf(stderr, |
| 45143 | 1722 ": %" PY_FORMAT_SIZE_T "d unfreed floats%s in %" |
| 1723 PY_FORMAT_SIZE_T "d out of %" | |
| 1724 PY_FORMAT_SIZE_T "d block%s\n", | |
|
10391
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1725 fsum, fsum == 1 ? "" : "s", |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1726 bc - bf, bc, bc == 1 ? "" : "s"); |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1727 } |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1728 if (Py_VerboseFlag > 1) { |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1729 list = block_list; |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1730 while (list != NULL) { |
|
10432
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1731 for (i = 0, p = &list->objects[0]; |
|
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1732 i < N_FLOATOBJECTS; |
|
1cc5d20d2ed8
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents:
10391
diff
changeset
|
1733 i++, p++) { |
|
19865
f2a3009b528e
Replace a few places where X->ob_type was compared to &PyXXX_Type with
Guido van Rossum <guido@python.org>
parents:
19753
diff
changeset
|
1734 if (PyFloat_CheckExact(p) && |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
44344
diff
changeset
|
1735 Py_REFCNT(p) != 0) { |
|
10391
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1736 char buf[100]; |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1737 PyFloat_AsString(buf, p); |
|
36759
83b860acfe95
Use %ld and casts to long for refcount printing, in absense of a universally
Thomas Wouters <thomas@python.org>
parents:
36675
diff
changeset
|
1738 /* XXX(twouters) cast refcount to |
|
83b860acfe95
Use %ld and casts to long for refcount printing, in absense of a universally
Thomas Wouters <thomas@python.org>
parents:
36675
diff
changeset
|
1739 long until %zd is universally |
|
83b860acfe95
Use %ld and casts to long for refcount printing, in absense of a universally
Thomas Wouters <thomas@python.org>
parents:
36675
diff
changeset
|
1740 available |
|
83b860acfe95
Use %ld and casts to long for refcount printing, in absense of a universally
Thomas Wouters <thomas@python.org>
parents:
36675
diff
changeset
|
1741 */ |
|
10391
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1742 fprintf(stderr, |
|
36759
83b860acfe95
Use %ld and casts to long for refcount printing, in absense of a universally
Thomas Wouters <thomas@python.org>
parents:
36675
diff
changeset
|
1743 "# <float at %p, refcnt=%ld, val=%s>\n", |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
44344
diff
changeset
|
1744 p, (long)Py_REFCNT(p), buf); |
|
10391
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1745 } |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1746 } |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10382
diff
changeset
|
1747 list = list->next; |
|
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
|
1748 } |
|
e2a08a81e56f
OK, try again. Vladimir gave me a fix for the alignment bus error,
Guido van Rossum <guido@python.org>
parents:
10375
diff
changeset
|
1749 } |
|
5936
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5504
diff
changeset
|
1750 } |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1751 |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1752 /*---------------------------------------------------------------------------- |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1753 * _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
|
1754 */ |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1755 int |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1756 _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
|
1757 { |
| 34972 | 1758 if (float_format == unknown_format) { |
| 1759 unsigned char sign; | |
| 1760 int e; | |
| 1761 double f; | |
| 1762 unsigned int fbits; | |
| 1763 int incr = 1; | |
| 1764 | |
| 1765 if (le) { | |
| 1766 p += 3; | |
| 1767 incr = -1; | |
| 1768 } | |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1769 |
| 34972 | 1770 if (x < 0) { |
| 1771 sign = 1; | |
| 1772 x = -x; | |
| 1773 } | |
| 1774 else | |
| 1775 sign = 0; | |
| 1776 | |
| 1777 f = frexp(x, &e); | |
| 1778 | |
| 1779 /* Normalize f to be in the range [1.0, 2.0) */ | |
| 1780 if (0.5 <= f && f < 1.0) { | |
| 1781 f *= 2.0; | |
| 1782 e--; | |
| 1783 } | |
| 1784 else if (f == 0.0) | |
| 1785 e = 0; | |
| 1786 else { | |
| 1787 PyErr_SetString(PyExc_SystemError, | |
| 1788 "frexp() result out of range"); | |
| 1789 return -1; | |
| 1790 } | |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1791 |
| 34972 | 1792 if (e >= 128) |
| 1793 goto Overflow; | |
| 1794 else if (e < -126) { | |
| 1795 /* Gradual underflow */ | |
| 1796 f = ldexp(f, 126 + e); | |
| 1797 e = 0; | |
| 1798 } | |
| 1799 else if (!(e == 0 && f == 0.0)) { | |
| 1800 e += 127; | |
| 1801 f -= 1.0; /* Get rid of leading 1 */ | |
| 1802 } | |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1803 |
| 34972 | 1804 f *= 8388608.0; /* 2**23 */ |
| 1805 fbits = (unsigned int)(f + 0.5); /* Round */ | |
| 1806 assert(fbits <= 8388608); | |
| 1807 if (fbits >> 23) { | |
| 1808 /* The carry propagated out of a string of 23 1 bits. */ | |
| 1809 fbits = 0; | |
| 1810 ++e; | |
| 1811 if (e >= 255) | |
| 1812 goto Overflow; | |
| 1813 } | |
| 1814 | |
| 1815 /* First byte */ | |
| 1816 *p = (sign << 7) | (e >> 1); | |
| 1817 p += incr; | |
| 1818 | |
| 1819 /* Second byte */ | |
| 1820 *p = (char) (((e & 1) << 7) | (fbits >> 16)); | |
| 1821 p += incr; | |
| 1822 | |
| 1823 /* Third byte */ | |
| 1824 *p = (fbits >> 8) & 0xFF; | |
| 1825 p += incr; | |
| 1826 | |
| 1827 /* Fourth byte */ | |
| 1828 *p = fbits & 0xFF; | |
| 1829 | |
| 1830 /* Done */ | |
| 1831 return 0; | |
| 1832 | |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1833 } |
| 34972 | 1834 else { |
|
35178
cf7a849ce61f
Apparently some compiler gives a warning on
Michael W. Hudson <mwh@python.net>
parents:
34972
diff
changeset
|
1835 float y = (float)x; |
| 34972 | 1836 const char *s = (char*)&y; |
| 1837 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
|
1838 |
|
45759
354e377c9590
Issue 705836: Fix struct.pack(">f", 1e40) to behave consistently
Mark Dickinson <dickinsm@gmail.com>
parents:
45381
diff
changeset
|
1839 if (Py_IS_INFINITY(y) && !Py_IS_INFINITY(x)) |
|
354e377c9590
Issue 705836: Fix struct.pack(">f", 1e40) to behave consistently
Mark Dickinson <dickinsm@gmail.com>
parents:
45381
diff
changeset
|
1840 goto Overflow; |
|
354e377c9590
Issue 705836: Fix struct.pack(">f", 1e40) to behave consistently
Mark Dickinson <dickinsm@gmail.com>
parents:
45381
diff
changeset
|
1841 |
| 34972 | 1842 if ((float_format == ieee_little_endian_format && !le) |
| 1843 || (float_format == ieee_big_endian_format && le)) { | |
| 1844 p += 3; | |
| 1845 incr = -1; | |
| 1846 } | |
|
45759
354e377c9590
Issue 705836: Fix struct.pack(">f", 1e40) to behave consistently
Mark Dickinson <dickinsm@gmail.com>
parents:
45381
diff
changeset
|
1847 |
| 34972 | 1848 for (i = 0; i < 4; i++) { |
| 1849 *p = *s++; | |
| 1850 p += incr; | |
| 1851 } | |
| 1852 return 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
|
1853 } |
|
45759
354e377c9590
Issue 705836: Fix struct.pack(">f", 1e40) to behave consistently
Mark Dickinson <dickinsm@gmail.com>
parents:
45381
diff
changeset
|
1854 Overflow: |
|
354e377c9590
Issue 705836: Fix struct.pack(">f", 1e40) to behave consistently
Mark Dickinson <dickinsm@gmail.com>
parents:
45381
diff
changeset
|
1855 PyErr_SetString(PyExc_OverflowError, |
|
354e377c9590
Issue 705836: Fix struct.pack(">f", 1e40) to behave consistently
Mark Dickinson <dickinsm@gmail.com>
parents:
45381
diff
changeset
|
1856 "float too large to pack with f format"); |
|
354e377c9590
Issue 705836: Fix struct.pack(">f", 1e40) to behave consistently
Mark Dickinson <dickinsm@gmail.com>
parents:
45381
diff
changeset
|
1857 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
|
1858 } |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1859 |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1860 int |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1861 _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
|
1862 { |
| 34972 | 1863 if (double_format == unknown_format) { |
| 1864 unsigned char sign; | |
| 1865 int e; | |
| 1866 double f; | |
| 1867 unsigned int fhi, flo; | |
| 1868 int incr = 1; | |
| 1869 | |
| 1870 if (le) { | |
| 1871 p += 7; | |
| 1872 incr = -1; | |
| 1873 } | |
| 1874 | |
| 1875 if (x < 0) { | |
| 1876 sign = 1; | |
| 1877 x = -x; | |
| 1878 } | |
| 1879 else | |
| 1880 sign = 0; | |
| 1881 | |
| 1882 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
|
1883 |
| 34972 | 1884 /* Normalize f to be in the range [1.0, 2.0) */ |
| 1885 if (0.5 <= f && f < 1.0) { | |
| 1886 f *= 2.0; | |
| 1887 e--; | |
| 1888 } | |
| 1889 else if (f == 0.0) | |
| 1890 e = 0; | |
| 1891 else { | |
| 1892 PyErr_SetString(PyExc_SystemError, | |
| 1893 "frexp() result out of range"); | |
| 1894 return -1; | |
| 1895 } | |
| 1896 | |
| 1897 if (e >= 1024) | |
| 1898 goto Overflow; | |
| 1899 else if (e < -1022) { | |
| 1900 /* Gradual underflow */ | |
| 1901 f = ldexp(f, 1022 + e); | |
| 1902 e = 0; | |
| 1903 } | |
| 1904 else if (!(e == 0 && f == 0.0)) { | |
| 1905 e += 1023; | |
| 1906 f -= 1.0; /* Get rid of leading 1 */ | |
| 1907 } | |
| 1908 | |
| 1909 /* fhi receives the high 28 bits; flo the low 24 bits (== 52 bits) */ | |
| 1910 f *= 268435456.0; /* 2**28 */ | |
| 1911 fhi = (unsigned int)f; /* Truncate */ | |
| 1912 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
|
1913 |
| 34972 | 1914 f -= (double)fhi; |
| 1915 f *= 16777216.0; /* 2**24 */ | |
| 1916 flo = (unsigned int)(f + 0.5); /* Round */ | |
| 1917 assert(flo <= 16777216); | |
| 1918 if (flo >> 24) { | |
| 1919 /* The carry propagated out of a string of 24 1 bits. */ | |
| 1920 flo = 0; | |
| 1921 ++fhi; | |
| 1922 if (fhi >> 28) { | |
| 1923 /* And it also progagated out of the next 28 bits. */ | |
| 1924 fhi = 0; | |
| 1925 ++e; | |
| 1926 if (e >= 2047) | |
| 1927 goto Overflow; | |
| 1928 } | |
| 1929 } | |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1930 |
| 34972 | 1931 /* First byte */ |
| 1932 *p = (sign << 7) | (e >> 4); | |
| 1933 p += incr; | |
| 1934 | |
| 1935 /* Second byte */ | |
| 1936 *p = (unsigned char) (((e & 0xF) << 4) | (fhi >> 24)); | |
| 1937 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
|
1938 |
| 34972 | 1939 /* Third byte */ |
| 1940 *p = (fhi >> 16) & 0xFF; | |
| 1941 p += incr; | |
| 1942 | |
| 1943 /* Fourth byte */ | |
| 1944 *p = (fhi >> 8) & 0xFF; | |
| 1945 p += incr; | |
| 1946 | |
| 1947 /* Fifth byte */ | |
| 1948 *p = fhi & 0xFF; | |
| 1949 p += incr; | |
| 1950 | |
| 1951 /* Sixth byte */ | |
| 1952 *p = (flo >> 16) & 0xFF; | |
| 1953 p += incr; | |
| 1954 | |
| 1955 /* Seventh byte */ | |
| 1956 *p = (flo >> 8) & 0xFF; | |
| 1957 p += incr; | |
| 1958 | |
| 1959 /* Eighth byte */ | |
| 1960 *p = flo & 0xFF; | |
| 1961 p += incr; | |
| 1962 | |
| 1963 /* Done */ | |
| 1964 return 0; | |
| 1965 | |
| 1966 Overflow: | |
| 1967 PyErr_SetString(PyExc_OverflowError, | |
| 1968 "float too large to pack with d format"); | |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1969 return -1; |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1970 } |
| 34972 | 1971 else { |
| 1972 const char *s = (char*)&x; | |
| 1973 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
|
1974 |
| 34972 | 1975 if ((double_format == ieee_little_endian_format && !le) |
| 1976 || (double_format == ieee_big_endian_format && le)) { | |
| 1977 p += 7; | |
| 1978 incr = -1; | |
| 1979 } | |
| 1980 | |
| 1981 for (i = 0; i < 8; i++) { | |
| 1982 *p = *s++; | |
| 1983 p += incr; | |
| 1984 } | |
| 1985 return 0; | |
| 1986 } | |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1987 } |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1988 |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1989 double |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
1990 _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
|
1991 { |
| 34972 | 1992 if (float_format == unknown_format) { |
| 1993 unsigned char sign; | |
| 1994 int e; | |
| 1995 unsigned int f; | |
| 1996 double x; | |
| 1997 int incr = 1; | |
| 1998 | |
| 1999 if (le) { | |
| 2000 p += 3; | |
| 2001 incr = -1; | |
| 2002 } | |
| 2003 | |
| 2004 /* First byte */ | |
| 2005 sign = (*p >> 7) & 1; | |
| 2006 e = (*p & 0x7F) << 1; | |
| 2007 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
|
2008 |
| 34972 | 2009 /* Second byte */ |
| 2010 e |= (*p >> 7) & 1; | |
| 2011 f = (*p & 0x7F) << 16; | |
| 2012 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
|
2013 |
| 34972 | 2014 if (e == 255) { |
| 2015 PyErr_SetString( | |
| 2016 PyExc_ValueError, | |
| 2017 "can't unpack IEEE 754 special value " | |
| 2018 "on non-IEEE platform"); | |
| 2019 return -1; | |
| 2020 } | |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2021 |
| 34972 | 2022 /* Third byte */ |
| 2023 f |= *p << 8; | |
| 2024 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
|
2025 |
| 34972 | 2026 /* Fourth byte */ |
| 2027 f |= *p; | |
| 2028 | |
| 2029 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
|
2030 |
| 34972 | 2031 /* XXX This sadly ignores Inf/NaN issues */ |
| 2032 if (e == 0) | |
| 2033 e = -126; | |
| 2034 else { | |
| 2035 x += 1.0; | |
| 2036 e -= 127; | |
| 2037 } | |
| 2038 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
|
2039 |
| 34972 | 2040 if (sign) |
| 2041 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
|
2042 |
| 34972 | 2043 return 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
|
2044 } |
| 34972 | 2045 else { |
| 35987 | 2046 float x; |
| 2047 | |
| 34972 | 2048 if ((float_format == ieee_little_endian_format && !le) |
| 2049 || (float_format == ieee_big_endian_format && le)) { | |
| 35987 | 2050 char buf[4]; |
| 34972 | 2051 char *d = &buf[3]; |
| 2052 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
|
2053 |
| 34972 | 2054 for (i = 0; i < 4; i++) { |
| 2055 *d-- = *p++; | |
| 2056 } | |
| 35987 | 2057 memcpy(&x, buf, 4); |
| 34972 | 2058 } |
| 2059 else { | |
| 35987 | 2060 memcpy(&x, p, 4); |
| 34972 | 2061 } |
| 35987 | 2062 |
| 2063 return x; | |
| 34972 | 2064 } |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2065 } |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2066 |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2067 double |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2068 _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
|
2069 { |
| 34972 | 2070 if (double_format == unknown_format) { |
| 2071 unsigned char sign; | |
| 2072 int e; | |
| 2073 unsigned int fhi, flo; | |
| 2074 double x; | |
| 2075 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
|
2076 |
| 34972 | 2077 if (le) { |
| 2078 p += 7; | |
| 2079 incr = -1; | |
| 2080 } | |
| 2081 | |
| 2082 /* First byte */ | |
| 2083 sign = (*p >> 7) & 1; | |
| 2084 e = (*p & 0x7F) << 4; | |
| 2085 | |
| 2086 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
|
2087 |
| 34972 | 2088 /* Second byte */ |
| 2089 e |= (*p >> 4) & 0xF; | |
| 2090 fhi = (*p & 0xF) << 24; | |
| 2091 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
|
2092 |
| 34972 | 2093 if (e == 2047) { |
| 2094 PyErr_SetString( | |
| 2095 PyExc_ValueError, | |
| 2096 "can't unpack IEEE 754 special value " | |
| 2097 "on non-IEEE platform"); | |
| 2098 return -1.0; | |
| 2099 } | |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2100 |
| 34972 | 2101 /* Third byte */ |
| 2102 fhi |= *p << 16; | |
| 2103 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
|
2104 |
| 34972 | 2105 /* Fourth byte */ |
| 2106 fhi |= *p << 8; | |
| 2107 p += incr; | |
| 2108 | |
| 2109 /* Fifth byte */ | |
| 2110 fhi |= *p; | |
| 2111 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
|
2112 |
| 34972 | 2113 /* Sixth byte */ |
| 2114 flo = *p << 16; | |
| 2115 p += incr; | |
| 2116 | |
| 2117 /* Seventh byte */ | |
| 2118 flo |= *p << 8; | |
| 2119 p += incr; | |
| 2120 | |
| 2121 /* Eighth byte */ | |
| 2122 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
|
2123 |
| 34972 | 2124 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */ |
| 2125 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
|
2126 |
| 34972 | 2127 if (e == 0) |
| 2128 e = -1022; | |
| 2129 else { | |
| 2130 x += 1.0; | |
| 2131 e -= 1023; | |
| 2132 } | |
| 2133 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
|
2134 |
| 34972 | 2135 if (sign) |
| 2136 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
|
2137 |
| 34972 | 2138 return x; |
| 2139 } | |
|
28335
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2140 else { |
| 35987 | 2141 double x; |
| 2142 | |
| 34972 | 2143 if ((double_format == ieee_little_endian_format && !le) |
| 2144 || (double_format == ieee_big_endian_format && le)) { | |
| 2145 char buf[8]; | |
| 2146 char *d = &buf[7]; | |
| 2147 int i; | |
| 2148 | |
| 2149 for (i = 0; i < 8; i++) { | |
| 2150 *d-- = *p++; | |
| 2151 } | |
| 35987 | 2152 memcpy(&x, buf, 8); |
| 34972 | 2153 } |
| 2154 else { | |
| 35987 | 2155 memcpy(&x, p, 8); |
| 34972 | 2156 } |
| 35987 | 2157 |
| 2158 return 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
|
2159 } |
|
70003b0cb837
New private API functions _PyFloat_{Pack,Unpack}(4,8}. This is a
Tim Peters <tim.peters@gmail.com>
parents:
27521
diff
changeset
|
2160 } |
