summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2017-11-06 13:36:08 -0700
committerGitHub <noreply@github.com>2017-11-06 13:36:08 -0700
commitece0c5d2107143532df4f1abdb56d74212a47c7e (patch)
tree642a62da7f92fee5ceca78c4474030dcd8fe034d /numpy
parent6063ee87753bb8ca28bbda914eaf24108fd805c9 (diff)
parent7b4ec2aa559cdd8b838844893efa56442132e1ab (diff)
downloadnumpy-ece0c5d2107143532df4f1abdb56d74212a47c7e.tar.gz
Merge pull request #9967 from eric-wieser/separate-longdouble-int
MAINT: Separate correct `longdouble.__float__` from incorrect `longdouble.__int__`
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/src/multiarray/scalartypes.c.src102
1 files changed, 43 insertions, 59 deletions
diff --git a/numpy/core/src/multiarray/scalartypes.c.src b/numpy/core/src/multiarray/scalartypes.c.src
index a208c2f73..3fa8f14dc 100644
--- a/numpy/core/src/multiarray/scalartypes.c.src
+++ b/numpy/core/src/multiarray/scalartypes.c.src
@@ -816,55 +816,42 @@ halftype_@kind@(PyObject *self)
/**end repeat**/
-
-/*
- * Could improve this with a PyLong_FromLongDouble(longdouble ldval)
- * but this would need some more work...
- */
-
/**begin repeat
- *
- * #name = (int, float)*2#
- * #KIND = (Long, Float)*2#
- * #char = ,,c*2#
- * #CHAR = ,,C*2#
- * #POST = ,,.real*2#
+ * #char = ,c#
+ * #CHAR = ,C#
+ * #POST = ,.real#
*/
static PyObject *
-@char@longdoubletype_@name@(PyObject *self)
+@char@longdoubletype_float(PyObject *self)
{
- double dval;
- PyObject *obj, *ret;
+ npy_longdouble val = PyArrayScalar_VAL(self, @CHAR@LongDouble)@POST@;
+ return PyFloat_FromDouble((double) val);
+}
- dval = (double)(((Py@CHAR@LongDoubleScalarObject *)self)->obval)@POST@;
- obj = Py@KIND@_FromDouble(dval);
- if (obj == NULL) {
- return NULL;
- }
- ret = Py_TYPE(obj)->tp_as_number->nb_@name@(obj);
- Py_DECREF(obj);
- return ret;
+static PyObject *
+@char@longdoubletype_long(PyObject *self)
+{
+ npy_longdouble val = PyArrayScalar_VAL(self, @CHAR@LongDouble)@POST@;
+
+ /*
+ * This raises OverflowError when the cast overflows to infinity (gh-9964)
+ *
+ * Could fix this with a PyLong_FromLongDouble(longdouble ldval)
+ * but this would need some more work...
+ */
+ return PyLong_FromDouble((double) val);
}
-/**end repeat**/
#if !defined(NPY_PY3K)
-/**begin repeat
- *
- * #name = (long, hex, oct)*2#
- * #KIND = (Long*3)*2#
- * #char = ,,,c*3#
- * #CHAR = ,,,C*3#
- * #POST = ,,,.real*3#
+/**begin repeat1
+ * #name = int, hex, oct#
*/
static PyObject *
@char@longdoubletype_@name@(PyObject *self)
{
- double dval;
- PyObject *obj, *ret;
-
- dval = (double)(((Py@CHAR@LongDoubleScalarObject *)self)->obval)@POST@;
- obj = Py@KIND@_FromDouble(dval);
+ PyObject *ret;
+ PyObject *obj = @char@longdoubletype_long(self);
if (obj == NULL) {
return NULL;
}
@@ -872,10 +859,12 @@ static PyObject *
Py_DECREF(obj);
return ret;
}
-/**end repeat**/
+/**end repeat1**/
#endif /* !defined(NPY_PY3K) */
+/**end repeat**/
+
static PyNumberMethods gentype_as_number = {
(binaryfunc)gentype_add, /*nb_add*/
(binaryfunc)gentype_subtract, /*nb_subtract*/
@@ -4111,37 +4100,32 @@ initialize_numeric_types(void)
/**end repeat**/
- /*
- * These need to be coded specially because getitem does not
- * return a normal Python type
- */
- PyLongDoubleArrType_Type.tp_as_number = &longdoubletype_as_number;
- PyCLongDoubleArrType_Type.tp_as_number = &clongdoubletype_as_number;
/**begin repeat
- * #name = int, float, repr, str#
- * #kind = tp_as_number->nb*2, tp*2#
+ * #char = ,c#
+ * #CHAR = ,C#
*/
- PyLongDoubleArrType_Type.@kind@_@name@ = longdoubletype_@name@;
- PyCLongDoubleArrType_Type.@kind@_@name@ = clongdoubletype_@name@;
-
- /**end repeat**/
-
-
-#if !defined(NPY_PY3K)
- /**begin repeat
- * #name = long, hex, oct#
- * #kind = tp_as_number->nb*3#
+ /*
+ * These need to be coded specially because longdouble/clongdouble getitem
+ * does not return a normal Python type
*/
+ @char@longdoubletype_as_number.nb_float = @char@longdoubletype_float;
+#if defined(NPY_PY3K)
+ @char@longdoubletype_as_number.nb_int = @char@longdoubletype_long;
+#else
+ @char@longdoubletype_as_number.nb_int = @char@longdoubletype_int;
+ @char@longdoubletype_as_number.nb_long = @char@longdoubletype_long;
+ @char@longdoubletype_as_number.nb_hex = @char@longdoubletype_hex;
+ @char@longdoubletype_as_number.nb_oct = @char@longdoubletype_oct;
+#endif
- PyLongDoubleArrType_Type.@kind@_@name@ = longdoubletype_@name@;
- PyCLongDoubleArrType_Type.@kind@_@name@ = clongdoubletype_@name@;
+ Py@CHAR@LongDoubleArrType_Type.tp_as_number = &@char@longdoubletype_as_number;
+ Py@CHAR@LongDoubleArrType_Type.tp_repr = @char@longdoubletype_repr;
+ Py@CHAR@LongDoubleArrType_Type.tp_str = @char@longdoubletype_str;
/**end repeat**/
-#endif
-
PyStringArrType_Type.tp_itemsize = sizeof(char);
PyVoidArrType_Type.tp_dealloc = (destructor) void_dealloc;