为什么区块链在架构层面排除浮点数

发布日期:2026-04-20 09:22:20   浏览量 :4
发布日期:2026-04-20 09:22:20  
4

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 的输出不兼容。

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部