【发布时间】:2025-12-30 03:40:06
【问题描述】:
这是我的代码:
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
有什么方法可以确保输出是一样的吗?
【问题讨论】:
-
问:为什么需要它们相同?请注意,
%f打印出double,%lf打印出long double。float在传递给可变长度参数列表时被提升为double,因此第一个参数是可以的。但是第二个参数会导致 UB,除了幸运的是double和long double在您的平台上长度相同。 -
@ybungalobill 我的应用程序在 Windows 中运行,有很多数据,可能是百万行,写入文件。而且我将在 Linux 中运行相同的逻辑并写入文件,以检查 windows 中的日志是否正确。当我使用 svn diff 这些输出“不同”时,我会发现真正的不同,所以我想确保输出是一样的。
-
一个 printf 在平局的情况下四舍五入,超过的四舍五入与最接近的偶数(又名庄家四舍五入)。
-
尝试使用 fesetround() 将 Linux 端的浮点舍入模式设置为 FE_TONEAREST 或 FE_UPWARD。
-
@ybungalobill:
%lf与printf一起使用时等效于%f。对于long double,您需要%Lf。
标签: c++ windows linux io floating-point