我想使用mmap
. 为了确保我的解决方案是可移植的,我想使用具有指定宽度(uint32_t
和朋友)的类型来保存我的数据。
但是,我还必须保存一些double
值。从<cstdint>
标题来看,似乎没有定义浮点类型。也double
似乎没有固定的宽度和表示。
如何以可移植的方式从我的二进制文件中保存(和加载)浮点值?我需要将它们转换为整数类型来保存它们吗?
我想使用mmap
. 为了确保我的解决方案是可移植的,我想使用具有指定宽度(uint32_t
和朋友)的类型来保存我的数据。
但是,我还必须保存一些double
值。从<cstdint>
标题来看,似乎没有定义浮点类型。也double
似乎没有固定的宽度和表示。
如何以可移植的方式从我的二进制文件中保存(和加载)浮点值?我需要将它们转换为整数类型来保存它们吗?
这取决于您想要(或需要)实现的目标。
简而言之,您有两种解决方案:
还有一个混合解决方案:文本二进制表示,0xd775u7f1...
,用于每个数字。主要优点是您没有字节顺序问题,但另一方面您仍然受到位宽问题的困扰(尽管可以从表示中推断出来)。
我建议您简单地创建一个格式并记录它。一个简单的格式是:
(这是在 x86 上运行的 64 位程序使用的)
这是可移植的,因为它是指定的,尽管在某些平台上它可能更快。
我正在扩展 Matthieu M. 在他的回答中提到的“混合解决方案” 。
我将使用 ISO C99 标准中的%a
and%la
格式说明符将数字转换为十六进制字符串并返回。据我所知,不幸的是,我们在 C++11 中没有类似的工具。
#include <stdio.h>
int main() {
double x = 0.1;
char* str = "0X1.999999999999AP-4";
printf("0.1 in hexadecimal is: %A\n", x);
printf("Now reading %s\n", str);
/* in a production code I would check for errors */
sscanf(str, "%lA", &x); /* note: %lA is used! */
printf("It equals %g\n", x);
}
标准,可移植,字节顺序没有问题,不损失精度,但需要更多的存储空间。
更新:虽然编译器支持仍在迎头赶上,但有一个 C++11 解决方案,请参阅std::hexfloat
.