【发布时间】:2011-06-06 07:56:17
【问题描述】:
我需要使用现有的文本文件来存储一些非常精确的值。回读时,这些数字基本上需要与最初写入的数字完全相同。现在,普通人会使用二进制文件……出于多种原因,在这种情况下这是不可能的。
所以...你们中的任何人有没有一种将双精度编码为字符串的好方法(除了提高精度)。我的第一个想法是将双精度转换为 char[] 并写出字符。我不认为这会起作用,因为有些字符是不可见的,会发出声音,甚至终止字符串('\0'...我在跟你说话!)
想法?
[编辑] - 一旦我确定哪个解决方案最适合我,我会将其中一个标记为“最佳”解决方案。
【问题讨论】:
-
如果你想便携,你可以假设浮点数的表示形式(在表示的标准中没有定义)。因此,ONLY 的便携方式就是尽可能精确地打印数字。现在,如果您想放弃可移植性,那么您可以使用二进制格式(如果您愿意,可以使用 Base64 编码)。但是,在转换为特定于平台的浮点格式时,您将失去精度(除非它与源系统完全相同)。但是,您对全精度打印一无所获。
-
要考虑的一点是,您的编译器可能会为 CPU 寄存器分配精度超过 64 位的双精度。当这些值被写入内存以准备将它们写入磁盘时,它们将被截断为 64 位。因此,即使您将双精度值保存为二进制并读入,也不能保证读取的值 == 原始值。
-
无论您使用何种编码格式,在加载到可用精度较低的系统时,您都会失去精度。你关心它是否是人类可读的吗?您是否关心保存/加载是否快速?你在乎需要存储多少字节吗?请注意,在许多高精度系统上,您可以使用
long double获得比double更高的精度 -
@fuzzyTew:现在很少有专业格式是二进制的,这是有原因的。当我们没有空间时,我们尝试过,但从长远来看它不会得到回报。人类可读的形式更容易使用和维护,而且人类可读的形式不会丢失任何精度。压缩是当今世界选择格式的一个非常糟糕的理由(没有一些非常具体的理由)。
-
我不会使用
long double。整个 x87 指令集在较新的处理器上被视为已弃用。例如,64bWin7 似乎不允许在内核中使用 x87,而英特尔、AMD 和微软强烈反对使用它。他们都建议改用 SSE2 数学。所以 10byte double 似乎已经过时了。
标签: c++ string file-io character-encoding file-format