奇怪! linux& windows vsprintf float num to file

时间:2012-09-07 07:54:02

标签: c++ windows linux floating-point printf

使用vsprintf将内容写入文件。

输出格式为:

"tt2:%f, tt2:%x", tt2, *((int *)&tt2)

的Linux:

gcc 4.4.5: -O2 -ffloat-store

在linux.in文件中是这样的:

  

tt2:30759。 257812 ,tt2:46f04e84

窗口:

vs2005 sp1: /O2 Precise (/fp:precise)

在Windows中。在文件中是这样的:

  

tt2:30759。 257813 ,tt2:46f04e84

为什么会有所不同?

==================================

我找到了我的理由。

在windows中,我使用ofstream输出到文件。它是c ++ lib。

在linux中,我只是使用write来输出到文件。这是c lib。

当我在linux中使用ofstream时,输出是相同的。

毕竟,谢谢大家〜

1 个答案:

答案 0 :(得分:1)

浮点数以二进制形式存储在计算机中。将它们打印到十进制浮点时,它们有多个正确的表示形式。在您的情况下,它们都是正确的,因为它们都转换回原始的二进制浮点值。看看这个文件的输出,我使用GCC编译:

#include <stdint.h>
#include <stdio.h>

int main()
{
    float a = 30759.257812f;
    float b = 30759.257813f;

    printf("%x\n%x\n", *(uint32_t *)&a, *(uint32_t *)&b);
}

输出:

46f04e84
46f04e84

因此,printf和朋友的实现可以选择显示两个十进制浮点数中的任何一个。