我想使用mmap
将数据存储到二进制文件中。为了确保我的解决方案是可移植的,我想使用指定宽度(uint32_t
和朋友)的类型来保存我的数据。
但是,我还必须保存一些double
值。通过查看<cstdint>
标题,似乎没有定义浮点类型。此外double
似乎没有固定的宽度和表示。
如何以便携方式保存(并加载)二进制文件中的浮点值?我是否需要将它们转换为整数类型以保存它们?
答案 0 :(得分:3)
这取决于你想要(或需要)实现的目标。
简而言之,您有两个解决方案:
还有一个混合解决方案:每个数字的文本二进制表示0xd775u7f1...
。主要的优点是你没有字节顺序问题,但另一方面你仍然遇到位宽问题(尽管可以从表示中推断出来)。
我建议你简单地创建一个格式并记录它。一种简单的格式是:
(这是在x86上运行的64位程序)
这是可移植的,因为指定了它,但在某些平台上可能更快。
答案 1 :(得分:3)
我正在扩展Matthieu M.在his answer中提到的“混合解决方案”。
我会使用ISO C99标准中的%a
和%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);
}
标准,便携,没有字节顺序的麻烦,没有精度损失,但需要更多的存储空间。
UPDATE:虽然编译器支持仍在追赶,但有一个C ++ 11解决方案,请参阅std::hexfloat
。