如何根據IEEE 754將32位十六進制值更改爲浮點值?matlab中的32位十六進制到32位浮點(IEEE 754)轉換
編輯:
...
data = fread(fid,1,'float32');
disp(data);
...
我得到這樣的回答:
4.2950e + 009 1.6274e + 009 ...
但我如何獲得32位浮點(IEEE 754)號碼?
如何根據IEEE 754將32位十六進制值更改爲浮點值?matlab中的32位十六進制到32位浮點(IEEE 754)轉換
編輯:
...
data = fread(fid,1,'float32');
disp(data);
...
我得到這樣的回答:
4.2950e + 009 1.6274e + 009 ...
但我如何獲得32位浮點(IEEE 754)號碼?
根據您的某條評論,您的十六進制值顯示爲文件中的字符串。您首先需要從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位整數,然後將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
爲什麼使用'num2str'?你爲什麼不直接用'fread'將這個值直接讀入float? – 2011-03-08 14:26:46
他告訴我,我必須使用字符串格式。 :/ – kame 2011-03-08 14:32:23
num2str()返回科學格式的字符串(例如2.22e-16)...不是十六進制值。所以將num2str()的輸出強制轉換爲hex2num()必然會失敗... – Andreass 2011-03-08 14:33:12