【问题标题】:Retrieve the string “0.1” from after assignment to a double variable从赋值给双变量后检索字符串“0.1”
【发布时间】:2014-06-10 03:46:46
【问题描述】:

我有一个关于高精度数字转换的幼稚问题(此处为 C++)。

假设用户用这个语句给双变量x_d赋值0.1,

x_d = 0.1

由于不可避免的机器舍入,因此得到的x_d 不再完全是0.1

我想知道我们是否还有办法从双变量x_d 中取回原始的高精度字符串“0.1”?显然,在这里使用std::to_string (x_d) 是没有用的。即使是像boost::multiprecision 或 MPFR 这样的高精度库似乎也束手无策。例如,std::to_string(boost:cpp_dec_float_10000(x_d) ) 无法恢复丢失的精度。

所以我的问题是,我们能否从使用语句 x_d = 0.1 分配的双精度 x_d 中取回字符串“0.1”?

【问题讨论】:

  • “我想知道我们是否还有办法取回原始的高精度字符串“0.1””。 0.1 有一个(计数)有效数字。它有什么精确的地方? 0.10000000000000 将非常精确。不,我们无法从 double 中取回 1/10,就像我们无法从 0.3333333333 中取回 1/3.... any 有限数量的 3。
  • 不能使用双精度或浮点数。您可以编写一个以 BCD 格式存储的自定义 CDouble 类。
  • @n.m 试试 "std::cout.precision(20); std::cout
  • @zell 我知道它会打印什么。您可以将可见宇宙的直径打印为 13008226600000000000 毫米。这样做有什么意义?您打印的是数据实际具有的精度,而不是硬件可以表示的任何精度。
  • 机器数只能精确地表示数学数的有限子集。对于大多数硬件实现,0.1 不在此子集中。如果您需要某种精确的数学数字,例如有理数或小数分数(即分母为 10^n 的有理数),您必须使用为此类数据设计的类。

标签: c++ string type-conversion precision arbitrary-precision


【解决方案1】:

假设在赋值过程中,十进制数 0.1 被舍入为不等于十进制数 0.1 的双精度值 X。现在,假设值X 中的一些其他计算结果,但没有四舍五入。为了区分这两者,您必须将原点存储在某处。为此,double 中根本没有位置(假设常见实现),因此您的问题的答案是“否”。

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 2021-12-04
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多