IEEE浮点数——打印浮点型数据的各个部分 共用体 + 位域

标准浮点格式

单精度浮点数值的分类

/* 打印浮点型数据的各个部分
 * 共用体 + 位域
 * 单精度浮点型
 * 大端31  s符号   exp阶码     frac尾数  小端0
 * 位数    1       8          23
 * 
 * 双精度浮点型
 * 大端63  s符号   exp阶码     frac尾数  小端0
 * 位数    1       11         52
 */
#include <iostream>

struct FloatInfo {
    // 小端存储 frac位于低23位
    unsigned int frac : 23;
    unsigned short exp : 8;
    bool s : 1;
};
union FloatU{
    unsigned int i;
    float f;
    FloatInfo info;
    void printinfo() {
        // std::cout << "int:\t0x" << std::hex << i << std::endl;
        // std::cout << "float:\t" << f << std::endl;
        std::cout << "s\texp\tfrac\n" << std::hex 
        << info.s << "\t0x" << info.exp << "\t0x" << info.frac << std::endl;
    }
    void printinfo(const char *s) {
        std::cout << "*********** " << s << " ***********" << std::endl;
        printinfo();
    }
} F;


int main() {
    F.f = 3510593.0f;   //     csapp 练习题2.6示例 0x4a564504   3510593.0f
                        // 大端  4    a    5    6    4    5    0    4  小端
                        //     0100 1010 0101 0110 0100 0101 0000 0100
                        //     0/ 1001 0100/ 101 0110 0100 0101 0000 0100
                        //   s 0  exp 0x94   frac 0x564504 右侧对其 左侧补0
    F.printinfo();

    //                          exp         frac
    // 0                        0           0
    F.info.exp = 0x00;
    F.info.frac = 0x00;
    F.printinfo("0");

    // 最小非规格化数             0            0x00 00 00 01
    F.info.exp = 0x00;
    F.info.frac = 0x01;
    F.printinfo("最小非规格化数");

    // 最大非规格化数             0            0x1FFFFF
    F.info.exp = 0x00;
    F.info.frac = 0x1FFFFF;
    F.printinfo("最大非规格化数");

    // 最小规格化数               1            0
    F.info.exp = 0x01;
    F.info.frac = 0x00;
    F.printinfo("最小规格化数");

    // 1                        127          0
    F.info.exp = 0x7F;
    F.info.frac = 0x00;
    F.printinfo("1");

    // 最大规格化数               0xFE          0x1FFFFF
    F.info.exp = 0xFE;
    F.info.frac = 0x1FFFFF;
    F.printinfo("最大规格化数");

    // INF 无穷                 0xFF          0
    F.info.exp = 0xFF;
    F.info.frac = 0x00;
    F.printinfo("INF");

    // NaN                      0xFF          非0
    F.info.exp = 0xFF;
    F.info.frac = 0xFF;
    F.printinfo("NaN");

    return 0;
}

非负浮点数的示例

posted @ 2023-01-06 19:30  zkx98  阅读(74)  评论(0编辑  收藏  举报