精确的浮点< - >字符串转换

Nei*_*ell 12 c++

我正在寻找一个库函数来将浮点数转换为字符串,然后再用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
Run Code Online (Sandbox Code Playgroud)

我已经尝试过std :: ostringstream,如果我使用stream.precision(16),它似乎适用于大多数值.但是,在精度为15或17时,它会截断或给出像1.34这样的东西的丑陋输出.我不认为精度16可以保证具有我需要的任何特定属性,并且怀疑它会因许多数字而分解.

有没有一个C++库有这样的转换?或者这样的转换函数已经埋在标准库/ boost中的某个地方.

想要这些功能的原因是将浮点值保存到CSV文件,然后正确读取它们.另外,我希望CSV文件尽可能包含简单数字,以便人们可以使用它们.

我知道Haskell读/显示函数已经具有我追求的属性,BSD C库也是如此.字符串< - >双转换的标准参考是来自PLDI 1990的一对论文:

  • 如何准确地读取浮点数,Will Klinger
  • 如何准确地打印浮点数,Guy Steele等

任何基于这些的C++库/函数都是合适的.

编辑:我完全清楚浮点数是十进制数的不精确表示,并且1.34 == 1.3400000000000001.但是,正如上面提到的论文指出的那样,选择显示为"1.3400000000000001"并不是理由.

编辑2:本文正是解释了我正在寻找的内容:http://drj11.wordpress.com/2007/07/03/python-poor-printing-of-floating-point/

Nei*_*ell 5

我仍然无法找到提供必要代码的库,但我确实找到了一些有效的代码:

http://svn.python.org/view/python/branches/py3k/Python/dtoa.c?view=markup

通过提供相当少量的定义,很容易抽象出 Python 集成。这段代码确实符合我概述的所有属性。


小智 1

您需要一个不会丢失信息的 num2str() 函数。如果两个浮点数不同,它们的字符串表示也必须不同,并且必须可以从字符串中恢复原始二进制数。该属性首先由 Guy Steel 和 Jon White 在 1990 年的《如何准确打印浮点数》中定义。此外,字符串应尽可能短。

截至 2023 年,num2str() 最快的算法是DragonBox。该存储库包含 C++ 参考实现以及正式论文。另一个实现可以在https://github.com/abolz/Drachennest中找到。

stdlib.h 中的 strtod() 可用于 str2num()。