我有一些顶点以float_3的形式出现。我想给它们添加一个整数,然后将它们作为float_4寄出。我不想将整数转换为具有相同值的浮点数,我需要这些位完全相同(整数是存储桶xyz值一起移位的位)。
这是我尝试过的:
void tagVerts (vector<float_3> &Verts, vector<float_4> &Output) {
int len = Verts.size();
for (int i = 0; i < len; i++) {
Output[i].xyz = Verts[i];
Output[i].w = reinterpret_cast<float>(XYZTag(Verts[i]));
}
}
它说无效的类型转换:/
编辑:
float_3和float_4来自amp.h,据我所知,它们只是具有大量转换和赋值帮助器函数的结构中的3个或4个浮点数。
XYZTag如下:
int XYZTag(float_3 pos) {
pos = pos * mul + add;
int_3 posi (static_cast<int>(pos.x), static_cast<int>(pos.y), static_cast<int>(pos.z));
return((posi.x << 10) + posi.y << 10) + posi.z;
}
最佳答案
您不得将int
的位解释为float
,因为这样做会违反strict aliasing rules并因此调用未定义的行为。正确的方法是使用memcpy
复制这些位。
#include <cstring>
inline float
int_bits_to_float(const int bits)
{
static_assert(sizeof(int) >= sizeof(float), "too few bits");
float target;
std::memcpy(&target, &bits, sizeof(float));
return target;
}
乍看之下,这是一个糟糕的解决方案,我们真的应该期望编译器指出,可以将其优化为几个移动指令。即使在默认优化级别下,GCC也会这样做。