Как плавание, и удваивается представленный в C++ (gcc)?

Другой случай для новый - то, что я называю Фу Кодирование . Винни-Пух следует за животиком. Я говорю, идут с язык, который Вы используете, не против это.

Возможности состоят в том, что специалисты по обслуживанию языка оптимизируют язык для идиом, которые они пытаются поощрить. Если они помещают новое ключевое слово на язык, они, вероятно, думают, что имеет смысл быть ясным при создании нового экземпляра.

Код, записанный следующий за намерениями языка, увеличится в эффективности с каждым выпуском. И код, избегающий ключевых конструкций языка, пострадает со временем.

РЕДАКТИРОВАНИЕ: И это подходит вне производительности. Я не могу считать времена, которые я услышал (или сказал), "какого черта они делали это ?" при нахождении странно выглядящего кода. Часто оказывается, что в то время, когда код был записан, была некоторая "хорошая" причина его. После дао языка Ваша лучшая страховка для того, чтобы не высмеивать Ваш код несколько лет с этого времени.

5
задан 15 July 2009 в 14:09
поделиться

3 ответа

Чтобы на самом деле интерпретировать его, вы, вероятно, в любом случае не захотите рассматривать его как байты, потому что границы мантисы не совпадают с 8-битной границей.

Что-то вроде:

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

Будет позвольте вам разобрать его, чтобы поиграть с центром сока.

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;

      }
    }

Производит:

    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
ответ дан 18 December 2019 в 09:09
поделиться

Try this link: http://en.wikipedia.org/wiki/IEEE_754

I just found that this might be a little more helpful: http://en.wikipedia.org/wiki/IEEE_754-1985

This is the IEEE-Standard for floating point numbers. There is one from 1985 and a revised edition from 2008. Float is 32bit, double is 64bit (explained in the second link).


Edit: Thx to the comment by Don, here's the link to Intels 80bit floating point description: http://en.wikipedia.org/wiki/Extended_precision

14
ответ дан 18 December 2019 в 09:09
поделиться

Также стоит отметить, что есть член static bool const в std :: numeric_limits , is_iec559 , который, естественно, доступен только для типов с плавающей запятой. Название говорит само за себя ...

3
ответ дан 18 December 2019 в 09:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: