2011-03-08 197 views
2

如何根據IEEE 754將32位十六進制值更改爲浮點值?matlab中的32位十六進制到32位浮點(IEEE 754)轉換

編輯:

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

我得到這樣的回答:

4.2950e + 009 1.6274e + 009 ...

但我如何獲得32位浮點(IEEE 754)號碼?

+0

爲什麼使用'num2str'?你爲什麼不直接用'fread'將這個值直接讀入float? – 2011-03-08 14:26:46

+0

他告訴我,我必須使用字符串格式。 :/ – kame 2011-03-08 14:32:23

+0

num2str()返回科學格式的字符串(例如2.22e-16)...不是十六進制值。所以將num2str()的輸出強制轉換爲hex2num()必然會失敗... – Andreass 2011-03-08 14:33:12

回答

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位整數,然後將32位整數轉換爲單精度使用功能TYPECAST的表示。將其應用到我上面的樣本數據提供了以下結果:

>> 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 
相關問題