首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Float32到Float16

Float32到Float16
EN

Stack Overflow用户
提问于 2010-06-11 21:45:47
回答 3查看 21.6K关注 0票数 12

有人能解释一下我如何将32位浮点值转换为16位浮点值吗?

(s =符号e=指数和m=尾数)

如果32位浮点数为1s7e24m

16位浮点数为1s5e10m。

那它就像做一样简单吗?

代码语言:javascript
复制
int     fltInt32;
short   fltInt16;
memcpy( &fltInt32, &flt, sizeof( float ) );

fltInt16 = (fltInt32 & 0x00FFFFFF) >> 14;
fltInt16 |= ((fltInt32 & 0x7f000000) >> 26) << 10;
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);

我猜没那么简单..。有人能告诉我你需要做什么吗?

编辑:我看到我的指数偏移错了.这样会更好吗?

代码语言:javascript
复制
fltInt16 =  (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x7c000000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;

我希望这是正确的。如果我错过了已经说过的很明显的东西,我很抱歉。在一个周五的晚上已经快午夜了..。所以我并不是“完全”清醒;)

编辑2:哎哟。又搞砸了。我想失去前3位,而不是更低!那么这个怎么样:

代码语言:javascript
复制
fltInt16 =  (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x0f800000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;

的最终代码应该是

代码语言:javascript
复制
fltInt16    =  ((fltInt32 & 0x7fffffff) >> 13) - (0x38000000 >> 13);
fltInt16    |= ((fltInt32 & 0x80000000) >> 16);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-11 21:53:12

float32和float16表示中的指数可能是偏的,而且有不同的偏倚。您需要解偏从float32表示中得到的指数,才能得到实际的指数,然后对float16表示进行偏置。

除了这些细节,我确实认为它是如此简单,但我仍然感到惊讶的浮点表示不时。

编辑:

当你使用指数做事情时,

  1. 会检查是否溢出。
  2. --你的算法稍微突然地截断了最后几个比特,这可能是可以接受的,但是你可能想要通过查看即将被丢弃的比特来实现,比如说,圆周到最近。“0.”->整数,“100..001.”->圈,"100..00“->圈到偶数。
票数 4
EN

Stack Overflow用户

发布于 2011-04-07 21:38:03

指数必须是无偏的,夹紧的和重偏重的。这是我使用的快速代码:

代码语言:javascript
复制
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.

  • Underflowing表示的
  • 溢出值将给出未定义的float16值,将在2^-152^-14之间返回一个未定义的值,而不是2^-14将提供未定义的值。

小心戴上护垫。如果您的架构使用它们,它们可能会极大地减慢您的程序。

票数 12
EN

Stack Overflow用户

发布于 2010-06-11 21:58:18

下面是一篇关于IEEE754的文章的链接,文章给出了位布局和偏差。

http://en.wikipedia.org/wiki/IEEE_754-2008

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3026441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档