我需要一个跨平台的库/算法,它将在32位和16位浮点数之间进行转换.我不需要使用16位数进行数学运算; 我只需要减小32位浮点数的大小,以便它们可以通过网络发送.我在C++工作.
我理解我会失去多少精确度,但这对我的应用来说是可以的.
IEEE 16位格式会很棒.
有人可以向我解释如何将32位浮点值转换为16位浮点值吗?
(s =符号e =指数,m =尾数)
如果32位浮点数是1s7e24m
而16位浮点数是1s5e10m
那么这么简单吗?
int fltInt32;
short fltInt16;
memcpy( &fltInt32, &flt, sizeof( float ) );
fltInt16 = (fltInt32 & 0x00FFFFFF) >> 14;
fltInt16 |= ((fltInt32 & 0x7f000000) >> 26) << 10;
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);
Run Code Online (Sandbox Code Playgroud)
我假设它不是那么简单......所以有人能告诉我你需要做什么吗?
编辑:我看到我的指针转移错误了...所以这会更好吗?
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x7c000000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;
Run Code Online (Sandbox Code Playgroud)
我希望这是正确的.如果我遗漏了一些明显的话,我会道歉.它在星期五晚上几乎是午夜......所以我不是"完全"清醒;)
编辑2:哎呀.又把它弄错了.我想失去前3位而不是更低!那怎么样:
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x0f800000) >> …Run Code Online (Sandbox Code Playgroud)