Thanks! So it looks like I can say "R writeBin/readBin does not support half-precision floats" even though the error message "size 2 is unknown on this machine" seems to contradict that (for some machine). I tried to figure out from the source code (src/main/connections.c) how it decides what is possible, but that was a little beyond me. That was really just to satisfy my curiosity. The unsigned 16-bit integer approach works well-enough for me and it has the advantage that I know it will always work on anyone's system. I'm working with numbers from 0 to 2 with no more than 4 significant digits, so a 16-bit float with 11 digits of precision was appealing. It's not hard to work with uint16, though, and od also reads it easily. I've been working on a message about this application which I will share soon, probably later tonight.

I'm also experimenting with a lossy storage using a single byte per integer (uint8). That might be a good strategy because the numbers I'm working with are inherently imprecise. It seems to work fine in R, but it doesn't seem to work with GNU od (Linux/UNIX program) and that makes me wonder what else can handle it. uint16 seems the safer bet, and there is no loss of precision. Of course, the downside is that the uint16 file is twice as big as the uint8 file, and these files may be several hundred GB in size.

Mike


On Sun, 4 Jan 2015, Uwe Ligges wrote:

Following the posting guide and hence reading the help page first helps:

"Possible sizes are 1, 2, 4 and possibly 8 for integer or logical vectors, and 4, 8 and possibly 12/16 for numeric vectors."


On Sun, 4 Jan 2015, Duncan Murdoch wrote:

On 04/01/2015 12:31 AM, Mike Miller wrote:
It's an IEEE standard format:

http://en.wikipedia.org/wiki/Half-precision_floating-point_format#IEEE_754_half-precision_binary_floating-point_format:_binary16

This is what I see:

writeBin(vec , con, size=2 )
Error in writeBin(vec, con, size = 2) : size 2 is unknown on this machine

I'm not sure what the machine has to do with it.  It's really up to the
software, isn't it?

Yes, but R relies on the underlying C run-time library for a lot of things like this. On your platform, is there a C type corresponding to half precision? If so, let us know the details, and we'll possibly add it to writeBin.



Is there a way to get R to read/write half-precision numbers (binary16)?

If it's not supported by the C run-time library and has to be done entirely using other types, that's the sort of thing that belongs in a user-contributed package. I'm not aware of one that already has it, so you may have to write this yourself.

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to