浮点数补码的规格化为 S.M 形式,其中 S 为数符(取值为0或1);M为小数的绝对值,第一位为小数最高有效位。那么这种表达形式小数的绝对值范围为[0.5,1)。
而IEE.E754的尾数规格化为 1.M形式,其中 1 为小数最高有效位(隐含),M为第2位及以后的小数位。那么这种表达形式小数的范围为[1,2)。
这么看来,这两个规格化是不同标准的规格化?也就是当求浮点数的规格化表示时,需要遵循第一种方式;求尾数的规格化表示时,需要遵循第二种方式?

关于浮点数和尾数规格化的问题,如何解决?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 赵4老师 2022-06-07 10:29关注
仅供参考:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { float f; double d; char bs[65]; char b[65]; char s[80]; unsigned char *p; char e[12]; char *t; int ex; int flag; flag=0; while (1) { printf("Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:");fflush(stdout); rewind(stdin); fgets(s,80,stdin); if ('\n'==s[0]) return 1; if (1==sscanf(s,"0x%16I64X",(__int64 *)&d) && strlen(s)>11) {flag=2;break;} if (1==sscanf(s,"0x%8X" ,( int *)&f)) {flag=1;break;} if (1==sscanf(s,"%f" , &f) && 1==sscanf(s,"%lf" , &d)) {flag=3;break;} } if (flag&1) { printf("f=%g\n",f); p=(unsigned char *)&f; printf("hex=%02X %02X %02X %02X\n",p[3],p[2],p[1],p[0]); ltoa(*(long *)&f,b,2); sprintf(bs,"%032s",b); printf("bin=%s\n",bs); printf("bin=%.1s %.8s %s\n",bs,bs+1,bs+9); strncpy(e,bs+1,8);e[8]=0; ex=strtol(e,&t,2); printf(" %c %-4d-127 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+9); ex-=127; printf(" %c %-8d 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+9); } if (flag&2) { printf("\nd=%lg\n",d); p=(unsigned char *)&d; printf("hex=%02X %02X %02X %02X %02X %02X %02X %02X\n",p[7],p[6],p[5],p[4],p[3],p[2],p[1],p[0]); _i64toa(*(__int64 *)&d,b,2); sprintf(bs,"%064s",b); printf("bin=%s\n",bs); printf("bin=%.1s %.11s %s\n",bs,bs+1,bs+12); strncpy(e,bs+1,11);e[11]=0; ex=strtol(e,&t,2); printf(" %c %-6d-1023 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+12); ex-=1023; printf(" %c %-11d 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+12); } return 0; } //Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:0x3FC0000000000000 // //d=0.125 //hex=3F C0 00 00 00 00 00 00 //bin=0011111111000000000000000000000000000000000000000000000000000000 //bin=0 01111111100 0000000000000000000000000000000000000000000000000000 // + 1020 -1023 1.0000000000000000000000000000000000000000000000000000 // + -3 1.0000000000000000000000000000000000000000000000000000 // //Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:0x3E000000 // //f=0.125 //hex=3E 00 00 00 //bin=00111110000000000000000000000000 //bin=0 01111100 00000000000000000000000 // + 124 -127 1.00000000000000000000000 // + -3 1.00000000000000000000000 // //Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:0.125 //f=0.125 //hex=3E 00 00 00 //bin=00111110000000000000000000000000 //bin=0 01111100 00000000000000000000000 // + 124 -127 1.00000000000000000000000 // + -3 1.00000000000000000000000 // //d=0.125 //hex=3F C0 00 00 00 00 00 00 //bin=0011111111000000000000000000000000000000000000000000000000000000 //bin=0 01111111100 0000000000000000000000000000000000000000000000000000 // + 1020 -1023 1.0000000000000000000000000000000000000000000000000000 // + -3 1.0000000000000000000000000000000000000000000000000000 // //Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX: //
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用