如何根据IEEE 754?
将32位十六进制值更改为浮点值编辑:
...
data = fread(fid,1,'float32');
disp(data);
...
我得到了这个答案:
4.2950e + 009 1.6274e + 009 ...
但是如何获得32位浮点数(IEEE 754)?
答案 0 :(得分:3)
根据您的一条评论,您的十六进制值似乎存储为文件中的字符串。您首先要以8个为一组从文件中读取这些字符。根据文件的具体格式(例如,每组8个字符在其自己的行上,或者它们用逗号分隔等),您可以使用FSCANF或TEXTSCAN等功能来执行此操作。例如,如果您的数据文件如下所示:
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