2012-09-07 33 views
3

使用vsprintf將內容寫入文件。奇怪! linux&windows vsprintf float num到文件

輸出格式是:

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

Linux操作系統:

gcc 4.4.5: -O2 -ffloat-store 

在linux.in文件是這樣的:

TT2:30759。 ,TT2:46f04e84

窗口:

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

在Windows中。在文件中是這樣的:

tt2:30759。 ,tt2:46f04e84

這是爲什麼不同?

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

我發現我的情況的原因。

在windows中,我使用ofstream輸出到文件。它是一個C++庫。

在linux中,我只是使用寫入輸出到文件。這是c lib。

當我在linux中使用ofstream時,輸出是一樣的。

畢竟,感謝大家〜

+0

'tt2'從哪裏來? –

+1

由不同編譯器進行的舍入不同? –

+1

@JoachimPileborg:很可能它是C庫,而不是編譯器。 – MSalters

回答

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和朋友的實現可以選擇顯示任何兩個小數浮點數字。

+0

非常感謝您的回答!當浮點數在內存中相同時,是否有任何方法可以使輸出保持相同的使用「%f」? – hdbean

+1

將浮點數轉換爲十進制時,只有一個「正確」轉換,具體取決於所使用的舍入約定(這些約定是實現定義的)。(當然會有無限數量的十進制值轉換爲相同的浮點數。) –

+0

這是否意味着vs2005和gcc中的舍入約定是不同的,在我的情況下? – hdbean