【问题标题】:Saving and Reading doubles without precision loss [duplicate]保存和读取加倍而没有精度损失[重复]
【发布时间】:2018-12-04 00:58:09
【问题描述】:

我想将一个 double 序列保存到一个 .txt 文件中,稍后在 C 中读取它们。我怎样才能在不损失精度的情况下实现这一点?我不知道我需要保存多少位数?如果没有保存足够的数字,我怀疑我可能无法获得我保存的确切双倍。

以下是我尝试过的

doubles=[3.14159, 3.14159265358]
filename="tmp.txt"
with open(filename,'w') as f:
    for x  in doubles:
        f.write("%.16f\n" %x)

我的数据有两个(我猜)不精确的表示,doubles。 3.1415899999999999 3.1415926535800001

这是不可取的。我希望数据按原样存储,以便另一个程序可以准确地检索它们。有什么想法吗?

【问题讨论】:

  • (Python) 浮点数有一些限制:docs.python.org/3/tutorial/floatingpoint.html
  • 您可以将它们保存为二进制文件,但是,它们不一定可以传输到具有其他架构的其他机器上。
  • @JoseFelipe - 分数只适用于存储有理数。非理性的人呢?例如。您建议存储PI 的分数是多少?
  • @ryyker 回复:What about irrationals?:所有有限的double 都是有理数,因此无理数不适用于“保存和读取双精度而不损失精度”。即使是常见的M_PI,也就是 π 的近似值,也是有理数

标签: python c floating-point


【解决方案1】:

从 C11 开始,使用 DBL_DECIMAL_DIG,它完全为此用途定义:参见 https://en.cppreference.com/w/c/types/limits。它告诉您所需精度的小数位数,以便加载保存的double,然后保存然后重新加载将意味着两个加载步骤将总是返回相同的@987654324 @。

DBL_DECIMAL_DIG 通常是 17。

【讨论】:

  • DBL_DIG 不足。使用DBL_DECIMAL_DIG
  • @chux:也可以删除旧的DBL_DIG,除非这违反了 C 标签礼仪:在 C++ 中,现在我们似乎已经达成共识,接受 C++11 是默认标准。跨度>
  • DBL_DIG 仍然有用。这是 text-double-text 对于所有double 可以正确往返的最多位数。这 2 个宏适用于不同的情况。
  • DBL_DECIMAL_DIG 不可用时,代码可以使用DBL_DIG + 3 来导出double-text-double 所需的数字,如OP 的情况。它可能比DBL_DECIMAL_DIG 多一点点,但永远不会太小。
猜你喜欢
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 2016-09-26
  • 1970-01-01
  • 2020-06-17
相关资源
最近更新 更多