c - double 5.2在二进制文件中是如何表示的?

标签 c floating-point double ieee-754

例如给定的程序

FILE *f = fopen("test.txt","w");
double d = 5.2;
fwrite(&d, sizeof(typeof(d)), 1, f);
fclose(f);

当你使用xxd查看我得到的内容时

//binary
0000000: 11001101 11001100 11001100 11001100 11001100 11001100  ......
0000006: 00010100 01000000                                      .@
//hex
0000000: cdcc cccc cccc 1440                      .......@

但我找到了How to represent FLOAT number in memory in C它应该看起来像

0 10000001 01001100110011001100110

所以我不确定它在内存和文件中的二进制文件是否相同,或者我完全错了。我如何确定给定示例的浮点值?

最佳答案

您显示的位模式 0 10000001 01001100110011001100110 用于 IEEE-754 基本 32 位二进制浮点表示,通常用于 float。您请求 double 的表示,它通常使用 IEEE-754 基本 64 位二进制。

您显示的字节 cdcc cccc cccc 1440 表示大约 5.2,采用小端顺序。在高值字节中,位于 0x80 位置的第一位为零。它是符号位,零表示正。接下来的七位 0x40 和下一个字节的四个字节 0x141 是指数。它们一起是 0x401。指数偏移 0x3ff。因此,对于编码为 0x401 的指数,实际指数为 2,即 22

剩余的位编码有效数字的尾随位。它们是 0x4ccccccccccccd。对于普通数字,有效数字放在“小数点”(小数点的一般等价物)之后,小数点前加 1:1.4ccccccccccccd16。在十进制中,这大约是 1.3(正好是 1.3000000000000000444089209850062616169452667236328125)。

加起来的值为 + 22 • 1.3000000000000000444089209850062616169452667236328125 = 5.2000000000000001776356839400250464677810316594.

关于c - double 5.2在二进制文件中是如何表示的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54640677/

相关文章:

generics - 编写没有大量样板类型约束的通用浮点代码

java - Java 中的 strictfp

iphone - 在 Objective-C 中比较 float 的奇怪问题

javascript - 如何将 Int 数转换为 Double 数?

java - double 的十进制显示精度损失

C函数不显示任何内容

c - 读取带有分隔符的数据字符串并存储到结构中

c - a = 3和b = 2的表达式a =(a++)*(++ b)是否有正确或最可接受的答案?如果是这样,那是什么?

c - 为什么释放分配的数据后内存使用量没有减少?

java - 四舍五入到 4 位小数或更少