对于我正在实现的 C 应用程序,我需要能够读取一组配置值并将其写入文件。这些值是浮点数。将来,另一个应用程序(可以用 C++、Python、Perl 等编写)可能会使用相同的数据,因此这些配置值需要以定义良好的格式存储,该格式与编译器和机器无关.
字节顺序转换函数 ( ntoh/hton
) 可用于处理字节顺序,但是绕过“浮点”值的不同含义的最佳方法是什么?有存储浮点数的常用方法吗?舍入和截断不是问题,只要它被定义。
对于我正在实现的 C 应用程序,我需要能够读取一组配置值并将其写入文件。这些值是浮点数。将来,另一个应用程序(可以用 C++、Python、Perl 等编写)可能会使用相同的数据,因此这些配置值需要以定义良好的格式存储,该格式与编译器和机器无关.
字节顺序转换函数 ( ntoh/hton
) 可用于处理字节顺序,但是绕过“浮点”值的不同含义的最佳方法是什么?有存储浮点数的常用方法吗?舍入和截断不是问题,只要它被定义。
可能有两个主要选择:
6.66e42
.文本格式可能更便携,因为有些机器本身不理解 IEEE754。也就是说,这种机器在这个时代很少见。
C 格式的输入/输出函数对此有一个格式说明符,%a
. 它以十六进制浮点格式格式化浮点数,[-] 0x h。hhhh p± d。也就是说,如果需要,它有一个“-”符号,小数部分的十六进制数字,包括一个小数点,一个“p”(代表“幂”)开始指数和一个带符号的 2 指数(十进制)。
只要您的 C 实现使用二进制浮点(或任何浮点,使其FLT_RADIX
是 2 的幂),%a
格式的转换应该是准确的。
对于少量数据,例如配置值,使用文本而不是二进制。如果需要,可以选择某种形式的结构化文本,例如 JSON、XML。请根据您的要求决定要写入多少位来表示浮点数。
随着所需的可移植性范围(跨语言、操作系统、时间、空间等)的增加,支持文本的论点的力量变得更强。
IEEE 754或 ISO/IEC/IEEE 60559:2011 是大多数语言使用的浮点标准。
对于 C,它在 C11 中被正式采用。(C11 附录 F IEC 60559 浮点运算)