夏午Sharve 2022-06-07 09:43 采纳率: 57.1%
浏览 88
已结题

关于浮点数和尾数规格化的问题,如何解决?

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

  • 写回答

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:
    //
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月25日
  • 已采纳回答 8月17日
  • 修改了问题 6月7日
  • 创建了问题 6月7日

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同