从赋值给双变量后检索字符串“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编译器优化 的解决方法

Java_常见的数据类型以及变量的声明与赋值

VBA中字符变量双引号如何去除?我的变量赋值使用时因为是字符变量自带了双引号导致赋值后无法识别

C语言 变量 被赋值后如何转化成 常量???

从字符串赋值给变量

读取文本文件时,Python可以从字符串中删除双引号吗?