2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家
我在三台机器上运行了同一个 C 语言程序。代码相同,输入相同,却得到了三个不同的结果。以下是确切的原因
实验过程
#include <stdio.h>
int main() {
long double x = 0.1L + 0.2L;
printf("%.20Lf\n", x);
unsigned char *p = (unsigned char *)&x;
for (int i = 0; i < sizeof(x); i++)
printf("%02x ", p[i]);
printf("\n");
return 0;
}
三台机器。均运行逻辑上二进制等效的代码:
| 机器 | 操作系统 | 架构 |
|---|---|---|
| A | Linux | AMD x86_64 |
| B | Linux | 树莓派 ARMv8 |
| C | macOS | 苹果硅 M4 (ARM64) |
结果
机器 A:AMD x86_64 Linux (GCC)
0.30000000000000001665
9f 93 54 5d e9 52 49 81 ff 3f 00 00 00 00 00 00
在此机器上,sizeof(long double) = 16 字节。但只有前 10 个字节存储实际数据:其余 6 个字节是为对齐而添加的填充位。有效的精度存在于一种称为 x87 扩展精度 的 80 位格式中。
机器 B:树莓派 ARM Linux (GCC)
0.30000000000000004441
34 33 33 33 33 33 33 33 33 33 33 33 33 33 fd 3f
此处 sizeof(long double) 同样等于 16 字节,但字节布局完全不同。在 ARM Linux 上,GCC 将 long double 实现为软件模拟的 128 位四倍精度(IEEE-754 binary128)。尽管两者名义上都是“16 字节”,但其字节与机器 A 的输出不兼容。
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。