2011/5/11 Sturla Molden <stu...@molden.no> > Den 09.05.2011 15:58, skrev Keith Goodman: > > On Mon, May 9, 2011 at 1:46 AM, Pauli Virtanen<p...@iki.fi> wrote: > >> Sun, 08 May 2011 14:45:45 -0700, Keith Goodman wrote: > >>> I'm writing a function that accepts four possible dtypes: int32, int64, > >>> float32, float64. The function will call a C extension (wrapped in > >>> Cython). What are the equivalent C types? int, long, float, double, > >>> respectively? Will that work on all systems? > >> Long can be 32-bit or 64-bit, depending on the platform. > >> > >> The types available in Numpy are listed here, including > >> the information which of them are compatible with which C types: > >> > >> http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html > >> > >> The C long seems not to be listed -- but it's the same as > >> "Python int", i.e., np.int_ will work. > >> > >> IIRC, the Numpy type codes, dtype.kind, map directly to C types. > > Does this mapping look right? > > > > No. > > C int is at least 16 bits, C long is at least 32 bits. > > The size of long and size of int depend on compiler and platform. > > I'd write a small Cython function and ask the C compiler for an > authorative answer. > > Alternatively you could use ctypes. This is 64-bit Python on Windows: > > >>> import ctypes > >>> ctypes.sizeof(ctypes.c_long) > 4 > >>> ctypes.sizeof(ctypes.c_int) > 4 > > I think Keith's approach should work, as long as there is one C type listed on the url you mention that corresponds to your four dtypes. Something like (not tested at all):
map = {} for dtype in ('int32', 'int64', 'float32', 'float64'): for ctype (N.byte, N.short, N.intc, N.long.long, ...): # List all compatible C types here if N.dtype(ctype) == dtype: map{dtype} = ctype break assert len(map) == 4 -=- Olivier
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion