浮点二进制表示中的混淆

时间:2012-07-07 19:38:48

标签: c floating-point number-formatting ieee-754

我试图输出以下内容但感到困惑,

    float f=3.4;
    char *cp;
    cp=(char *)&f;
    printf("%d\n",*cp);

归一化数我已经计算出IEEE 754标准是

0 10000000 10110011001100110011001

这就是为什么我假设cp现在值为,

10011001

转换为2的补码后,

01100111

它应输出-103,但在我的流血/ DevC中得到-102。 为什么这样输出???

2 个答案:

答案 0 :(得分:4)

那是因为f正在被围捕:

3.4 = 10110011001100110011001 100110011001...  (repeating 1001)

四舍五入到:

3.4 = 10110011001100110011010
                            ^

存储到单精度浮点时。

现在,当您提取最后8位时,实际上是10011010而不是10011001

转换10011010 - > -102代替-103

答案 1 :(得分:2)

我认为你算错了:

Prelude> decodeFloat (3.4 :: Float)
(14260634,-22)
(0.03 secs, 2929112 bytes)
Prelude> Numeric.showHex (fst it) ""
"d9999a"

尾数以1010结尾。