gpt4 book ai didi

python - 在不损失精度的情况下将 double 从 C++ 转移到 python

转载 作者:行者123 更新时间:2023-12-02 09:53:49 25 4
gpt4 key购买 nike

我有一些输出双值数组的 C++ 代码。我想在 python 中使用这些 double 值。传输值的最明显和最简单的方法当然是将它们转储到文件中,然后在 python 中重新读取文件。但是,这会导致精度损失,因为并非所有小数位都可以转移。另一方面,如果我添加更多小数位,文件会变大。我尝试传输的数组有几百万个条目。因此,我的想法是使用 double 的二进制表示,将它们转储到二进制文件中并在 python 中重新读取。

第一个问题是,我不知道 double 值如何在内存中格式化,例如 here .从内存中读取对象的二进制表示很容易,但我必须知道符号位、指数和 mantiassa 的位置。当然有standards为了这。因此,第一个问题是,我如何知道我的编译器使用哪个标准?我想使用 g++-9 .我尝试为各种编译器搜索这个问题,但没有任何准确的答案。下一个问题是关于如何在给定格式的情况下将字节转换回 double 。

另一种可能性是将 C++ 代码编译为 python 模块并直接使用它,仅从内存中传输数组而不传输文件。但我不知道这是否容易快速设置。
我还看到可以使用 numpy 从 python 中的字符串直接编译 C++ 代码,但我找不到任何文档。

最佳答案

您可以以二进制形式写出 double 值,然后使用 struct.unpack("d", file.read(8)) 在 python 中读取和转换它们。 , 从而假设使用 IEEE 754。

但是,有几个问题:

  • C++ 没有指定 double 的位表示。虽然它在我遇到的任何平台上都是 IEEE 754,但这不应该被认为是理所当然的。
  • Python 假定大端字节序。所以在小端机器上你必须告诉 struct.unpack在写入之前阅读或更改字节序时。

  • 如果此代码针对特定机器,我建议仅在机器上测试该方法。
    然后不应假定此代码适用于其他体系结构,因此建议您在 Makefile/CMakefile 中进行检查,以拒绝在意外目标上构建。

    另一种方法是使用常见的序列化格式,例如 protobuf。他们基本上必须处理同样的问题,但我认为他们已经解决了。

    关于python - 在不损失精度的情况下将 double 从 C++ 转移到 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62062400/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com