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 格式十六进制浮点数
十六进制单精度浮点数转十进制浮点数:
- 方式一
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
- 方式二
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中的转换