浮点运算

时间:2011-03-17 13:33:15

标签: c++ floating-point integer bitwise-operators

我想将浮点数的存储转换为整数('number'值不需要相等)。

如果浮点数(例如10)用二进制表示(至少在我的实现中):

01000001001000000000000000000000

然后它应该(也在我的实现上)代表整数值1092616192。

我目前通过以下方式做到这一点:

union UNFI {
    float a;
    int b;
};

UNFI n;
n.a = 10;
int bits = n.b; // foo!

for (int i=31; i>=0; --i) {
    bool bit = ((bits >> i) & 1);
    std::cout << bit;
}

这是实现我想要的,但就其本质而言,它是未定义的行为。因此,我想知道实现这一结果的“正确”方法是什么。

来自C99标准:

With one exception, if the value of a member of a union object is used when the most recent store to the object was to a different member,the behavior is implementation-defined.

这不是未定义的行为吗?

3 个答案:

答案 0 :(得分:3)

正确的方法是致电memcpy。大多数编译器会像工会一样将其优化为高效的单字内存访问,但在具有额外对齐要求的平台上,他们会做正确的事情。并且它不会触发信号NaN。

float a = 10;

char bits[sizeof a];
memcpy(bits, &a, sizeof a);

int b;
static_assert(sizeof b == sizeof a);
memcpy(&b, &a, sizeof a);

答案 1 :(得分:0)

什么是未定义的?
IEEE浮点的布局非常明确,唯一的复杂因素是平台上的字节排序(以及int的大小)

答案 2 :(得分:0)

您所追求的是简单类型的软管。你在做什么似乎是最简单的事情。我认为另一种选择是指针转换。

int const bits = *(reinterpret_cast<int *>(&n))