标准浮点格式
单精度浮点数值的分类
/* 打印浮点型数据的各个部分
* 共用体 + 位域
* 单精度浮点型
* 大端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;
}
非负浮点数的示例