精度值在C中的intBitsTofloat中丢弃

时间:2014-12-01 04:21:16

标签: c 64-bit bit-manipulation

我有一个双倍值= 10.233387434223。我想通过网络传输它。 我通过使用将此值转换为int32位 以下功能

    int floatToRawIntBits(float_t  x)
{
  union {
    float_t f;  // assuming 32-bit IEEE 754 single-precision
    int32_t i;    // assuming 32-bit 2's complement int
        } u;

 u.f = x;
 return u.i;
}

然后我尝试使用函数

来取回它
union int_float_bits {
    int64_t int_bits;
  float_t float_bits;
};

float_t intBitsToFloat:(int64_t x)
{
    union int_float_bits bits;
    bits.int_bits = x;
    return bits.float_bits;
}

输出为:10.233387。 但我想要取回原始值0f 10.233387434223而不是10.233387。

intBitsToDouble可能是一种可能的解决方案吗?

我也尝试使用这些代码

int DoubleToRawIntBits(double_t  x)
{
    union {
        double_t f;
        int64_t i;
    } u;

    u.f = x;
    return u.i;
}

并且

union int_double_bits {
    int64_t int_bits;
    double_t double_bits;
};
double_t intBitsToDouble(int64_t x)
{
    union int_double_bits bits;
    bits.int_bits = x;
    return bits.double_bits;
}

但结果是0.0000000。

请帮帮我,谢谢。

1 个答案:

答案 0 :(得分:1)

你的问题是第一个函数只返回64位双精度的32位。仅传输那些32位。因此,下一个函数不能构造整个double,因为它实际上没有32位的double。它无法从中获取信息。如果它不存在,那就不存在了。你需要传输整个双。我不确切知道你在做什么,但如果你能发送32位,你也应该能够发送64位。