读书人

float 按位压缩替int,然后按位解压为f

发布时间: 2013-09-11 16:26:28 作者: rapoo

float 按位压缩为int,然后按位解压为float 不丢失精度
code functions to pack and unpack a range of float into a limited number of bits:
unsigned int pack_float( float val,float minVal,flaot maxVal,int bits)

float unpack_float( unsigned int val,float minVal,float maxVal int bits)

unsigned int pack_float(float val, float minVal, float maxVal, int bits)
{
assert(bits < 32);
assert(val >= minVal && val < maxVal);
return (unsigned int)(1U<<bits)*(val-minVal)/(maxVal-minVal);
}

float unpack_float(unsigned int val, float minVal, float maxVal, int bits)
{
assert(bits < 32);
assert(val < (1U<<bits));
return val*(maxVal-minVal)/(1U<<bits)+minVal;
}

[解决办法]
怎么不考虑 直接 按符号位 指数位 尾数位分贝压缩就是
[解决办法]
就是个线性变换。
先计算 val 在 [min,max] 中的比例 t。
然后找 [0,2^(bits)] 中给出同样比例 t 的数字,作为 val 压缩后的值。
unpack 反着来就行了。
[解决办法]
注意到sizeof (unsigned int) = sizeof (float) = 4

union x {
float f;
unsigned int u;
};

unsigned int pack_float(float f)
{
union x v;
v.f = f;
return v.u;
}

float unpack_float(unsigned int u)
{
union x v;
v.u = u;
return v.f;
}

------解决方案--------------------


引用:
注意到sizeof (unsigned int) = sizeof (float) = 4

union x {
float f;
unsigned int u;
};

unsigned int pack_float(float f)
{
union x v;
v.f = f;
return v.u;
}

float unpack_float(unsigned int u)
{
union x v;
v.u = u;
return v.f;
}


没有这种规定
实际上sizeof (unsigned int)和sizeof (float)间的对应关系没有固定
16位平台上sizeof (unsigned int) = 2而sizeof (float)= 4
[解决办法]
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

[解决办法]
32Bits 不必压缩,直接可以当做int
16Bits long

不要任何处理,不会丢失任何数据,因为都是32Bits
例如:
float f=18.654;
int i =*(int*)(&f);
float f2 =*(float *)&i;

读书人网 >C++

热点推荐