将完整精度double输出到文本文件的最佳方法

fbl*_*fbl 19 c++ string file-io file-format character-encoding

我需要使用现有的文本文件来存储一些非常精确的值.读回时,数字基本上必须与最初写入的数字完全相同.现在,正常人会使用二进制文件......出于多种原因,在这种情况下这是不可能的.

所以......你们中的任何人都有一种很好的方法可以将double编码为一串字符(除了提高精度).我的第一个想法是将双重转换为char []并写出字符.我不认为这会起作用,因为有些角色不可见,产生声音,甚至终止字符串('\ 0'......我正在和你说话!)

思考?

[编辑] - 一旦我弄清楚哪个解决方案最适合我,我会将其标记为"解决方案".

fuz*_*Tew 16

如果你想保持格式完全是人类可读的,你可以这样写出双重:

#include <iomanip>
#include <sstream>

std::string doubleToText(const double & d)
{
    std::stringstream ss;
    //ss << std::setprecision( std::numeric_limits<double>::digits10+2);
    ss << std::setprecision( std::numeric_limits<int>::max() );
    ss << d;
    return ss.str();
}
Run Code Online (Sandbox Code Playgroud)

std::numeric_limits<int>::max()将以最大可能的小数精度输出.这将在不同的浮点实现中最精确地保留值.使用注释行交换该行将std::numeric_limits<double>::digits10+2提供足够的精度,使得在编译代码的平台上可以精确地恢复double.这样可以提供更短的输出并保留尽可能多的信息,就像double可以唯一表示的那样.

在读取字符串时,C++流操作符不保留非规范化数字或无穷大而不是数字.但是,POSIX strtod函数确实存在,并且由标准定义.因此,使用标准库调用读回十进制数的最精确方法是此函数:

#include <stdlib.h>

double textToDouble(const std::string & str)
{
    return strtod( str.c_str(), NULL );
}
Run Code Online (Sandbox Code Playgroud)

  • `std :: numeric_limits <double> :: max_digits10`比`std :: numeric_limits <double> :: digits10 + 2更标准. (3认同)

dan*_*n04 9

假设IEEE 754加倍,printf("%.17g\n", x)将为您提供足够的数字来重新创建原始值.


vds*_*dsf 0

尝试这个:

double d = 0.2512958125912;
std::ostringstream s;
s << d;
Run Code Online (Sandbox Code Playgroud)

然后将 s 写入文件。