2013-07-30 161 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中的代码是什么?有没有一个内置函数来做到这一点?我怀疑对于很多语言你都需要推出自己的语言。这就是为什么人们可能会选择十进制的便利性,以牺牲一些往返精度损失为代价。 –