IEEE 754 представительство - PullRequest
5 голосов
/ 30 января 2010

Может кто-нибудь просмотреть мою программу и сказать, правильно ли я это делаю?

Я принимаю пользовательский ввод в виде 8 шестнадцатеричных цифр. Я хочу интерпретировать эти 8 цифр как 32-разрядное число с плавающей точкой IEEE 754 и распечатать информацию об этом числе.

вот мой вывод:

IEEE 754 32-bit floating point

byte order: little-endian

>7fffffff

0x7FFFFFFF
signBit 0, expbits 255, fractbits 0x007FFFFF
normalized:   exp = 128
SNaN

>40000000

0x40000000
signBit 0, expbits 128, fractbits 0x00000000
normalized:   exp = 1

>0

0x00000000
signBit 0, expbits 0, fractbits 0x00000000
+zero

вот код ..

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{


int HexNumber;
int tru_exp =0;
int stored_exp;
int negative;
int exponent;
int mantissa;

printf("IEEE 754 32-bit floating point");


int a = 0x12345678;
unsigned char *c = (unsigned char*)(&a);
if (*c == 0x78)
{
    printf("\nbyte order: little-endian\n");
}
else
{
    printf("\nbyte order: big-endian\n");
}

do{

printf("\n>");
scanf("%x", &HexNumber);

    printf("\n0x%08X",HexNumber);

negative = !!(HexNumber & 0x80000000);
exponent = (HexNumber & 0x7f800000) >> 23;
mantissa = (HexNumber & 0x007FFFFF);


printf("\nsignBit %d, ", negative);
printf("expbits %d, ", exponent);
printf("fractbits 0x%08X", mantissa);
//  "%#010x, ", mantissa);

if(exponent == 0)
{
    if(mantissa != 0)
    {
        printf("\ndenormalized  ");
    }
}
else{
    printf("\nnormalized:   ");
    tru_exp = exponent - 127;
    printf("exp = %d", tru_exp);
}

if(exponent == 0 && mantissa == 0 && negative == 1)
{

    printf("\n-zero");

}

if(exponent ==0 && mantissa == 0 && negative == 0)
{
 printf("\n+zero");
}



if(exponent == 255 && mantissa != 0 && negative == 1)
{

    printf("\nQNaN");

}

   if(exponent == 255 && mantissa != 0 && negative == 0)
{

    printf("\nSNaN");

}

if(exponent == 0xff && mantissa == 0 && negative == 1)
{
    printf("\n-infinity");
}

if(exponent == 0xff && mantissa == 0 && negative == 0)
{
    printf("\n+infinity");
}


    printf("\n");
}while(HexNumber != 0);



return 0;
  }

Не думаю, что нормализовано правильно?

1 Ответ

5 голосов
/ 30 января 2010

Как правило, вы довольно близки. Некоторые комментарии:

  • 0x7fffffff - это тихий NaN, а не сигнальный NaN. Знаковый бит не определяет, является ли NaN тихим; скорее это ведущий бит поля значимости (предпочтительный термин для того, что вы называете «мантисса»). 0xffbfffff является сигнальным NaN, например.

Редактировать: interjay правильно указывает, что эта кодировка на самом деле не требуется по IEEE-754; платформа может использовать другую кодировку для различения тихих и сигнальных NaN. Тем не менее, рекомендуется по стандарту:

Тихая битовая строка NaN должна быть закодирован с первым битом конечное значение и поле Т, равное 1. Сигнальная битовая строка NaN должна быть закодирован с первым битом конечное значение и поле равны 0.

  • В терминологии IEEE-754 бесконечности и NaN обычно не называются «нормальными числами».

  • Ваше условие для вызова номера "ненормальный" является правильным.

  • Для нормальных чисел было бы неплохо добавить неявный начальный бит, когда вы сообщаете о значении. Я лично, вероятно, напечатал бы их в шестнадцатеричной записи C99: 0x40000000 имеет значение и (после добавления неявного бита) 0x800000 и показатель степени 1, поэтому становится 0x1.000000p1.

  • Я уверен, что какой-то стареющий хакер PDP-11 доставит вам неприятности из-за того, что "big endian" и "little endian" не единственные две возможности.

Редактировать Хорошо, пример проверки qNaN на платформах, которые используют рекомендованную IEEE-754 кодировку:

if (exponent == 0xff && mantissa & 0x00400000) printf("\nqNaN");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...