It's an odd confluence of circumstances that makes numpy.float64 behave 
this way. The code that causes the problem is this:

sage/structure/coerce.pyx:965 (cpdef canonical_coercion)
        elif y_numeric:
            try:
                sage_parent = py_scalar_parent(type(y))
                if sage_parent is None or 
sage_parent.has_coerce_map_from(xp):
                    return y.__class__(x), y
                else:
                    return self.canonical_coercion(x, sage_parent(y))
            except (TypeError, ValueError):
                self._record_exception()

Some of the relevant facts:

sage: sage.structure.coerce.py_scalar_parent(type(np.float(1)))
Real Double Field
sage: sage.structure.coerce.py_scalar_parent(type(np.float64(1)))
None

but on the other hand, with  cython("def isnum(a): return PY_IS_NUMERIC(a)")

sage: isnum(np.float(1))
True
sage: isnum(np.float32(1))
False
sage: isnum(np.float64(1))
True
sage: isnum(np.float128(1))
False

So it seems to be the combination of "float64" being "numeric" but having 
no corresponding "sage scalar parent" defined for it. We have

#define PY_IS_NUMERIC(zzz_obj) \
     (PyInt_Check(zzz_obj) ||  PyBool_Check(zzz_obj) || 
PyLong_Check(zzz_obj) || \
       PyFloat_Check(zzz_obj) || PyComplex_Check(zzz_obj))

Indeed:

sage: isinstance(np.float64(1),float)
True
sage: isinstance(np.float32(1),float)
False
sage: isinstance(np.float128(1),float)
False
sage: isinstance(np.float(1),float)
True
sage: type(np.float(1))
<type 'float'>

so the problem is that float64 (at least on most machines) inherits from 
float but isn't exactly a float.

We can probably solve the problem by changing py_scalar_parent to check 
types via "isinstance" rather than comparison by "is". In the process, you 
can also type the argument "py_type" to be a "type". That will cause cython 
to generate more efficient code for "isinstance".

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at http://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to