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

5 c++ floating-point computer-science

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

谢谢

Tob*_*ner 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

  • 我补充一点,这是绝大多数情况,但选择也受到硬件的影响. (3认同)

NoM*_*ots 1

要实际解释它,您可能不想将其视为字节,因为尾数边界不与 8 位边界对齐。

大致如下:

mantisa =  (*(unsigned int *)&floatVal) | MANTISA_MASK;
exp     = ((*(unsigned int *)&floatVal) | EXP_MASK    ) >> EXP_SHIFT;
sign    = ((*(unsigned int *)&floatVal) | SIGN_MASK   ) >> SIGN_SHIFT;
Run Code Online (Sandbox Code Playgroud)

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

编辑:

    #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;

      }
    }
Run Code Online (Sandbox Code Playgroud)

生产:

    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 . . .
Run Code Online (Sandbox Code Playgroud)