【发布时间】:2009-08-21 10:45:28
【问题描述】:
我正在寻找一个库函数来在 C++ 中将浮点数转换为字符串,然后再转换回来。我想要的属性是 str2num(num2str(x)) == x 和 num2str(str2num(x)) == x (尽可能)。一般属性是 num2str 应该表示最简单的有理数,当四舍五入到最接近的可表示浮点数时,它会返回原始数字。
到目前为止,我已经尝试过 boost::lexical_cast:
double d = 1.34;
string_t s = boost::lexical_cast<string_t>(d);
printf("%s\n", s.c_str());
// outputs 1.3400000000000001
我已经尝试过 std::ostringstream,如果我执行 stream.precision(16),这似乎适用于大多数值。但是,在精度为 15 或 17 时,它会截断或给出难看的输出,例如 1.34。我不认为精度 16 可以保证具有我需要的任何特定属性,并且怀疑它会分解许多数字。
是否有具有这种转换的 C++ 库?或者这样的转换函数是否已经埋在标准库/boost的某个地方。
需要这些函数的原因是将浮点值保存到 CSV 文件中,然后正确读取它们。此外,我希望 CSV 文件尽可能包含简单的数字,以便人类使用。
我知道 Haskell 读取/显示函数已经具有我所追求的属性,BSD C 库也是如此。 stringdouble 转换的标准参考是 PLDI 1990 的一对论文:
- 如何准确读取浮点数,Will Klinger
- Guy Steele 等人如何准确打印浮点数
任何基于这些的 C++ 库/函数都是合适的。
编辑:我完全知道浮点数是十进制数的不精确表示,并且 1.34==1.3400000000000001。但是,正如上面引用的论文指出的那样,这不是选择显示为“1.3400000000000001”的借口
EDIT2:本文准确解释了我正在寻找的内容:http://drj11.wordpress.com/2007/07/03/python-poor-printing-of-floating-point/
【问题讨论】:
-
当我搜索一个时,我在 C 中找到了一个,而不是在 C++ 中。我这里没有链接。我记得好像是在 NAG 的 ftp 网站上,但我可能是错的。
-
C 库也同样适用 - 我现在只是在查看 NAG 文档。
-
您可以研究 GMP 和 MPFR 以进行软件浮点仿真。但是对于 C++ 的
float和double类型,您所要求的几乎是不可能的。
标签: c++