Pertanyaan Bagaimana mengapung dan ganda diwakili dalam C ++ (gcc)?


Bagaimana floating point diwakili dan ditafsirkan oleh kompilator. Saya mencoba memahami itu sehingga saya dapat dengan mudah menafsirkan apa array byte berarti untuk mengapung dan ganda.

Terima kasih


5
2017-07-15 14:09


asal


Jawaban:


Untuk benar-benar menafsirkannya Anda mungkin tidak ingin memperlakukannya sebagai byte karena batas mantisa tidak sejajar dengan batas 8bit.

Sesuatu di sepanjang baris:

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

Akan membiarkan Anda menariknya terpisah untuk bermain dengan pusat jus.

EDIT:

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

      }
    }

Menghasilkan:

    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 . . .

1
2017-07-15 16:34



Coba tautan ini: http://en.wikipedia.org/wiki/IEEE_754

Saya baru saja menemukan bahwa ini mungkin sedikit lebih bermanfaat: http://en.wikipedia.org/wiki/IEEE_754-1985

Ini adalah Standar IEEE untuk angka floating point. Ada satu dari 1985 dan edisi revisi dari 2008. Float adalah 32bit, double adalah 64bit (dijelaskan di tautan kedua).


Edit: Thx ke komentar oleh Don, inilah tautan ke Intels 80bit floating point description: http://en.wikipedia.org/wiki/Extended_precision


14
2017-07-15 14:11



Mungkin juga perlu dicatat bahwa ada a static bool const anggota dari std::numeric_limits, is_iec559, yang secara alami hanya tersedia untuk tipe floating point. Namanya cukup jelas ...


3
2017-07-15 14:29