【发布时间】: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