在matlab中进行32位十六进制到32位浮点(IEEE 754)转换

时间:2011-03-08 12:53:26

标签: matlab floating-point hex ieee-754

如何根据IEEE 754?

将32位十六进制值更改为浮点值

编辑:

...
data = fread(fid,1,'float32');
disp(data);
...

我得到了这个答案:

4.2950e + 009 1.6274e + 009 ...

但是如何获得32位浮点数(IEEE 754)?

1 个答案:

答案 0 :(得分:3)

根据您的一条评论,您的十六进制值似乎存储为文件中的字符串。您首先要以8个为一组从文件中读取这些字符。根据文件的具体格式(例如,每组8个字符在其自己的行上,或者它们用逗号分隔等),您可以使用FSCANFTEXTSCAN等功能来执行此操作。例如,如果您的数据文件如下所示:

409BFFFF
3B3C0000
85E60000

然后您可以将数据读入字符数组,如下所示:

fid = fopen(fileName,'r');  %# Open the file
data = textscan(fid,'%s');  %# Read the data
charArray = char(data{1});  %# Create a character array
fclose(fid);                %# Close the file

现在需要将这些32位十六进制字符串转换为单精度表示形式。到目前为止最简单的方法是使用函数HEX2DEC将字符串转换为整数(存储为双精度值),使用函数UINT32将它们转换为无符号32位整数,然后转换为使用函数TYPECAST的32位整数到单精度表示。将其应用于上面的示例数据可得出以下结果:

>> values = typecast(uint32(hex2dec(charArray)),'single');
>> fprintf('% 1.42f\n',values);  %# Display the values
 4.874999523162841800000000000000000000000000
 0.002868652343750000000000000000000000000000
-0.000000000000000000000000000000000021629096

您可以使用this online hexadecimal-to-floating-point converter确认这些结果是否正确。


如果有人感兴趣,你可以使用函数HEX2DEC自己进行上述类型转换,首先将字符串转换为整数表示,然后是函数BITGET提取和处理sign, exponent, and fraction of the single-precision number的位。例如:

>> a = '409BFFFF';  %# A sample hexadecimal value
>> b = hex2dec(a);  %# Convert to an integer
>> sign = bitget(b,32);                               %# Compute the sign
>> exponent = bitget(b,24:31)*2.^(0:7).';            %'# Compute the exponent
>> fraction = bitget(b,1:23)*2.^(-23:-1).';          %'# Compute the fraction
>> value = (-1)^sign*(1+fraction)*2^(exponent-127);   %# Compute the value
>> fprintf('%1.7f\n',value)                           %# Display the value
4.8749995