浮点数为32和64位二进制表示形式

时间:2018-10-02 17:42:50

标签: c++ floating-point

我需要获取某个浮点值(双精度值)的64位二进制表示形式(IEEE 754)。 我有以下代码用于float的32位二进制表示形式:

union
{
    float input;   // assumes sizeof(float) == sizeof(int)
    int   output;
}   data;
data.input = value;
std::bitset<sizeof(float) * CHAR_BIT>   bits(data.output);

在这种情况下工会与convert依者有何关系?为什么我应该使用它? 是否有一些漂亮的方法可以完成64位表示?

1 个答案:

答案 0 :(得分:3)

  

在这种情况下工会与convert依者有何关系?

在C11中,允许您使用union来执行“类型调整”,这是此处转换的本质:将与float相关的位重新解释为( ,假定为32位)。

  

为什么要使用它?

您不应使用此功能。在C ++中,这被认为是未定义的行为,尽管许多主流编译器将支持即开即用的基于联合类型的对等操作,但不能始终依靠它们来提供这种行为,尤其是当C ++标准在未来。

  

是否有一些漂亮的方法可以完成64位表示?

如果编译器保证基于联合类型的双工,则只需将其替换为适当的64位整数:

static_assert(sizeof(double) == sizeof(uint64_t));
union {
    double input;
    uint64_t output;
} data;
data.input = value;
std::bitset<sizeof(double) * CHAR_BIT> bits(data.output);

如果没有,则没有 pretty 方法,但是有一种方法可以保证定义的行为:

static_assert(sizeof(double) == sizeof(uint64_t));
uint64_t output;
double input = value;
memcpy(output, input, sizeof(double));
std::bitset<sizeof(double) * CHAR_BIT> bits(output);