我有一些顶点以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也会这样做。

10-01 14:27
查看更多