2013-07-30 101 views
5

對於我正在實現的C應用程序,我需要能夠讀取和寫入一組配置值到文件。這些值是浮點數。將來有可能另一個應用程序(可以用C++,Python,Perl等編寫)將使用相同的數據,因此這些配置值需要以編譯器和機器獨立的良好定義的格式進行存儲。將浮點數存儲在文件中

字節順序轉換函數(ntoh/hton)可用於處理字節順序,但是解決「浮點」值的不同含義的最佳方法是什麼?是否有共同的方法來存儲浮游物?四捨五入和截斷不是一個問題,只要它被定義。

+2

與平臺無關的存儲浮點數(或任何值)的最佳方式是文本形式。以二進制形式存儲它將不起作用,並且使用字節數函數將不會起作用,因爲沒有爲浮點值的二進制表示定義字節數。 –

+2

@JoachimPileborg雖然二進制浮點表示可能沒有標準的定義字節順序,但很容易自己執行一個。所有你需要做的就是判定浮點值是以大端格式存儲的。 –

+0

您可以使用標準類型,如IEEE754雙打 – SheetJS

回答

5

可能有兩個主要選項:

  1. 存儲文本格式的。在這裏,您可以使用明確定義的小數點分隔符對特定格式進行標準化並使用科學記數法,即6.66e42
  2. 使用IEEE754標準以二進制格式存儲。使用4或8字節的數據類型。正如你所指出的那樣,你必須解決排序規則。

由於機器本身並不理解IEEE754,因此文本格式可能更具可移植性。也就是說,這些機器在這些時候很少見。

+0

爲什麼使用小數? –

+0

@Eric爲了便於攜帶和提高人的可讀性 –

+2

十進制並不能提供可移植性,因爲十進制數字和二進制浮點之間的正確轉換得不到應有的支持。大多數語言標準不需要正確的舍入轉換,各種實現不能保證它們。相反,即使您必須編寫自己的轉換例程,十六進制也很容易轉換。 –

0

IEEE 754或ISO/IEC/IEEE 60559:2011是大多數語言使用的浮點標準。

對於C,它在C11中由標準正式採用。 (C11附件F IEC 60559浮點運算

+0

附件F是可選的;如果它定義了'__STDC_IEC_559__',則實現只需要遵守它。 –

0

對於少量數據(例如配置值),請使用不是二進制的文本。如果你願意,可以使用某種形式的結構化文本,比如JSON,XML。根據您的要求確定要寫入多少位以表示浮點數。

隨着所需的可移植性(跨語言,操作系統,時間,空間等)的範圍增加,支持文本的爭論的力量變得更強。

4

C格式化的輸入/輸出函數有一個格式說明符,%a。它以十六進制浮點格式格式化浮點數, [ - ] 0x h hhhh d。也就是說,如果需要,它有一個「 - 」符號,小數部分的十六進制數字,包括小數點,「p」(用於「power」)以開始指數和兩個符號指數(十進制)。

只要您的C實現使用二進制浮點數(或者其FLT_RADIX是2的冪)的任何浮點數,則使用%a格式的轉換應該是精確的。

+0

這樣的文本如何被C以外的語言讀取? –

+1

@DavidHeffernan:十六進制浮點格式很容易轉換爲二進制浮點數和二進制浮點數。當轉換來自相同二進制格式的數字(因此,沒有需要四捨五入的額外數字)時,沒有舍入問題。 –

+0

但是在C以外的語言中可能不是微不足道的。例如,Perl中的代碼是什麼?有沒有一個內置函數來做到這一點?我懷疑對於很多語言你都需要推出自己的語言。這就是爲什麼人們可能會選擇十進制的便利性,以犧牲一些往返精度損失爲代價。 –