首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

adlay 仍是那个需求, 2个float[-500~500], 存入unsigned char[3]

2013-04-20 
adlay 还是那个需求, 2个float[-500~500], 存入unsigned char[3]#pragma pack(1)union SmallFloat {unsign

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. 就直接取整来保存好了...

热点排行