IEEE754标准

以下计算按规格化规定:

S:符号位
M:分数值
E:指数偏移值


单精度浮点数(32bit):

NUM_single = (-1)^S *  1.M   *   2^(E-127)

双精度浮点数(64bit):

NUM_double = (-1)^S *  1.M   *   2^(E-1023)



十六进制单精度浮点数 与 十进制浮点数 互转:

MATLAB:
a = '45438971'                              % IEEE754 格式十六进制浮点数
b = typecast(uint32(hex2dec(a)),'single')   % 十进制单精度浮点数

sprintf('```%tx',single(b))                 % IEEE754 格式十六进制浮点数



十六进制单精度浮点数转十进制浮点数:

  1. 方式一
a = textread('4.txt','%s');      % 读取字符
n = length(a(:));                % 计算数组长度
b = hex2single(a)
t = linspace(0,1000,n);
plot(t,b, "*");

function number_transform = hex2single(hexString)
binString = dec2bin(hex2dec(hexString));
binString = [char(zeros(size(binString, 1),32-length(binString)) + 48) binString];
if binString(1) == '0'
    number_transform = (1 + single(bin2dec(binString(:, 10:end)))/2^23).*2.^(bin2dec(binString(:, 2:9)) - 127);
else
    number_transform = -(1 + single(bin2dec(binString(:, 10:end)))/2^23).*2.^(bin2dec(binString(:, 2:9)) - 127);
end
end

  1. 方式二
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

取值范围:
博客园 - IEEE754 32位浮点数表示范围

参考链接:
CSDN - IEEE754标准 单精度(32位)/双精度(64位)浮点数解码
博客园 - 二进制小数及 IEEE 浮点表示
MATLAB论坛 - 浮点数在内存中表示方式的理解
MATLAB论坛 - MATLAB怎么实现浮点数到16进制的转换(float)?
IT屋 - 32位十六进制到32位浮点(IEEE 754)在matlab中的转换

posted @ 2020-07-22 22:19  纟彖氵戋  阅读(641)  评论(0编辑  收藏  举报