这是我的代码:
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
有没有办法确保输出是一样的?
你看到的行为只是Windows printf()
函数与Linux的printf()
函数不同的结果。 最有可能的区别在于printf()
如何实现数字舍入。
如何printf()
在任何系统的引擎盖下工作是一个实现细节; 因此系统不太可能对printf()
显示浮点值提供如此细致的控制。
有两种方法可以使它们保持一致:
计算过程中使用更多的精度,而不是显示时。 例如,一些科学计算器和图形计算器对所有内部计算都使用double
精度,但只显示float
精度的结果。
使用跨平台的printf()
库。 这样的库很可能在所有平台上具有相同的行为,因为确定显示哪些数字通常是平台不可知的。
但是,这确实不像你想象的那么大。 输出之间的差异是0.000001。 这是两个值之间的一个0.0000000004%的差异。 显示错误是非常可以忽略的。
考虑一下: 洛杉矶和纽约之间的距离是2464英里 ,与显示器输出的数量相同。 0.000001英里的差异是1.61 毫米 。 我们当然不能测量任何地方靠近这种精确度的城市之间的距离。 🙂
如果你使用相同的printf()实现,他们很可能会显示相同的输出。 根据你所要做的,在这两个操作系统上使用GNU GCC或者获得printf()源代码并将其添加到你的项目中可能会更容易(你应该没有麻烦)。
顺便说一句 – 你真的检查了什么十六进制数字编码? 它应该围绕或向下? 625事情本身可能是四舍五入的,所以你不应该假设它应该圆到63 ….
显而易见的答案是在您的输出中使用较少的精度。 一般来说,如果涉及到任何计算,您甚至不能确定实际浮点值是否相同。 以及printf
和ostream
是如何定义的,即使浮点值是相等的。
通常,C ++不保证两个实现产生相同的结果。 在这种情况下, 如果重要的话,可以在做转换之前手动进行四舍五入,但是由于实际的浮点值会有所不同,所以仍然会有偶然的问题。 事实上,这甚至可以在相同编译器的不同级别的优化下发生。 所以,你所尝试的任何东西(除了用汇编编写整个程序)最终肯定是一场失败的战斗。