如何在C ++(gcc)中表示float和double?

时间:2009-07-15 14:09:19

标签: c++ computer-science floating-point

如何由编译器表示和解释浮点。我试图理解这一点,所以我可以很容易地解释字节数组对浮点数和双精度数的意义。

由于

3 个答案:

答案 0 :(得分:14)

试试此链接:http://en.wikipedia.org/wiki/IEEE_754

我刚发现这可能会有所帮助:http://en.wikipedia.org/wiki/IEEE_754-1985

这是浮点数的IEEE标准。 1985年有一个,2008年有修订版。浮点数为32位,双倍为64位(在第二个链接中说明)。


编辑:这是Don的评论,这里是Intels 80bit浮点描述的链接:http://en.wikipedia.org/wiki/Extended_precision

答案 1 :(得分:3)

值得注意的是,static bool const成员std::numeric_limitsis_iec559,自然只适用于浮点类型。这个名字非常自我解释......

答案 2 :(得分:1)

要实际解释它,您可能不希望将其视为字节,因为mantisa边界不会与8位边界对齐。

有些事情:

mantisa =  (*(unsigned int *)&floatVal) | MANTISA_MASK;
exp     = ((*(unsigned int *)&floatVal) | EXP_MASK    ) >> EXP_SHIFT;
sign    = ((*(unsigned int *)&floatVal) | SIGN_MASK   ) >> SIGN_SHIFT;

让你把它拆开来玩果汁中心。

编辑:

    #include <stdio.h>

    void main()
    {
    float a = 4;
    unsigned int exp,sign,mantisa;
    int i;

        for(i = 0;i<4;i++)
        {
            exp      = (*((unsigned int *)&a) >>23) & 0xFF;
            sign     = (*((unsigned int *)&a) >>31) & 0x01;
            mantisa  = (*((unsigned int *)&a)) & 0x7FFFFF | 0x800000;

            printf("a       = %04x\r\n",*((unsigned int *)&a));
            printf("a       = %f\r\n",a);
            printf("exp     = %i, %02x\r\n",exp,exp);
            printf("sign    = %i, %02x\r\n",sign,sign);
            printf("mantisa = %i, %02x\r\n\r\n",mantisa,mantisa);
            a = -a / 2;

      }
    }

产地:

    a       = 40800000
    a       = 4.000000
    exp     = 129, 81
    sign    = 0, 00
    mantisa = 8388608, 800000

    a       = c0000000
    a       = -2.000000
    exp     = 128, 80
    sign    = 1, 01
    mantisa = 8388608, 800000

    a       = 3f800000
    a       = 1.000000
    exp     = 127, 7f
    sign    = 0, 00
    mantisa = 8388608, 800000

    a       = bf000000
    a       = -0.500000
    exp     = 126, 7e
    sign    = 1, 01
    mantisa = 8388608, 800000

    Press any key to continue . . .