将uint8值转换为规范化浮点数非常简单:
uint8 i = 0xAF;
float f = float(i)/float(0xFF);
但这感觉比它应该更贵......
有没有办法让这种转换效率更高?我主要是出于好奇,但也因为我的3D程序进行了很多次转换。
可读性并不重要,uint8将始终涵盖整个范围
0 == 0.f
和255 == 1.f
答案 0 :(得分:2)
如果您关闭编译器严格的别名规则,下面是一些可以在常用平台上执行您喜欢的操作:
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;
}
答案 1 :(得分:1)
以下是我看到的操作:
i
转换为浮点并存储在临时变量中(或
寄存器)。i
的浮点值除以浮点常数f
。瓶颈在于分裂。分工需要很长时间,一段时间(无论如何实施)。
下一个主要瓶颈可能是将整数转换为浮点数。某些处理器可能有单个指令来执行此操作;否则将执行软件功能(通常比分区更快)。