【发布时间】:2012-11-14 07:08:00
【问题描述】:
如果我在 windows 和 linux(ubuntu) 上编译以下 c 行,我会得到不同的结果。我想避免。我该怎么做?
double a = DBL_EPSILON;
double b = sqrt(a);
printf("eps = %.20e\tsqrt(eps) = %.20e\n", a, b);
linux 输出:
eps = 2.22044604925031308085e-16 sqrt(eps) = 1.49011611938476562500e-08
窗口输出:
eps = 2.22044604925031310000e-016 sqrt(eps) = 1.49011611938476560000e-008
在 linux 上使用 gcc 和 clang 在 32 位和 64 位系统上测试的结果相同。 在 Windows 上使用 gcc-mingw 在 32 位和 visual-studio 上使用 32 位和 64 位进行测试,结果也相同。
【问题讨论】:
-
各个系统的底层架构是什么?
-
使用的 c 库的
printf实现不同。 Windows 仅打印 17 位左右的有效数字,如果需要更多,则用零填充。 glibc 打印正确舍入的值。 -
但对我来说,这似乎不仅仅是打印问题,我的数值算法也返回略有不同的结果。我指出了这条线,因为我认为它们是差异的根源。#
-
double变量通常具有 about 16 significant decimal digits 的精度。打印或比较过去的数字是没有意义的。 -
@Blastfurnace:打印超过 16 位的数字并非毫无意义。它可能需要 54 个十进制数字来表示 64 位 IEEE 754 二进制浮点数的确切值,并且可能想要出于各种原因查看确切值,例如将值传输到能够处理更高精度或进行调试的数学软件。
标签: c floating-point platform-independent