4

这是我的代码:</p>

int a = 0x451998a0;
float b = *((float *)&a);
printf("coverto float: %f, %.10lf\n", b, b);

在 Windows 中,输出为:

coverto float: 2457.539063, 2457.5390625000

在linux中,输出为:

coverto float: 2457.539062, 2457.5390625000

有什么方法可以确保输出相同吗?

4

3 回答 3

7

您看到的行为只是 Windows 的printf()功能与 Linux 的printf()功能不同的结果。最有可能的区别在于如何printf()实现数字舍入。

在这两个系统的底层如何printf()工作是一个实现细节;printf()因此,系统不太可能对如何显示浮点值提供如此细粒度的控制。

有两种方法可以使它们保持不变:

  1. 在计算过程中使用比在显示过程中更高的精度。例如,一些科学和图形计算器double对所有内部计算都使用精度,但仅以float精度显示结果。

  2. 使用跨平台printf()库。这样的库很可能在所有平台上都具有相同的行为,因为确定要显示哪些数字所需的计算通常与平台无关。

然而,这真的没有你想象的那么大。输出之间的差异为 0.000001。这与这两个值的差异约为 0.0000000004%。显示错误确实可以忽略不计。

考虑一下:洛杉矶和纽约之间的距离是 2464 英里,这与显示输出中的数字具有相同的数量级。0.000001 英里的差是 1.61毫米。我们当然不会以接近那种精度的任何地方来测量城市之间的距离。:-)

于 2012-09-10T06:12:05.913 回答
0

显而易见的答案是在输出中使用较少的精度。一般来说,如果涉及任何计算,您甚至无法确定实际的浮点值是否相同。printf以及 如何ostream定义实现,即使浮点值相等。

通常,C++ 不保证两个实现产生相同的结果。在这种特殊情况下,如果它很重要,您可以在进行转换之前手动进行舍入,但您仍然会偶尔遇到问题,因为实际的浮点值会有所不同。事实上,即使使用相同的编译器进行不同级别的优化,这也可能发生。所以你尝试的任何事情(除了用汇编程序编写整个程序)最终都注定是一场失败的战斗。

于 2012-09-10T08:25:20.140 回答
0

如果您使用相同的 printf() 实现,它们很有可能会显示相同的输出。根据您的工作,在两种操作系统上使用 GNU GCC 可能会更容易,或者获取 printf() 源代码并将其添加到您的项目中(您应该可以轻松搜索一个)。

顺便说一句-您实际上检查过该十六进制数字的编码吗?它应该向上还是向下取整?625 本身很可能是四舍五入的,所以你不应该假设它应该四舍五入到 63....

于 2012-09-10T06:49:29.110 回答