Кто-то может просмотреть мою программу и сказать мне, если я делаю ее правильно?
Я принимаю ввод данных пользователем в форме 8 шестнадцатеричных цифр. Я хочу интерпретировать те 8 цифр как IEEE 754 32-разрядное число с плавающей точкой и распечатаю информацию о том числе.
вот мой вывод:
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;
}
Я не думаю, что нормализованный de является правильным?
Вообще, вы довольно близки. Некоторые комментарии:
0x7FFFFFFF
- тихий нан, а не сигнализация NAN. Знак не определяет, тихо ли или нет; Скорее это ведущий бит по значимости (предпочтительный срок для того, что вы называете «Mantissa»). 0xFFBFFFFF
- это сигнализация NAN, например. Редактировать: Interjay правильно указывает на то, что это кодирование на самом деле не требуется IEEE-754; Платформа бесплатна для использования различного кодирования для дифференциации тихих и сигнальных навин. Тем не менее, это рекомендуется по стандарту:
тихая нана-битовая строка должна быть закодирован с первым битом Трейлинг значимость и поле T - 1. Сигнализация Nan Bit String должна быть закодирован с первым битом Трейлинг по значимости, находящимся в поле 0 0.
Зажимание и назы, обычно не называются «нормальными числами» в терминологии IEEE-754.
Ваше условие для вызова ряда «денормал» правильно.
Для нормальных чисел было бы неплохо добавить неявный ведущий бит при сообщении по значимости. Лично я, вероятно, распечатал бы их в шестигранности C99: 0x40000000
имеет показатель (как только вы добавляете неявный бит) из 0x800000
и показатель 1
Так что становится 0x1.000000p1
.
Я уверен, что некоторые старения Hacker PDP-11 даст вам трудное время о «большом эндеане» и «маленьком эндеане», не являющихся единственными двумя возможностями.
Редактировать ОК, пример проверки на платформы, которые используют рекомендованное кодирование IEEE-754:
if (exponent == 0xff && mantissa & 0x00400000) printf("\nqNaN");