转载:http://www.niuguwen.cn/blog/13926.html
参考:【【计算机组成原理】十进制转IEEE754单精度浮点数格式-哔哩哔哩】 https://b23.tv/JtLOtKI
C语言实现 byte 转float IEEE754
博主:xinyu391 发表时间:2017-08-05 10:52:14 浏览量:699
编程语言主要采用IEEE754来存储浮点数,这里有IEEE标准的介绍(百度百科),或者这里 (知乎:IEEE 754格式是什么?)
在C语言中对于float,用4字节存储,
比如
1.618000 ,在内存中为 160 26 207 63
1.000000, 在内存中为 0 0 128 63
那么我有4个字节数据,比如{160 26 207 63},怎么转成float呢?
其实很简单:
#include <stdio.h>
#include <math.h>
typedef unsigned char byte;
//C语言实现 byte 转float IEEE754 http://www.niuguwen.cn/blog/13926.html
float b2f(byte m0, byte m1, byte m2, byte m3)
{
// 公式 (-1)^S*1.M*2^(E-127)
// 其中S是阶符(占1位), E是阶码(占8位), M是尾数(占23)总共32位
//
// 求符号位
float sig = 1.;
if (m0 >= 128.)
sig = -1.;
printf("sig %f", sig);
//求阶码
float jie = 0.;
if (m0 >= 128.) //如果是负数
{
jie = m0 - 128.;
}
else
{
jie = m0;
}
jie = jie * 2.; //计算m0的E部分
if (m1 >= 128.) //m1的E部分在最高不能忘了
jie += 1.;
printf("jie %f", jie);
jie -= 127.; //按照公式E-127
printf("jie %f", jie);
//求尾码
float tail = 0.;
if (m1 >= 128.)
m1 -= 128.;
tail = m3 + (m2 + m1 * 256.) * 256.;
printf("tail %f", tail);
tail = (tail) / 8388608; // 8388608 = 2^23
printf("tail %f", tail);
float f = sig * pow(2., jie) * (1 + tail);
return f;
}
int main(int argc, char* argv[])
{
float f = 2.0;
byte* pf = (byte*)&f;
printf("F: %f %#x %#x %#x %#x ", f, pf[0], pf[1], pf[2], pf[3]);
//float 低位在前
byte m0 = pf[3]; //高字节
byte m1 = pf[2];
byte m2 = pf[1];
byte m3 = pf[0]; // 低字节
f = b2f(m0, m1, m2, m3);
printf("b2f %f", f);
return 0;
}