c++:在文件中写入双精度值,精度高于默认值

C++ : Writing doubles in a file with more precision than default

本文关键字:精度高 默认值 双精度 文件 c++      更新时间:2023-10-16

我想写双精度到一个文件,但字符串强制转换降低了精度。编辑:我不真正强制转换,但把双精度在ostringstream。

是否有另一种方法比解析每个数字使用模和除法写精度更高的双精度?

编辑:我的应用程序需要是便携式的

下面是我当前的代码:

std::string arraytocsv(double v[], int size) {  
    std::ostringstream oss;
    for (int i = 0; i < size; i++) {
        oss << v[i] << ";";
    }
    oss << std::endl;
    return oss.str();
}

我已经有了precision()函数,它工作了。由于

可以使用精度函数

在声明字符串流之后改变它的行为:

std::ostringstream oss;
oss.flags (std::ios::scientific);
oss.precision (std::numeric_limits<double>::digits10 + 1);

第一个调用oss.flags(),强制c++ I/O在这个字符串流上使用科学记数法,即使是像pi这样的数字。

用固定记数法打印小于1.0的数字会失去精度,而用固定记数法打印较大的数字则是极度多余的。

第二个调用,oss.precision()告诉c++ I/O在小数点后打印多少位数字。使用digits10+1告诉它打印一个多余的数字;digits10表示系统能够在不损失精度的情况下表示多少位数字。

您将需要#include,因为std::numeric_limits<double>::digits10

用二进制写。默认情况下,这是不可移植的(因为序列化格式依赖于体系结构)

不是

double myvalue = 123.4;
file << myvalue;

double myvalue = 123.4;
file.write((const char*) &myvalue, sizeof(myvalue));

当然,这假设您不需要人类阅读这篇文章(尽管,使用UNIX工具,如od,他们可能需要)

如果您只在一个系统上工作,您可以将实际的二进制数据写入文件,这将为您提供一个精确的副本。如果要写入文本文件,请将二进制文件转换为Base64或类似的格式。

std::ofstream myfile("file.bin");
double x;
myfile.write(reinterpret_cast<char*>(&x), sizeof(x));
// later
std::ifstream yourfile("file.bin");
double x;
myfile.read(reinterpret_cast<char*>(&x), sizeof(x));

可选,将字节流编码为base64。如果您希望存储长双精度类型,并且您打算使用base64编码,请注意长双精度类型通常只有10个字节,因此您可以忽略在序列化时通常会得到的填充。

如果您计划在不同的平台之间交换数据,但所有平台都使用IEEE浮点数,那么您可能应该更加小心并记录文件格式的端序。在这种情况下,使用base64编码编写ASCII字符串将更具可移植性。要在而不是都使用相同二进制浮点数表示的平台之间交换数据,您必须更加努力…