3

我想使用mmap. 为了确保我的解决方案是可移植的,我想使用具有指定宽度(uint32_t和朋友)的类型来保存我的数据。

但是,我还必须保存一些double值。从<cstdint>标题来看,似乎没有定义浮点类型。也double似乎没有固定的宽度和表示。

如何以可移植的方式从我的二进制文件中保存(和加载)浮点值?我需要将它们转换为整数类型来保存它们吗?

4

2 回答 2

3

这取决于您想要(或需要)实现的目标。

简而言之,您有两种解决方案:

  • 存储为十进制,这意味着转换,但可以根据需要读取
  • 存储为二进制,这意味着已知的位宽和字节顺序

还有一个混合解决方案:文本二进制表示,0xd775u7f1...,用于每个数字。主要优点是您没有字节顺序问题,但另一方面您仍然受到位宽问题的困扰(尽管可以从表示中推断出来)。

我建议您简单地创建一个格式并记录它。一个简单的格式是:

  • 二进制
  • 64 位
  • 小端序

(这是在 x86 上运行的 64 位程序使用的)

这是可移植的,因为它是指定的,尽管在某些平台上它可能更快。

于 2013-08-22T08:01:00.257 回答
3

我正在扩展 Matthieu M. 在他的回答中提到的“混合解决方案” 。

我将使用 ISO C99 标准中的%aand%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.

于 2013-08-22T09:12:20.240 回答