首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将uint8转换为0-1范围浮动的最有效方法

将uint8转换为0-1范围浮动的最有效方法
EN

Stack Overflow用户
提问于 2016-01-24 17:13:22
回答 2查看 4K关注 0票数 4

将uint8值转换为规范化浮点数是非常直接的:

代码语言:javascript
复制
uint8 i = 0xAF;
float f = float(i)/float(0xFF);

但这感觉比它应该要贵..。

有没有更有效的方法让这个转换更有效?我问这个问题主要是出于好奇,但也是因为我的3D程序使这种转换有了很多次。

可读性并不重要,而且uint8总是跨越整个范围

0 == 0.f255 == 1.f

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-24 18:15:59

下面是我看到的操作:

在编译时:

  • 将0xFF转换为浮点常量。

在运行时:

  1. i转换为浮点并存储在临时变量(或寄存器)中。
  2. 用浮点常数除以i浮点值。
  3. 将除法的结果分配给浮点变量f

瓶颈:

瓶颈在部门。除法需要很长的时间和时间(不管它是如何实现的)。

下一个主要瓶颈可能是整数到浮点数的转换。有些处理器可能有执行此操作的单一指令;否则将执行软件功能(通常比除法更快)。

优化:

  1. 把组织处理掉。使用另一种方法,如移位或表查找。
  2. 将浮点转换最小化。只在必要时转换,通常是在输入和输出时。保持积分或停留在浮点。

备注:

  • 硬编码常量是快速编译器存储在内存和执行从内存.编译器不需要计算。
  • 常量表达式速度更快,但可以减慢编译速度(可能微不足道)。编译器执行计算,并将结果放入可执行文件中。
  • 乘法通常比除法快。
  • 积分数学通常比浮点更快,因为浮点格式需要分开,在计算之前,再重新组合后置字(即使在硬件中,也比简单的积分运算要多)。
票数 1
EN

Stack Overflow用户

发布于 2016-01-24 18:24:05

如果您关闭编译器严格的混叠规则,下面是一些在公共平台上可以做您喜欢的事情的肮脏技巧:

代码语言:javascript
复制
float tofloat(uint8_t x) {
  uint32_t foo = 0x3f800000 + x * 0x8080;
  return (float &)foo + 256 - 257;
}

float tofloat(uint8_t x) {
  uint32_t foo = 0x3f800000 + x * 0x8080 + (x+1) / 2;
  return (float &)foo - 1;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34978843

复制
相关文章

相似问题

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