IEEE 754表示

时间:2010-01-30 19:49:51

标签: c floating-point

有人可以查看我的程序并告诉我我是否正确地执行了该操作吗?

我接受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 normalized是对的?

1 个答案:

答案 0 :(得分:5)

一般来说,你非常接近。一些评论:

  • 0x7fffffff是一个安静的NaN,而不是信号NaN。标识不能确定NaN是否安静;相反,它是有效数字(你称之为“尾数”)字段的首要术语。例如,0xffbfffff是信令NaN。

编辑: interjay正确地指出IEEE-754实际上并不是必需;平台可以自由地使用不同的编码来区分安静和信令NaN。但是,它是推荐的标准:

  

应该是一个安静的NaN位字符串   用第一位编码   尾随有效数字段T为1。   信令NaN位串应该是   用第一位编码   尾随有效数字段为0。

  • 在IEEE-754术语中,无穷大和NaN通常不称为“正常数字”。

  • 您拨打“非正常”号码的条件是正确的。

  • 对于正常数字,在报告有效数据时添加隐式前导位会很不错。我个人可能会用C99十六进制表示法打印出来:0x40000000有一个有效数字(一旦你添加隐含位)0x800000和指数1,所以变为{{1 }}

  • 我相信一些老化的PDP-11黑客会给你一个关于“大端”和“小端”不是唯一两种可能性的困难时期。

编辑确定,在使用IEEE-754推荐编码的平台上检查qNaN的示例:

0x1.000000p1