从赋值给双变量后检索字符串“0.1”
Posted
技术标签:
【中文标题】从赋值给双变量后检索字符串“0.1”【英文标题】:Retrieve the string “0.1” from after assignment to a double variable 【发布时间】: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 的有理数),您必须使用为此类数据设计的类。
【参考方案1】:
假设在赋值过程中,十进制数 0.1 被舍入为不等于十进制数 0.1 的双精度值 X
。现在,假设值X
中的一些其他计算结果,但没有四舍五入。为了区分这两者,您必须将原点存储在某处。为此,double 中根本没有位置(假设常见实现),因此您的问题的答案是“否”。
【讨论】:
以上是关于从赋值给双变量后检索字符串“0.1”的主要内容,如果未能解决你的问题,请参考以下文章
关于 国产麒麟系统赋值给双精度double时乘以1.0f编译器优化 的解决方法