博主的另一篇文章讲解浮点数的相关知识https://blog.csdn.net/ouyangxiaozi/article/details/161105232?sharetypeblogdetailsharerId161105232sharereferPCsharesourceouyangxiaozispm1011.2480.3001.8118本文再讲解浮点数再计算机中存储的详细过程比如double类型的9.721的整个转换和存储过程。先按主流平台讲在绝大多数 PC 和服务器上C 里的double使用 IEEE 754 双精度格式也就是 binary64。9.721字面量默认就是double编译器会把它转换成“最接近 9.721 的那个 binary64 值”。1.double的 64 位结构double一共 64 位分成 3 段1 位符号位sign11 位指数位exponent52 位尾数字段fraction正规数的值按这个公式解释这里的1023是指数偏移量。2.9.721先变成二进制是什么样十进制整数部分很简单91010012910​10012​小数部分0.721要靠“乘 2 取整”反复展开它不是一个有限二进制小数所以会变成无限展开。前几步例如0.721 × 2 1.442取10.442 × 2 0.884取00.884 × 2 1.768取10.768 × 2 1.536取10.536 × 2 1.072取1所以它的二进制大致是因为是无限展开double不可能把它完整存下只能截断并舍入到 52 位尾数。3. 规格化9.721落在区间 [8,16)[8,16)所以规格化后指数是3这就是写进double前的“规格化形式”。4. 三段字段分别是什么对9.721这个double三段内容是符号位0因为它是正数。指数位真实指数是3存储时要加偏移量10233102310261026的二进制是尾数字段去掉规格化里隐含的前导1后存这 52 位0011011100010010011011101001011110001101010011111110所以完整位模式就是0 | 10000000010 | 00110111000100100110111010010111100011010100111111105. 最终 64 位十六进制表示把上面的 64 位合起来得到40237126E978D4FE也就是0x40237126E978D4FE这是最常见、最方便看的表示法。如果你的机器是常见的 x86/x64 小端序那么内存里按地址从低到高看到的 8 个字节通常是FE D4 78 E9 26 71 23 40注意IEEE 754 规定的是位意义小端/大端影响的是字节在内存里的摆放顺序6. 它实际存的值并不等于数学上的 9.721真正被存进去的精确值是它对应的十进制是9.721000000000000085265128291212022304534912109375所以它比真正的9.721稍微大一点误差大约是这就是为什么浮点数经常会出现“看起来一样底层并不完全相等”的现象。7. 你可以自己验证下面这段代码可以把9.721的位模式打印出来#include cstdint #include cstring #include iomanip #include iostream int main() { double x 9.721; std::uint64_t bits 0; std::memcpy(bits, x, sizeof(x)); std::cout hex bits 0x std::hex std::uppercase bits \n; std::cout std::dec std::setprecision(30) stored value x \n; }在主流 IEEE 754 平台上通常会看到接近这样的输出hex bits 0x40237126E978D4FE stored value 9.72100000000000008526512829121一句话总结double 9.721在计算机里不是直接存“9.721 这几个十进制字符”而是先转成二进制科学计数法再按 IEEE 754 的符号位 指数位 尾数位存成 64 位。对这个数来说最终常见的 binary64 编码是0x40237126E978D4FE而它真正存储的十进制值其实是9.721000000000000085265128291212...