How to convert half-precision number into hexadecimal representation?
47 views (last 30 days)
I am using matlab 2019B with support for complex half-precision operations. I want to store my results in a file but fwrite doesn't support class half. Some workaround is to convert to hex and then store as uint16. The problem is that num2hex also doesn't support half class. One way to obtain hexadecimal representation I have found is to use format hex, but parsing output string is not a solution for me.
My question is - Is there any native posibility to store half-precission numbers if file, or convert to hexadecimal representation for further processing?
James Tursa on 24 Apr 2020
Edited: James Tursa on 25 Apr 2020
I don't have R2019b installed so I don't know how half precision numbers are stored, but can you use typecast:
h = your half precision variable
u16 = typecast(h,'uint16');
Another option is a mex routine, but I would need to know how the half precision values are stored first.
I just checked, and unfortunately the new half precision type is not a fundamental numeric type like double or uint16 ... it is an opaque type like OOP classdef objects. So even though isnumeric(half) returns true, half precision variables are not stored the same as the native numeric variables are. The data areas are hidden.
I have no idea why TMW would choose to implement a basic numeric type this way, but they must have their reasons. The half precision type is fundamentally different from all of the other numeric types. Not suprisingly, the typecast( ) function does not work since the storage scheme is fundamentally different. This also makes a mex option out of the question since the data area is hidden. What a pain ... why couldn't they have just made it compatible with all the other numeric types??? THERE WILL BE NO WAY TO EFFICIENTLY WORK WITH HALF VARIBLES IN A MEX ROUTINE BECAUSE OF THIS! (yes I am shouting)
For your purpose, you only need the hex patterns or equivalent bit patterns to write out. So I can offer my C-mex code for this, which can be found here:
You would convert your half precision variable to single, then call my C-mex routine to turn it into the uint16 half precision bit pattern. Then you can write that uint16 variable directly to a file in binary with fwrite( ). I just need to check to see if it still works in later versions of MATLAB. I will get back to you ...
I downloaded my halfprecision C-mex file and it seems to compile and run OK. Just don't use the -R2018a mex option because the code isn't updated yet for R2018a+. My halfprecision C code will also handle the inf, nan, and denorm patterns just fine. You would compile it as follows:
>> halfpi = half(pi) % The MATLAB half class
3.1406250 % MATLAB is apparently using the single display code for this
>> hp = halfprecision(pi) % my C-mex routine ...
uint16 % ... returns a uint16 variable that contains the half precision bit pattern
>> halfprecision(hp,'disp') % my C-mex routine has a display option
>> halfprecision(hp,'single') % my C-mex routine can convert it back into other classes
>> sprintf('%04x',hp) % If you want the hex values as ASCII text, do this
>> halfinf = half(inf)
>> hinf = halfprecision(inf)
>> halfnan = half(nan)
>> hnan = halfprecision(nan)
>> format hex
More Answers (1)
Krishna Bindumadhavan on 6 May 2020
You can use half.typecast() and storedInteger functions as a workaround to convert to and from half precision and the underlying uint16 storage.
Appreciate your feedback regarding typecast,fwrite,num2hex, and mxArray limitations. We will consider better support for these in a future release.