adlay 还是那个需求, 2个float[-500~500], 存入unsigned char[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));
getchar();
return 1;
}
adlay 还是那个需求, 2个float[-500~500], 存入unsigned char[3],
如果数范围在-255~255时尽可能保留精度, 如果超出范围则小数去除四舍五入取整
有啥思路吗?
[解决办法]
保存 -500 ~ 500 之间的整数都要 10 个 bit, 2个数就要 20 个bit了, 3 个 char 一共 才 24 个bit. 就直接取整来保存好了...