2011-07-16 35 views
2

如果我存儲在一個文件中的浮動通過這個代碼在文件便攜存儲一個32位浮點涉及

fwrite((void*)(&v), sizeof(v), 1, f); // v is a float. 

多久會程序閱讀這個代碼的文件會導致運行時錯誤,因爲浮動8字節而不是4?

float v; 
fread((void*)(&v), sizeof(v), 1, f); 
return v; 

我可以總是讀取4個字節並將其轉換爲8字節的浮點數嗎?那會更便攜嗎?

強調在不同的Windows平臺64位和32位。

+0

請參閱http://stackoverflow.com/questions/2524737/fixed-size-floating-point-types。 –

回答

6

我會少擔心的大小的浮動,更擔心它的字節順序。我會說絕大多數C++實現使用IEEE 754,這意味着float總是32位和64位。

您可能希望序列化值的文本表示,或者特別注意確保字節順序正確。

+0

我只針對Windows。我假設窗戶總是小端。除了他們的手機軟件。 – user826228

+0

我的+1,這是正確的答案。您可以將IEEE浮點存儲爲標準,但您的應用程序仍然需要處理** Byte-Order **。 –

1

大小float可能會改變,但double不會。你確定當時使用double不是更好的主意嗎? A double始終是8個字節。

+1

你能提供一個浮點數不是4字節的例子嗎?好奇自己 – gordy

+0

我正在使用浮動來將偏移量存儲在大於int限制(大約4GB)的文件中。我選擇浮動,因爲我的文件不會變得足夠大,需要雙偏移。如果他們更可靠,我不介意使用雙打。 – user826228

+1

@ user826228,浮點數不能存儲與實際具有較低精度的數字完全相同的數字,而只能存儲32位int。它具有更廣泛的範圍,因爲它使用指數。如果你需要更大的值,那麼4G然後使用8字節的int,通常稱爲long long或__int64。 – Eelke

0

漂移泛指IEEE單精度浮點數,無論平臺是32位還是64位。

0

在Windows平臺上,sizeof(float)始終是4個字節,不管它是32位還是64位進程/操作系統。不知道標準,但在大多數平臺上,浮點大小爲4個字節。

2

如果您合理地可以,將數據存儲爲文本而不是原始二進制文件總是更好。這避免了上述問題,並無數的其它問題,例如:

  • 端序
  • 元件尺寸浮法等
  • 填充和/對齊
  • 向前不同的程序之間和/向後兼容性
  • 不同格式版本

如果需要,它還可以讓其他程序使用數據。

當然,下面的問題是文本需要更多的存儲空間,所以如果你有很多數據,那麼文本可能不是一個選項。

+1

作爲文本存儲float的缺點是它是雙向有損轉換。在某些應用中,這是不可接受的。 (當然,如果你只是在談論存儲這些位的十六進制表示,你指出的所有問題都回來了。) –

+0

好點 - 通常你只想存儲適當數量的重要(十進制)數字,但如果你需要位級別的一致性,那麼你的使用十六進制表示的建議可能是要走的路(儘管它失去了一點可移植性)。 –

+0

我看不到純二進制代碼的好處。您仍然需要處理原始列表中的所有內容。把它放入十六進制不會改變任何東西。由於OP正在處理Windows機器,所以我認爲依靠兩端支持的IEE-754是合理的。 –

相關問題