float都不超过512.0, -512.0, 怎么将其存储到unsigned char[3]中
float都不超过512.0, -512.0, 如何将其存储到unsigned char[3]中?
float都不超过512.0, -512.0, 如何将其存储到unsigned char[3]中?
float a = 500.0, b=-500.0;
将其存入:
unsigned char data[3];
求算法和解释?
------解决方案--------------------
如果依赖于浮点数本身在内存里面的结构的话, 可以这样:
float都不超过512.0, -512.0, 如何将其存储到unsigned char[3]中?
float a = 500.0, b=-500.0;
将其存入:
unsigned char data[3];
求算法和解释?
------解决方案--------------------
如果依赖于浮点数本身在内存里面的结构的话, 可以这样:
#pragma pack(1)
union SmallFloat {
unsigned char data[3];
struct {
unsigned int man : 18;
unsigned int exp : 5;
unsigned int sign : 1;
} _SF;
};
union NormalFloat {
float value;
struct {
unsigned int man : 23;
unsigned int exp : 8;
unsigned int sign : 1;
} _NF;
};
#pragma pack()
void nf2sf(float x, unsigned char data[3])
{
NormalFloat& nf = (NormalFloat&)x;
SmallFloat& sf = (SmallFloat&)data[0];
sf._SF.sign = nf._NF.sign;
unsigned int exp = nf._NF.exp;
if(exp > 127 + 15)
exp = 127 + 15;
if(exp < 127 - 15)
exp = 127 - 15;
exp += 15;
exp -= 127;
sf._SF.exp = exp;
sf._SF.man = nf._NF.man >> 5;
}
float sf2nf(unsigned char data[3])
{
NormalFloat nf;
SmallFloat& sf = (SmallFloat&)data[0];
nf._NF.sign = sf._SF.sign;
nf._NF.exp = sf._SF.exp + 127 - 15;
nf._NF.man = sf._SF.man << 5;
return nf.value;
}
int main()
{
unsigned char d[3] = { 0 };
nf2sf(123.456f, d);
printf("%f\n", sf2nf(d));
nf2sf(0.01232454f, d);
printf("%f\n", sf2nf(d));
}