[Python-ideas] Adding a half-float (16-bit) type to PEP 3118 (and possibly the struct module?)

Robert Kern robert.kern at gmail.com
Wed Mar 30 22:42:56 CEST 2011

On 3/30/11 3:05 PM, Mark Dickinson wrote:
> On Wed, Mar 30, 2011 at 8:53 PM, Robert Kern<robert.kern at gmail.com>  wrote:
>> Like Ellipsis, multidimensional extended slicing, complex numbers, and
>> non-bool rich comparisons? :-)
> Indeed!
> (BTW, I didn't know that Python's complex numbers were NumPy
> influenced:  thanks for that.)
>> capably handled by the old buffer protocol. Still, it's worth defining the
>> standard to allow third parties to communicate the full spectrum of things
>> they want to tell each other.
> Yes, that makes sense.  It's not very clear to me what the scope of
> the Python additions would be.

As far as I can tell (and I've really only looked at PEP 3118 in any detail 
today), only producers and consumers of the buffer actually care about the 
contents of the format string, and consumers are free to reject format codes 
that they don't understand. I think you can just treat the section of the PEP 
defining the format codes as informational, much like the DB-API only a little 
more rigorous. Adding support for it to the struct module is a good bonus.

As a digression, it would be great if the format codes were defined in an 
extensible fashion, such that two agreeing third parties could talk to each 
other using their own format codes without having to modify the PEP. It already 
contains a little bit of this with the 't' code. If you could add a 
distinguishing name as well (besides the ':name:' syntax, which is reserved for 
adding names to fields, not types), then numpy and Cython could simply agree 
that '16t{half}', for example, meant a half-float without having to wait for the 
PEP to be modified.

> [OT]: How is NumPy's float16 type implemented?  Is it clever enough to
> do correct rounding for all basic arithmetic operations, or does it
> suffer from the double-rounding problems that you'd get from (convert
> operands to float64; do op in float64; round back to float16)?

We do the latter, I'm afraid. Except with float32 instead of float64.


Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
  that is made terrible by our own mad attempt to interpret it as though it had
  an underlying truth."
   -- Umberto Eco

More information about the Python-ideas mailing list