有人能解释一下我如何将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);我猜没那么简单..。有人能告诉我你需要做什么吗?
编辑:我看到我的指数偏移错了.这样会更好吗?
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x7c000000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;我希望这是正确的。如果我错过了已经说过的很明显的东西,我很抱歉。在一个周五的晚上已经快午夜了..。所以我并不是“完全”清醒;)
编辑2:哎哟。又搞砸了。我想失去前3位,而不是更低!那么这个怎么样:
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x0f800000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;的最终代码应该是
fltInt16 = ((fltInt32 & 0x7fffffff) >> 13) - (0x38000000 >> 13);
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);发布于 2010-06-11 21:53:12
float32和float16表示中的指数可能是偏的,而且有不同的偏倚。您需要解偏从float32表示中得到的指数,才能得到实际的指数,然后对float16表示进行偏置。
除了这些细节,我确实认为它是如此简单,但我仍然感到惊讶的浮点表示不时。
编辑:
当你使用指数做事情时,
发布于 2011-04-07 21:38:03
指数必须是无偏的,夹紧的和重偏重的。这是我使用的快速代码:
unsigned int fltInt32;
unsigned short fltInt16;
fltInt16 = (fltInt32 >> 31) << 5;
unsigned short tmp = (fltInt32 >> 23) & 0xff;
tmp = (tmp - 0x70) & ((unsigned int)((int)(0x70 - tmp) >> 4) >> 27);
fltInt16 = (fltInt16 | tmp) << 10;
fltInt16 |= (fltInt32 >> 13) & 0x3ff;对于指数的查找表,这段代码会更快,但是我使用这个表,因为它很容易适应SIMD工作流。
执行方面的限制:
不能用values.
2^-15和2^-14之间返回一个未定义的值,而不是2^-14将提供未定义的值。小心戴上护垫。如果您的架构使用它们,它们可能会极大地减慢您的程序。
发布于 2010-06-11 21:58:18
下面是一篇关于IEEE754的文章的链接,文章给出了位布局和偏差。
http://en.wikipedia.org/wiki/IEEE_754-2008
https://stackoverflow.com/questions/3026441
复制相似问题